
セマフォとミューテックスの基本的な違いは、セマフォはシグナリングメカニズムであるということです。すなわち、プロセスはリソースを獲得しているか解放しているかを示すためにwait()およびsignal()オペレーションを実行します。リソースを取得したい場合はミューテックスオブジェクト。 セマフォとミューテックスの間にはさらにいくつかの違いがあります。以下に示す比較チャートを使用してそれらについて説明しましょう。
比較表
比較基準 | セマフォ | ミューテックス |
---|---|---|
基本 | セマフォはシグナリングメカニズムです。 | ミューテックスはロック機構です。 |
存在 | セマフォは整数変数です。 | ミューテックスはオブジェクトです。 |
関数 | セマフォでは、複数のプログラムスレッドが有限のリソースインスタンスにアクセスできます。 | ミューテックスでは、複数のプログラムスレッドが単一のリソースにアクセスできますが、同時にはアクセスできません。 |
所有権 | セマフォ値は、リソースを獲得または解放するプロセスによって変更できます。 | ミューテックスオブジェクトロックは、ロックを取得したプロセスによってのみ解放されます。 |
分類する | セマフォは、カウントセマフォとバイナリセマフォに分類できます。 | ミューテックスはこれ以上分類されていません。 |
操作 | セマフォ値は、wait()およびsignal()操作を使用して変更されます。 | ミューテックスオブジェクトは、リソースを要求または解放するプロセスによってロックまたはロック解除されます。 |
占有リソース | すべてのリソースが使用されている場合、リソースを要求しているプロセスはwait()操作を実行し、セマフォカウントが1より大きくなるまで自分自身をブロックします。 | ミューテックスオブジェクトがすでにロックされている場合、リソースを要求しているプロセスは、ロックが解放されるまで待機し、システムによってキューに入れられます。 |
セマフォの定義
セマフォはプロセス同期ツールです。 セマフォは通常、システム内に存在するリソースの数に初期化される整数変数 Sであり、セマフォの値は初期化とは別にwait()とsignal()の 2つの関数によってのみ変更できます。
wait()およびsignal()操作は、セマフォの値を不可分に修正します。 つまり、プロセスがセマフォの値を変更しているとき、他のプロセスがそのセマフォの値を同時に変更することはできません。 セマフォは、 カウンティングセマフォとバイナリセマフォという 2つのカテゴリでオペレーティングシステムによって区別されます。
Counting Semaphoreでは、セマフォSの値はシステムに存在するリソースの数 sに初期化されます。 プロセスがリソースにアクセスしようとするときはいつでも、セマフォに対してwait()操作を実行し、セマフォの値を1つ減らします 。 リソースを解放すると、セマフォに対してsignal()操作を実行し、セマフォの値を1つ増やします。 セマフォカウントが0になると、すべてのリソースがプロセスによって占有されていることを意味します。 セマフォカウントが0のときにプロセスがリソースを使用する必要がある場合は、wait()を実行し、セマフォの値が0より大きくなるまでブロックされます。
バイナリセマフォでは、セマフォの値は0から1の範囲です。 これはミューテックスロックに似ていますが、ミューテックスはロックメカニズムですが、セマフォはシグナリングメカニズムです。 バイナリセマフォでは、プロセスがリソースにアクセスしたい場合、セマフォに対してwait()操作を実行し、セマフォの値を1から0に減らします。リソースを解放すると、セマフォに対してsignal()操作を実行して増分します。セマフォの値が0で、プロセスがリソースにアクセスしたい場合、 wait()操作を実行し、リソースを利用している現在のプロセスがリソースを解放するまでブロックします。
ミューテックスの定義
相互排除オブジェクトは、まもなくミューテックスと呼ばれます。 相互排除という用語から、一度に1つのプロセスだけが特定のリソースにアクセスできることを理解できます。 ミューテックスオブジェクトを使用すると、複数のプログラムスレッドが同じリソースを使用できますが、同時に1つずつ使用することはできません。
プログラムが起動すると、システムは特定のリソースに対してミューテックスオブジェクトを作成するように要求します。 システムは、固有の名前またはIDを持つミューテックスオブジェクトを作成します。 プログラムスレッドがミューテックスオブジェクトに対するロックを占有しているリソースを使用したいときはいつでも、リソースを利用し、そして使用後にミューテックスオブジェクトに対するロックを解除する。 その後、次のプロセスはミューテックスオブジェクトのロックを取得することが許可されます。
その間、プロセスはmutexオブジェクトのロックを獲得しましたが、他のスレッド/プロセスはそのリソースにアクセスできません。 ミューテックスオブジェクトがすでにロックされている場合、ミューテックスオブジェクトのロックを取得しようとするプロセスは待機しなければならず、ミューテックスオブジェクトがロック解除されるまでシステムによって待ち行列に入れられる。
セマフォとミューテックスの主な違い
- セマフォは、セマフォ変数に対して実行されるwait()およびsignal()操作が、プロセスがリソースを獲得しているのか、またはリソースを解放しているのかを示すシグナリングメカニズムです。 一方、ミューテックスはロックメカニズムであり、リソースを獲得するために、プロセスはミューテックスオブジェクトをロックする必要があり、リソースプロセスを解放している間はミューテックスオブジェクトをロック解除する必要があります。
- セマフォは通常整数変数ですが、ミューテックスはオブジェクトです。
- セマフォは、複数のプログラムスレッドがリソースの有限インスタンスにアクセスすることを可能にします。 一方、Mutexでは、複数のプログラムスレッドが一度に1つずつ、 単一の共有リソースにアクセスできます。
- セマフォ変数値は、wait()およびsignal()操作を実行することによってリソースを獲得または解放する任意のプロセスによって変更できます。 一方、ミューテックスオブジェクトに対して獲得したロックは、ミューテックスオブジェクトに対するロックを獲得したプロセスによってのみ解放されます。
- セマフォは、ミューテックスと非常によく似た2つのタイプのセマフォとバイナリセマフォを数えます。
- セマフォ変数の値は、初期化とは別にwait()およびsignal()操作によって変更されます。 ただし、ミュートオブジェクトは、リソースを取得または解放するプロセスによってロックまたはロック解除されます。
- すべてのリソースがプロセスによって獲得され、空きリソースがない場合、リソースを獲得することを望むプロセスは、セマフォ変数に対してwait()操作を実行し、セマフォの数が0より大きくなるまで自分自身をブロックします。ロックされていると、リソースを取得しようとしているプロセスは待機し、リソースが解放されてミューテックスオブジェクトがロック解除されるまでシステムによってキューに入れられます。
結論:
セマフォは、利用可能なリソースのインスタンスが複数ある場合に適しています。 単一の共有リソースの場合は、ミューテックスがより良い選択です。