Mutex vs Semaphore
オペレーティングシステムの用語によると、mutexとセマフォは同期サービスを提供するカーネルリソースであり、同期プリミティブとも呼ばれます。 プロセス同期は、共有データの一貫性を維持する上で重要な役割を果たします。 ソフトウェアとハードウェアの両方のソリューションは、重要なセクションの問題を処理するために存在しています。 しかし、重要なセクションの問題のためのハードウェアソリューションは、実装することは非常に困難です。 ミューテックスとセマフォはどちらも同期サービスを提供しますが、同じではありません。
ミューテックスとは何ですか?
Mutexは、リソースへのアクセスを同期する相互排他オブジェクトです。 これは、プログラムの開始時に一意の名前で作成されます。 ミューテックスロック機構は、一つのスレッドだけがミューテックスを取得し、クリティカルセクションに入ることができるようにします。 このスレッドは、重大なセクションで終了したときにのみミューテックスを解放します。
これは、共有リソースへのアクセスを制御するために使用されるバイナリセマフォの特別なタイプです。 これには、拡張された優先度反転の問題を回避するための優先度継承メカニズムが含まれています。 これにより、現在の優先度の高いタスクを可能な限り短い時間ブロック状態に保つことができます。 ただし、優先度の継承は優先度の反転を修正するのではなく、その効果を最小限に抑えるだけです。
例
これは、次の例の助けを借りて示されています。
ミューテックスの使用
ミューテックスは、キー(ミューテックス)を持ち、作業を進めることができるプロデューサーまたはコンシューマーの相互排除を提供します。 プロデューサーがバッファを埋めている限り、ユーザーは待機する必要があり、その逆もあります。 ミューテックスロックでは、常に、単一のスレッドだけがバッファ全体で動作することができます。
プログラムが起動すると、指定されたリソースに対してmutexオブジェクトの作成をシステムに要求します。 一意の名前またはIDを持つmutexオブジェクトが作成されます。 プログラム-スレッドがリソースを使用したいときはいつでも、mutexオブジェクトのロックを占有し、リソースを利用し、使用後にmutexオブジェクトのロックを 次に、次のプロセスがmutexオブジェクトのロックを取得することが許可されます。
一方、プロセスはmutexオブジェクトのロックを取得しており、他のスレッドやプロセスはそのリソースにアクセスできません。 Mutexオブジェクトが既にロックされている場合、mutexオブジェクトのロックを取得しようとしているプロセスは、mutexオブジェクトがロック解除される
ミューテックスの利点
ミューテックスの利点は次のとおりです。:
- Mutexは、その重要なセクションに入り、それを解放する前に取得された単純なロックです。
- 任意の時点で一つのスレッドだけがその重要なセクションにあるので、競合状態はなく、データは常に一貫したままです。
ミューテックスの欠点
ミューテックスには、次のような欠点もあります:
- スレッドがロックを取得してスリープ状態になるか、またはプリエンプトされた場合、他のスレッドは前進しない可能性があります。 これは飢餓につながる可能性があります。
- それはそれを取得したものとは異なるコンテキストからロックまたはロック解除することはできません。
- クリティカルセクションには、一度に一つのスレッドだけを許可する必要があります。
- 通常の実装では、BUSY waiting状態になり、CPU時間が無駄になる可能性があります。
セマフォとは何ですか?
セマフォは、単に負ではなくスレッド間で共有される変数です。 セマフォはシグナリングメカニズムであり、別のスレッドはセマフォで待機しているスレッドにシグナルを送ることができます。
セマフォは二つのアトミック演算
1を使用します。 Wait:wait操作は、引数Sの値が正の場合、その値を減少させます。 Sが負またはゼロの場合、操作は実行されません。
2. プロセス同期のためのシグナル:シグナル操作は、その引数Sの値をインクリメントします。
セマフォは、リソースの設定方法に応じて、リソースへのアクセ
セマフォの使用
単一のバッファの場合、4KBのバッファを1KBの四つのバッファに分離することができます。 セマフォはこれら四つのバッファに関連付けることができ、ユーザとプロデューサは同時に異なるバッファで作業することができます。
セマフォの種類
セマフォは、セマフォとバイナリセマフォを数える二つのカテゴリでオペレーティングシステムによって区別されます。
1. セマフォのカウント:セマフォの値は、システム内に存在するリソースの数に初期化されます。 プロセスがリソースにアクセスしたいときはいつでも、セマフォに対してwait()操作を実行し、セマフォの値を一つずつデクリメントします。 リソースを解放すると、セマフォに対してsignal()操作を実行し、セマフォの値を一つずつインクリメントします。
セマフォ数が0になると、プロセスはすべてのリソースを占有していることを意味します。 セマフォ数が0の場合、プロセスはリソースを使用する必要があります。 Wait()操作を実行し、セマフォ値が0より大きくなるまでブロックされます。
2. バイナリセマフォ:セマフォの値の範囲は0と1の間です。 これはmutexロックに似ていますが、mutexはロック機構であり、セマフォはシグナル伝達機構です。 バイナリセマフォでは、プロセスがリソースにアクセスしたい場合、セマフォに対してwait()操作を実行し、セマフォの値を1から0にデクリメントします。 リソースを解放すると、セマフォに対してsignal()操作を実行し、その値を1にインクリメントします。 セマフォの値が0で、プロセスがリソースにアクセスしようとしているとします。 その場合、wait()操作を実行し、リソースを利用している現在のプロセスがリソースを解放するまで自分自身をブロックします。
セマフォの利点
ここでは、次のようなセマフォの利点があります:
- これにより、複数のスレッドが重要なセクションにアクセスできます。
- セマフォはマシンに依存しません。
- セマフォは、マイクロカーネルのマシンに依存しないコードで実装されています。
- 複数のプロセスがクリティカルセクションに入ることはできません。
- セマフォではビジーで待機しているため、プロセス時間とリソースの無駄はありません。
- これらはマシンに依存しないため、マイクロカーネルのマシンに依存しないコードで実行する必要があります。
- リソースの柔軟な管理を可能にします。
セマフォの欠点
セマフォにも次のような欠点があります:
- セマフォの最大の制限の1つは、優先度の反転です。
- オペレーティングシステムは、セマフォを待機して信号を送るためのすべての呼び出しを追跡する必要があります。
- それらの使用は強制されることはありませんが、それは慣例によるものです。
- セマフォのデッドロックを回避するには、待機操作とシグナル操作を正しい順序で実行する必要があります。
- セマフォプログラミングは複雑な方法であるため、相互排除を達成しない可能性があります。
- また、モジュール性の喪失につながるため、大規模な使用には実用的な方法ではありません。
- セマフォはプログラマエラー
- になりやすく、プログラマエラーによるデッドロックや相互排他違反の原因となる可能性があります。
ミューテックスとセマフォの違い
セマフォとミューテックスの基本的な違いは、セマフォがシグナル伝達メカニズムであること、すなわちプロセスがリソースを取得しているか解放しているかを示すためにwait()とsignal()操作を実行することである。 対照的に、ミューテックスはロック機構であり、プロセスがリソースを取得する場合は、ミューテックスオブジェクトのロックを取得する必要があります。 セマフォとmutexの違いは次のようになります:
用語 | ミューテックス | セマフォ |
---|---|---|
定義 | ミューテックスはロック機構であり、リソースを取得するにはプロセスがミューテックスオブジェクトをロックする必要があり、リソースを解放するにはプロセスがミューテックスオブジェクトをロック解除する必要がある。 | セマフォは、セマフォ変数に対して実行されるwait()およびsignal()操作が、プロセスがリソースを取得しているか解放しているかを示すため、シグナリングメカ |
存在 | ミューテックスはオブジェクトです。 | セマフォは整数変数です。 |
Function | Mutexでは、複数のプログラムスレッドが単一のリソースにアクセスできますが、同時にはアクセスできません。 | セマフォは、複数のプログラムスレッドがリソースの有限インスタンスにアクセスできるようにします。 |
所有権 | ミューテックスオブジェクトのロックは、ミューテックスオブジェクトのロックを取得したプロセスによってのみ解放されます。 | セマフォ値は、wait()およびsignal()操作を実行することにより、リソースを取得または解放する任意のプロセスによって変更できます。 |
Categorize | Mutexはそれ以上分類されません。 | セマフォは、カウントセマフォとバイナリセマフォに分類することができる。 |
操作 | mutexオブジェクトは、リソースを要求または解放するプロセスによってロックまたはロック解除されます。 | セマフォ値は、初期化とは別にwait()とsignal()操作を使用して変更されます。 |
リソース占有 | ミューテックスオブジェクトがすでにロックされている場合、リソースの取得を希望するプロセスは、リソースが解放され、ミューテックスオブジェク | プロセスがすべてのリソースを取得し、空きリソースがないとします。 その場合、リソースの取得を希望するプロセスは、セマフォ変数に対してwait()操作を実行し、セマフォのカウントが0より大きくなるまで自分自身をブロックします。 |
Leave a Reply