何ですか Semaphore? カウント、バイナリ型と例

何ですか Semaphore?

Semaphore は単に負でない変数であり、スレッド間で共有されます。セマフォはシグナル機構であり、セマフォを待っているスレッドは別のスレッドからシグナルを受け取ることができます。セマフォは1つのアトミック操作、2) 待機、およびXNUMX) を使用します。 Signal プロセスの同期のため。

セマフォは、その設定方法に応じて、リソースへのアクセスを許可または禁止します。

の特徴 Semaphore

セマフォの特徴は次のとおりです。

  • タスクの同期を実現するために使用できるメカニズムです。
  • これは低レベルの同期メカニズムです。
  • Semaphore 常に負でない整数値を保持します。
  • Semaphore テスト操作と割り込みを使用して実装できます。これらはファイル記述子を使用して実行する必要があります。

の種類 Semaphores

一般的なセマフォには次の XNUMX 種類があります。

  • セマフォのカウント
  • バイナリセマフォ。

集計 Semaphores

このタイプの Semaphore タスクを何度も取得または解放するのに役立つカウントを使用します。初期カウントが 0 の場合、カウント セマフォは使用不可の状態で作成する必要があります。

集計 Semaphores
集計 Semaphores

ただし、カウントが 0 より大きい場合、セマフォは使用可能な状態で作成され、セマフォが持つトークンの数はそのカウントに等しくなります。

バイナリ Semaphores

バイナリ セマフォはカウンティング セマフォと非常に似ていますが、その値は 0 と 1 に制限されています。このタイプのセマフォでは、待機操作はセマフォ = 1 の場合にのみ機能し、シグナル操作はセマフォ = 0 のときに成功します。カウンティング セマフォよりも実装が簡単です。

バイナリ Semaphores

バイナリ Semaphores

の例 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) 操作とも呼ばれます。

セマフォ値が減少して負になった後、コマンドは必要な条件が満たされるまで保留されます。

Copy CodeP(S)
{ 
    while (S<=0);
    S--;
}

Signal 操作

このタイプの Semaphore この操作は、クリティカル セクションからのタスクの終了を制御するために使用されます。この操作は、引数の値を 1 増加させるのに役立ちます。この値は V(S) として表されます。

Copy CodeP(S)
{ 
    while (S>=0);
    S++;
}

集計 Semaphore 対バイナリ Semaphore

ここでは、カウンティングとバイナリ セマフォの主な違いをいくつか示します。

集計 Semaphore バイナリ Semaphore
相互排除はありません 相互排除
任意の整数値 値は0と1のみ
複数のスロット スロットはXNUMXつだけ
一連のプロセスを提供する 相互排他メカニズムを備えています。

との差 Semaphore ミューテックス

Parameters Semaphore ミューテックス
メカニズム これは信号伝達メカニズムの一種です。 ロック機構です。
Data Type Semaphore 整数変数です。 ミューテックスは単なるオブジェクトです。
修正 待機およびシグナル操作によりセマフォを変更できます。 これは、リソースを要求または解放するプロセスによってのみ変更されます。
資源管理 空きリソースがない場合、プロセスは待機操作を実行するリソースを必要とします。セマフォのカウントが 0 より大きくなるまで待機する必要があります。 ロックされている場合、プロセスは待機する必要があります。 プロセスはキューに入れておく必要があります。 これには、ミューテックスがロック解除されている場合にのみアクセスする必要があります。
スレッド 複数のプログラム スレッドを持つことができます。 複数のプログラム スレッドを mutex で実行することはできますが、同時に実行することはできません。
所有権 値は、リソースを解放または取得するプロセスによって変更できます。 オブジェクトのロックは、そのロックを取得したプロセスによってのみ解放されます。
種類 の種類 Semaphore セマフォとバイナリセマフォをカウントし、 ミューテックスにはサブタイプがありません。
Opera生産 Semaphore 値は wait() および signal() 操作を使用して変更されます。 ミューテックス オブジェクトがロックまたはロック解除されています。
リソース占有率 すべてのリソースが使用されており、リソースを要求しているプロセスが wait() 操作を実行し、セマフォ数が 1 を超えるまで自身をブロックする場合は、セマフォが占有されます。 オブジェクトがすでにロックされている場合、リソースを要求しているプロセスは待機し、ロックが解放される前にシステムによってキューに入れられます。

のメリット Semaphores

使用するメリット/利点は次のとおりです Semaphore:

  • 複数のスレッドがクリティカル セクションにアクセスできるようにします。
  • Semaphoreはマシンに依存しません。
  • Semaphoreは、マイクロカーネルのマシンに依存しないコードで実装されています。
  • 複数のプロセスがクリティカル セクションに入ることができません。
  • セマフォではビジー待機があるため、処理時間とリソースが無駄になることはありません。
  • これらはマシンに依存しないため、マイクロカーネルのマシンに依存しないコードで実行する必要があります。
  • これにより、リソースを柔軟に管理できます。

セマフォの欠点

セマフォの短所/欠点は次のとおりです

  • セマフォの最大の制限の XNUMX つは優先順位の反転です。
  • オペレーティング システムは、待機およびシグナル セマフォへのすべての呼び出しを追跡する必要があります。
  • それらの使用は決して強制されるものではなく、単に慣例によるものです。
  • セマフォのデッドロックを回避するために、Waitと Signal 操作は正しい順序で実行する必要があります。
  • Semaphore プログラミングは複雑なので、排他制御が実現できない可能性があります。
  • また、使用するとモジュール性が失われるため、大規模な使用には現実的な方法ではありません。
  • Semaphore プログラマーのエラーが発生しやすくなります。
  • 原因となる可能性があります デッドロック またはプログラマーのエラーによる相互排他違反。

まとめ

  • Semaphore 負でない値でスレッド間で共有される変数として定義されます。
  • タスクの同期を実現するために使用できるメカニズムです。
  • カウンティングセマフォは、タスクを何度も取得または解放するのに役立つカウントを使用します。
  • バイナリ セマフォはカウント セマフォとよく似ていますが、その値は 0 と 1 に制限されます。
  • 待機操作は、クリティカルセクションへのタスクのエントリを制御するのに役立ちます。
  • Signal セマフォ操作は、クリティカルセクションからのタスクの終了を制御するために使用されます。
  • 集計 Semaphore 排他性はないが、バイナリ Semaphore 相互排除がある
  • Semaphore はシグナリングメカニズムを意味し、Mutexはロックメカニズムを意味します
  • Semaphore 複数のスレッドがクリティカルセクションにアクセスできるようにする
  • セマフォの最大の制限の XNUMX つは優先順位の反転です。