ミューテックス対 Semaphore – それらの違い
ミューテックスとの主な違い Semaphore
- ミューテックスはロック機構ですが、 Semaphore シグナル伝達機構である
- ミューテックスは単なるオブジェクトですが、 Semaphore 整数です
- ミューテックスにはサブタイプがありませんが、セマフォにはカウンティング セマフォとバイナリ セマフォの 2 つのタイプがあります。
- Semaphore 待機およびシグナル操作の変更をサポートしますが、Mutex はリソースを要求または解放するプロセスによってのみ変更されます。
- Semaphore 値は wait() および signal() 操作を使用して変更されますが、一方で Mutex 操作はロックまたはロック解除されます。

ここでは、Mutexとの違いを分析しました。 Semaphore メリット・デメリットを総合的に評価していきます。
ミューテックスに関する一般的な事実と Semaphore
私の経験から、Mutexと Semaphore:
- ミューテックスを取得できるタスクは 1 つだけです。したがって、ミューテックスには所有権があり、所有者だけがミューテックスを解放できます。
- ミューテックスとセマフォを使用する理由は異なりますが、おそらく実装の類似性のため、ミューテックスはバイナリ セマフォと呼ばれます。
- よく知られている誤解の一つは、ミューテックスと Semaphoreはほぼ同じですが、唯一の違いは、Mutexは1までカウントできるのに対し、 Semaphore0からNまで数えることができます。
- バイナリ セマフォとミューテックスの間には常に不確実性があります。 ミューテックスはバイナリ セマフォであると聞くかもしれませんが、これは正しくありません。
何が Semaphore?
セマフォ セマフォは単に負でない変数であり、スレッド間で共有されます。セマフォはシグナル機構であり、セマフォを待っているスレッドは別のスレッドからシグナルを受け取ることができます。セマフォは1つのアトミック操作、2) wait と XNUMX) signal を使用します。 プロセス同期.
A セマフォ リソースへのアクセスを許可または禁止します。これは、リソースの設定方法に応じて異なります。
活用 Semaphore
単一バッファの場合、4 KB バッファを 1 つの XNUMX KB バッファに分割できます。 Semaphore これら 4 つのバッファーに関連付けることができます。これにより、ユーザーとプロデューサーは同時に異なるバッファーで作業できます。
のメリット Semaphore
私の実践では、セマフォを使用する主な利点は次のとおりです。
- 複数のスレッドがクリティカル セクションにアクセスできるようにします。
- Semaphoreはマシンに依存しません。
- Semaphoreは、マイクロカーネルのマシンに依存しないコードで実装されています。
- 複数のプロセスがクリティカル セクションに入ることができません。
- セマフォには忙しい待機スケジュールがあるため、処理時間とリソースが無駄になることはありません。
- これらはマシンに依存しないため、マイクロカーネルのマシンに依存しないコードで実行する必要があります。
- これにより、リソースを柔軟に管理できます。
の短所 Semaphores
私が遭遇したセマフォの欠点は次のとおりです。
- セマフォの最大の制限の XNUMX つは優先順位の反転です。
- オペレーティング システムは、待機およびシグナル セマフォへのすべての呼び出しを追跡する必要があります。
- それらの使用は決して強制されるものではなく、単に慣例によるものです。
- セマフォのデッドロックを回避するために、Waitと Signal 操作は正しい順序で実行する必要があります。
- Semaphore プログラミングは複雑な方法なので、排他制御が実現できない可能性があります。
- また、使用するとモジュール性が失われるため、大規模な使用には現実的な方法ではありません。
- Semaphore プログラマーのエラーが発生しやすくなります。
- 原因となる可能性があります デッドロック またはプログラマーのエラーによる相互排他違反。
ミューテックスとは?
Mutex の完全な形式は相互排除オブジェクトです。 これは、共有リソースへのアクセスを制御するために使用される特別なタイプのバイナリ セマフォです。 これには、拡張優先度逆転の問題を回避するための優先度継承メカニズムが含まれています。 これにより、現在優先度の高いタスクを可能な限り短時間ブロック状態に保つことができます。 ただし、優先順位の継承は優先順位の逆転を修正するものではなく、その影響を最小限に抑えるだけです。
ミューテックスの使用
ミューテックスは相互排他性を提供します。プロデューサーまたはコンシューマーは、キー (ミューテックス) を持ち、作業を続行できます。プロデューサーがバッファを埋めている間、ユーザーは待機する必要があり、その逆も同様です。ミューテックス ロックでは、常に 1 つのスレッドのみがバッファ全体を操作できます。
ミューテックスの利点
私が観察したことから、Mutex の主な利点は次のとおりです。
- ミューテックスは、クリティカル セクションに入って解放する前に取得される単なる単純なロックです。
- 常に XNUMX つのスレッドだけがクリティカル セクションにあるため、競合状態は発生せず、データは常に一貫性を保ちます。
ミューテックスのデメリット
私は実践の中で、Mutex のいくつかの短所を特定しました。
- スレッドがロックを取得してスリープ状態になるか、プリエンプトされると、他のスレッドは先に進むことができなくなる可能性があります。 これは飢餓につながる可能性があります。
- 取得したコンテキストとは異なるコンテキストからロックまたはロック解除することはできません。
- クリティカル セクションでは一度に XNUMX つのスレッドのみを許可する必要があります。
- 通常の実装では、ビジー待機状態が発生し、CPU 時間が無駄になる可能性があります。
との差 Semaphore およびミューテックス
私が彼らと仕事をして学んだことに基づいて、ミューテックスと Semaphore異なります:
技術パラメータ | Semaphore | ミューテックス |
---|---|---|
メカニズム | これは信号伝達メカニズムの一種です。 | ロック機構です。 |
Data Type | Semaphore 整数変数です。 | ミューテックスは単なるオブジェクトです。 |
修正 | 待機およびシグナル操作によりセマフォを変更できます。 | これは、リソースを要求または解放するプロセスによってのみ変更されます。 |
資源管理 | 空きリソースがない場合、プロセスは待機操作を実行するリソースを必要とします。セマフォのカウントが 0 より大きくなるまで待機する必要があります。 | ロックされている場合、プロセスは待機する必要があります。 プロセスはキューに入れておく必要があります。 これには、ミューテックスがロック解除されている場合にのみアクセスする必要があります。 |
スレッド | 複数のプログラム スレッドを持つことができます。 | 複数のプログラム スレッドを mutex で実行することはできますが、同時に実行することはできません。 |
所有権 | 値は、リソースを解放または取得するプロセスによって変更できます。 | オブジェクトのロックは、そのロックを取得したプロセスによってのみ解放されます。 |
種類 | の種類 Semaphore カウントセマフォとバイナリセマフォです。 | ミューテックスにはサブタイプがありません。 |
Opera生産 | Semaphore 値は wait() および signal() 操作を使用して変更されます。 | ミューテックス オブジェクトがロックまたはロック解除されています。 |
リソース占有率 | すべてのリソースが使用されており、リソースを要求しているプロセスが wait() 操作を実行し、セマフォ数が 1 を超えるまで自身をブロックする場合は、セマフォが占有されます。 | オブジェクトがすでにロックされている場合、リソースを要求しているプロセスは待機し、ロックが解放される前にシステムによってキューに入れられます。 |
まとめ:
私の経験では、ミューテックスとセマフォのどちらを選択するかを決める鍵は、それぞれの操作上の微妙な違いを認識することです。 Semaphoreは複雑な同期に最適ですが、ミューテックスは単純な相互排他制御に適しており、より単純なコンテキストでリソースの安全性を確保します。