プロセス同期は、データの不整合を引き起こす可能性がある共有データへの同時アクセスの問題を解決するテクノロジーです。連携プロセスとは、他のプロセスに影響を与えたり、他のプロセスの影響を受ける可能性があるプロセスを指し、その結果、プロセス データが不整合になるため、データの一貫性を確保するにはプロセスの同期が必要です。
クリティカル セクションの問題
すべてのプロセスには、
クリティカル セクションと呼ばれる予約されたコード セグメントがあります。このセクションでは、プロセスはパブリック変数の変更、テーブルの更新、ファイルへの書き込みなどを行うことができます。クリティカル セクションに関して注意すべき重要な点は、あるプロセスがそのクリティカル セクションで実行されている間は、他のプロセスはそのクリティカル セクションで実行できないということです。すべてのプロセスは、クリティカル セクションに入る前に許可を要求する必要があります。この要求を実装するコードのセクションは
entryセクション、コードの最後は
exitセクション、残りのコードは#です# #残りの部分。
特定のプロセス P1 の主要部分の構造を以下に示します。
次のとおりです。次の 3 つの要件: クリティカル セクション
- 相互排他を満たす必要があります。あるプロセスがクリティカル セクションで P1 を実行すると想定した場合、他のプロセスは P2 を実行できないと想定します。クリティカル セクション内 クリティカル セクションの実行。
- Progress - クリティカル セクションで実行中のプロセスがなく、クリティカル セクションのクリティカル セクションに入ろうとしているプロセスがある場合、そのクリティカル セクションで実行されていないプロセスのみが実行されます。残りの部分はクリティカルセクションへの入力を要求でき、オプションは無期限に延期できます。
- 境界付き待機 - 境界付き待機では、プロセスがクリティカル セクションに入るリクエストを発行した後、そのリクエストが完了するまでにクリティカル セクションに入ることができる回数に制限があります。許可されました。
オペレーティング システムで重要な部分を処理するために一般的に使用される 2 つの方法があります。
プリエンプティブル カーネル - プリエンプティブル カーネルを使用すると、プロセスがプリエンプトされるときにプロセスをプリエンプトできます。カーネルモードで動作します。
非プリエンプティブ カーネル - 非プリエンプティブ カーネルでは、カーネル モードで実行されているプロセスをプリエンプトできません。
Peterson のソリューション
Peterson のソリューションは、クリティカル セクションの問題に対する古典ベースのソフトウェア ソリューションです。重要な部分と残りの部分を交互に実行する 2 つのプロセスに限定されます。 Peterson の部分では、2 つのプロセス間で 2 つのデータ項目を共有する必要があります。これは、
here 、変数です。ターンは誰の順番でクリティカル セクションに入るかを示し、フラグ配列はプロセスがクリティカル セクションに入る準備ができているかどうかを示します。
turn == i の場合、プロセス Pi がクリティカル セクションに入ることが許可されることを意味します。
flag[j] が TRUE の場合、プロセス j がクリティカル セクションに入る準備ができていることを意味します
以下は Peterson スキームにおけるプロセス P の構造です
Peterson のソリューションは 3 つの条件をすべて維持します -
- 相互排他的 - でのプロセスは 1 つだけです。クリティカルセクションにアクセスできる時間。
- Progress -クリティカル セクション外のプロセスは、他のプロセスがクリティカル セクションに入るのを妨げません。
境界のある待機 - 各プロセスには、無期限に待機することなくクリティカル セクションに入る機会があります。
同期ハードウェア
は、2 種類の命令 (
Test および Set()- swap()#) を使用して実装されています。
- Test と Set () は、同期の問題を解決するためのハードウェア ソリューションです。その中には、Lock という複数のプロセスで共有されるシェア変数があり、0 と 1 の値を取ることができます。1 はロックの取得を意味し、0 はロックの解放を意味します。
プロセスがクリティカル セクションに入ろうとするたびに、ロック値をクエリする必要があります。 lock の値が 1 の場合、lock の値が 0 に変わらなくなるまで待機する必要があります。
以下は、TestAndSet() の相互排他的な実装です。
セマフォ
セマフォは同期です。 TestAndSet() および Swap() 命令によって引き起こされる問題を解決するために使用されるツール。セマフォ S は、wait() と signal() の 2 つの標準アトミック操作
wait() 関数:
wait(S) {
While S <= 0
; // no operation
S--;
}
ログイン後にコピー
# を通じてアクセスできる整変数です。 ##Signal() 関数の機能:
signal(S) {
S++;
}
ログイン後にコピー
プロセスがセマフォの値を変更しているとき、他のプロセスは同時に同じセマフォの値を操作できません。
セマフォを使用した相互排他実装を以下に示します。
オペレーティング システムは 2 種類のセマフォを使用します。 :
カウント セマフォ
- このタイプのセマフォの値は、無制限のドメイン内で変更できます
バイナリ セマフォ
- の値このタイプのセマフォは 0 から 1 の間で変化します。ミューテックス ロックとも呼ばれます。これは、複数のプロセスにおけるクリティカル セクションの問題を解決するためにオペレーティング システムによって使用されます。
以上がC/C++ でのプロセスの同期の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。