何ですか Semaphore? カウント、バイナリ型と例
⚡ スマートサマリー
Semaphore オペレーティングシステムにおいて、スレッド間で共有される非負の整数変数であり、待機とシグナルという2つのアトミック操作を通じて共有リソースへのアクセスを調整し、プロセス同期中の競合状態を防ぎます。

何ですか Semaphore?
Semaphore は単に負でない変数であり、スレッド間で共有されます。セマフォはシグナル機構であり、セマフォを待っているスレッドは別のスレッドからシグナルを受け取ることができます。セマフォは1つのアトミック操作、2) 待機、およびXNUMX) を使用します。 Signal プロセスの同期のため。
セマフォは、その設定方法に応じて、リソースへのアクセスを許可または禁止します。
の特徴 Semaphore
以下に、信号旗の特性を示します。
- タスクの同期を実現するために使用できるメカニズムです。
- これは低レベルの同期メカニズムです。
- Semaphore 常に負でない整数値を保持します。
- Semaphore テスト操作と割り込みを使用して実装できます。これらはファイル記述子を使用して実行する必要があります。
の種類 Semaphores
セマフォには大きく分けて2種類あります。
- セマフォのカウント
- バイナリセマフォ
集計 Semaphores
このタイプの Semaphore タスクの取得や解放を複数回行う際に役立つカウントを使用します。初期カウントが0の場合、カウントセマフォは利用不可状態で作成する必要があります。
ただし、カウントが 0 より大きい場合、セマフォは使用可能な状態で作成され、セマフォが持つトークンの数はそのカウントに等しくなります。
バイナリ Semaphores
バイナリセマフォはカウンティングセマフォとよく似ていますが、その値は0と1に制限されています。このタイプのセマフォでは、待機操作はセマフォが1の場合にのみ機能し、シグナル操作はセマフォが0のときに成功します。カウンティングセマフォよりも実装が容易です。
の例 Semaphore
下記のプログラムは、セマフォの使用と宣言を含む、段階的な実装例です。
Shared var mutex: semaphore = 1;
Process i
begin
.
.
P(mutex);
execute CS;
V(mutex);
.
.
End;
待って Signal Operaのイオン Semaphores
これらの操作は両方とも実装に使用されます プロセス同期このセマフォ操作の目的は、相互排他を実現することです。
を待つ Opera生産
このタイプのセマフォ操作は、タスクのクリティカル セクションへのエントリを制御するのに役立ちます。ただし、wait の値が正の場合、wait 引数 X の値は減分されます。負の値またはゼロの場合、操作は実行されません。これは P(S) 操作とも呼ばれます。
セマフォ値が減少して負になった後、コマンドは必要な条件が満たされるまで保留されます。
P(S)
{
while (S<=0);
S--;
}
Signal 操作
このタイプの Semaphore この操作は、クリティカル セクションからのタスクの終了を制御するために使用されます。この操作は、引数の値を 1 増加させるのに役立ちます。この値は V(S) として表されます。
P(S)
{
while (S>=0);
S++;
}
集計 Semaphore 対バイナリ Semaphore
ここでは、カウンティングとバイナリ セマフォの主な違いをいくつか示します。
| 集計 Semaphore | バイナリ Semaphore |
| 相互排除はありません | 相互排除 |
| 任意の整数値 | 値は0と1のみ |
| 複数のスロット | スロットはXNUMXつだけ |
| 一連のプロセスを提供する | 相互排他メカニズムを備えています。 |
との差 Semaphore ミューテックス
以下の表は、 ミューテックス付きセマフォ 複数のパラメータにわたって:
| 技術パラメータ | Semaphore | ミューテックス |
| メカニズム | これは信号伝達メカニズムの一種です。 | ロック機構です。 |
| Data Type | Semaphore 整数変数です。 | ミューテックスは単なるオブジェクトです。 |
| 修正 | 待機およびシグナル操作によりセマフォを変更できます。 | これは、リソースを要求または解放するプロセスによってのみ変更されます。 |
| 資源管理 | 空きリソースがない場合、プロセスは待機操作を実行するリソースを必要とします。セマフォのカウントが 0 より大きくなるまで待機する必要があります。 | ロックされている場合、プロセスは待機する必要があります。 プロセスはキューに入れておく必要があります。 これには、ミューテックスがロック解除されている場合にのみアクセスする必要があります。 |
| スレッド | 複数のプログラム スレッドを持つことができます。 | 複数のプログラム スレッドを mutex で実行することはできますが、同時に実行することはできません。 |
| 所有権 | 値は、リソースを解放または取得するプロセスによって変更できます。 | オブジェクトのロックは、そのロックを取得したプロセスによってのみ解放されます。 |
| 種類 | の種類 Semaphore カウントセマフォとバイナリセマフォです。 | ミューテックスにはサブタイプがありません。 |
| Opera生産 | Semaphore 値は wait() および signal() 操作を使用して変更されます。 | ミューテックス オブジェクトがロックまたはロック解除されています。 |
| リソース占有率 | すべてのリソースが使用されており、リソースを要求しているプロセスが wait() 操作を実行し、セマフォ数が 1 を超えるまで自身をブロックする場合は、セマフォが占有されます。 | オブジェクトがすでにロックされている場合、リソースを要求しているプロセスは待機し、ロックが解放される前にシステムによってキューに入れられます。 |
のメリット Semaphores
使用するメリット/利点は次のとおりです Semaphore:
- これにより、複数のスレッドがクリティカルセクションにアクセスできるようになります。
- Semaphoreはマシンに依存しません。
- Semaphoreは、マイクロカーネルのマシンに依存しないコードで実装されています。
- 複数のプロセスがクリティカル セクションに入ることができません。
- セマフォではビジー待機があるため、処理時間とリソースが無駄になることはありません。
- これらはマシンに依存しないため、マイクロカーネルのマシンに依存しないコードで実行する必要があります。
- これにより、リソースを柔軟に管理できます。
の短所 Semaphores
セマフォの長所/短所は以下のとおりです。
- セマフォの最大の制限の XNUMX つは優先順位の反転です。
- オペレーティングシステムは維持する必要がある trac待機およびシグナルセマフォへのすべての呼び出しのうち k 個。
- それらの使用は決して強制されるものではなく、単に慣例によるものです。
- セマフォのデッドロックを回避するために、Waitと Signal 操作は正しい順序で実行する必要があります。
- Semaphore プログラミングは複雑なので、相互排他を実現できない可能性もある。
- また、使用するとモジュール性が失われるため、大規模な使用には現実的な方法ではありません。
- Semaphore プログラマーのエラーが発生しやすくなります。
- 原因となる可能性があります デッドロック またはプログラマーのエラーによる相互排他違反。


