1. 序章

社会として、私たちは一緒に暮らすための多くの慣習を守る必要があります。 さらに、特定の規則が世界中に広まっています。 たとえば、赤信号は、一般的にドライバーが停止して待機することを示す信号機です。 それどころか、緑色のライトは、ドライバーが道路に出られることを示します。 これらの慣習を通じて、社会は組織化され続け、多くの問題を回避します。

同様に、コンピュータシステムは、実行中に予期しないエラーや壊滅的な問題を回避するためのメカニズムを作成する必要があります。 このようなメカニズムの一例は、セマフォ変数です。 これらの変数は、コンピューターシステムで使用可能な特定のリソースへのスレッドおよびプロセスのアクセスを管理します。 これらのセマフォには、バイナリとカウントの2つの主要なカテゴリがあります。

このチュートリアルでは、バイナリセマフォとカウントセマフォがどのように動作するかを理解します。 最初に、セマフォの簡単なレビューを行い、それらの一般的な特性について記憶を更新します。特に、バイナリセマフォとカウントセマフォの両方のカテゴリを分析します。 最後に、これらのセマフォカテゴリを体系的な要約で比較します。

2. セマフォ変数

一般に、セマフォ変数は、リソースへのプロセスまたはスレッドのアクセスを制御するために使用されるメカニズムです。 正確には、これらの変数は、並行システムの共有リソースへのアクセスを同期することを目的としています。 そのために、保護された共有リソースにアクセスするプログラムには、共通のセマフォ変数があります。

次に、プログラムは、保護されたリソース(クリティカルセクション)を操作するコードの部分を実行する前にセマフォをチェックし、クリティカルコードセクションにすぐに入ることができるか、それを待つ必要があるかを問い合わせます。

技術的な観点では、セマフォは、さまざまなプロセスやスレッド間で共有される整数値で構成されます。 セマフォの正の値は、特定のクリティカルセクションで使用可能なアクセスユニットの数を示します。 それ以外の場合、負の値(またはゼロ)はクリティカルセクションにアクセスできないことを表します。 さらに、2つのセマフォ操作があります。

  • 待つ(P):セマフォの整数値を1つ減らす操作。 整数値が負になると、セマフォは待機操作を実行したエンティティをブロックし、それをセマフォキューに追加します。 そうでない場合、エンティティはアクセスユニットを受け取り、クリティカルセクションに入ることができます
  • 信号(V):セマフォの整数値を1つインクリメントする操作。 したがって、シグナリングの前に整数値が負の場合、アクセスユニットはセマフォのキューの最初のエンティティに与えられます。 それどころか、取得されたアクセスユニットはセマフォで利用可能であり続けます

一般的なシナリオでは、プロセスまたはスレッドは、クリティカルセクションへのアクセスを要求する単一の待機操作と、それを離れる単一のシグナル操作を実行します。 そうしないと、プロセスのフリーズやクラッシュなど、いくつかの問題が発生する可能性があります。

3. バイナリセマフォ

バイナリセマフォは、整数値が0から1の間で変化する同期メカニズムです。したがって、このカテゴリのセマフォは、クリティカルセクションへの単一のアクセスユニットを提供します。 これは、一度に1つのエンティティのみがクリティカルセクションにアクセスすることを意味します。

次の画像は、バイナリセマフォによって制御されるクリティカルセクションにアクセスするエンティティの一般的なプロセスのフローチャートを示しています。

バイナリセマフォは、クリティカルセクションへのアクセスを同期するだけでなく、それらに相互排除を提供します。 したがって、クリティカルセクションで競合状態が発生するのを防ぐことができます。

ただし、相互排除を提供するものの、それを強調することは重要です。 バイナリセマフォはミューテックスと同じではありません。 セマフォは、定義上、シグナリングメカニズムですが、ミューテックスはロックメカニズムです。

このように、ミューテックスは重要なコードセクションにアクセスするための相互排除を提供します。 次に、バイナリセマフォは、クリティカルセクションへのアクセスの同期に焦点を合わせます。 したがって、相互排除はミューテックスの主な目標です。 ただし、バイナリセマフォの場合、同期がどのように設計されているかによって異なります。

したがって、実際には、ミューテックスは、エンティティが存在する場合にのみクリティカルセクションをロックします。 ただし、セマフォを使用すると、エンティティがない場合でもクリティカルセクションにアクセスできなくなる可能性があります。 たとえば、エンティティが特定のクリティカルセクションにアクセスできるようにするために、外部の前提条件を満たさなければならない場合に発生します。

4. セマフォを数える

カウントセマフォは、値が [0、n] の範囲で変化する同期メカニズムです。ここで、 n 1より大きい非負の整数値です。 このように、セマフォをカウントすると、特定のクリティカルセクションへの複数のアクセストークンを使用できるようになります。 したがって、複数のエンティティが同時にクリティカルセクションにアクセスできます。

次の画像は、カウントセマフォによって制御されるクリティカルセクションにアクセスするエンティティの通常のプロセスを示すフローチャートを示しています。

バイナリセマフォとカウントセマフォが同様の操作を実行して、クリティカルセクションへのアクセスを同期していることがわかります。 主な違いは、セマフォをカウントすると範囲条件がチェックされることです(使用可能なアクセストークンがあるかどうか)。 次に、バイナリセマフォは、バイナリ条件をテストします(唯一のアクセストークンが使用可能かどうか)。

このように、バイナリセマフォまたはカウントセマフォで待機操作(P)を実行すると、同じ動作が発生します。エンティティは、アクセストークンを取得するまでキューで待機します。 ただし、値が1のバイナリセマフォで信号演算(V)を実行しても、その値は変更されません。 次に、カウントセマフォでは、同じ条件での信号操作により、セマフォ値が2に増加します。

5. 体系的な要約

セマフォには、バイナリとカウントの2つのカテゴリが存在することを調査しました。 どちらのカテゴリも整数値を使用して、クリティカルセクションへのアクセスを同期します。 さらに、両方のカテゴリの操作は同じです。待機とシグナルです。

バイナリセマフォとカウントセマフォの主な違いは、それらによって使用可能になるアクセスユニットの数です。 バイナリセマフォには単一のアクセスユニットがあります。 したがって、単一のエンティティがクリティカルセクションに一度にアクセスできるようになります(相互排除)。 次に、カウントセマフォには、異なるエンティティに同時に提供される複数のアクセスユニットがあります。

次の表は、バイナリセマフォとカウントセマフォの違いをまとめたものです。

6. 結論

この記事では、バイナリセマフォとカウントセマフォについて学習しました。 まず、簡単なレビューでセマフォの主な概念の概要を説明しました。 その後、セマフォの各カテゴリの特性を詳細に分析しました。バイナリとカウントです。 最後に、セマフォのカテゴリを比較し、それらの主な類似点と相違点を要約しました。

セマフォは、特定のクリティカルセクションにアクセスするエンティティを追跡および制御するための重要なメカニズムであると結論付けることができます。 さらに、信号メカニズムとして、エンティティが事前に待機操作(P)を実行せずに信号操作(V)を実行できるようにするため、これらは特に重要です。 このようにして、セマフォを使用して、いくつかの異種の処理シナリオを同期させることができます。