Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C /C++でのプロセス同期


プロセスの同期は、データの不整合を引き起こす可能性のある共有データへの同時アクセスの問題を克服するための手法です。協調プロセスとは、他のプロセスに影響を及ぼしたり、影響を受けたりして、プロセスデータの不整合につながる可能性があるプロセスです。したがって、データの整合性を保つには、プロセスの同期が必要です。

クリティカルセクションの問題

すべてのプロセスには、クリティカルセクションと呼ばれる予約済みのコードセグメントがあります。 。このセクションでは、プロセスは共通変数の変更、テーブルの更新、ファイルの書き込みなどを行うことができます。クリティカルセクションについて注意すべき重要な点は、あるプロセスがクリティカルセクションで実行されている場合、他のプロセスはそのクリティカルセクションで実行できないということです。各プロセスは、クリティカルセクションに入る前に許可を要求する必要があり、この要求を実装するコードのセクションはエントリセクションです。 、コードの最後は終了セクションです。 残りのコードは残りのセクションです。

特定のプロセスP1のクリティカルセクションの構造を以下に示します

C /C++でのプロセス同期

クリティカルセクションで満たす必要のある3つの要件があります

  • 相互排除 −あるプロセスが他のどのプロセスよりもP1がクリティカルセクションで実行されているとすると、P2はクリティカルセクションで実行できないとしましょう。
  • 進捗状況 −クリティカルセクションで実行中のプロセスがなく、クリティカルセクションに入力したいプロセスがある場合、残りのセクションで実行されていないプロセスのみがクリティカルセクションへの入力を要求でき、選択を無期限に延期できます。 。
  • 制限付き待機 −制限付き待機では、プロセスがクリティカルセクションへのアクセスを要求した後、その要求が許可されるまでに、プロセスがクリティカルセクションに入ることができる回数に制限または制限があります。

クリティカルセクションを処理するためにオペレーティングシステムで一般的に使用される2つのアプローチがあります。

プリエンプティブカーネル −プリエンプティブカーネルを使用すると、プロセスがカーネルモードで実行されているときにプロセスをプリエンプションできます。

非プリエンプティブカーネル −非プリエンプティブカーネルでは、カーネルモードで実行されているプロセスをプリエンプションすることはできません。

ピーターソンのソリューション

Petersonのソリューションは、クリティカルセクションの問題に対するクラシックベースのソフトウェアソリューションです。クリティカルセクションと残りのセクションの間で実行を交互に行う2つのプロセスに制限されています。 Petersonのセクションでは、2つのデータ項目を2つのプロセス間で共有する必要があります。

  • 整数ターン;
  • ブールフラグ[2];

ここで、可変ターンは、誰のターンがクリティカルセクションに入るのかを示し、フラグ配列は、プロセスがクリティカルセクションに入る準備ができているかどうかを示します。

turn ==iの場合、プロセスPiがクリティカルセクションに入ることが許可されていることを意味します。

flag [j]がTRUEの場合、プロセスjがクリティカルセクションに入る準備ができていることを意味します

ピーターソンのソリューションのプロセスPの構造を以下に示します

C /C++でのプロセス同期

Peterson’s Solutionは、3つの条件すべてを保持します-

  • 相互排除 −一度に1つのプロセスがクリティカルセクションにアクセスできます。
  • 進捗状況 −クリティカルセクション外のプロセスは、他のプロセスがクリティカルセクションに入るのをブロックしません。
  • 制限付き待機 −すべてのプロセスは、無期限に待つことなく、クリティカルセクションに入るチャンスがあります。

同期ハードウェア

2種類の命令を使用して実装されます-

  • テストアンドセット()
  • swap()

Test and Set()は、同期の問題を解決するためのハードウェアソリューションです。これには、ロックと呼ばれる複数のプロセスによって共有される共有変数があり、0と1の1つの値を持つことができます。ここで、1は取得したロックを表し、0は解放されたロックを表します。

プロセスがクリティカルセクションに入ろうとするときはいつでも、ロックの値について問い合わせる必要があります。ロックの値が1の場合、ロックの値が0に変更されなくなるまで待機する必要があります。

以下に、TestAndSet()を使用した相互排除の実装を示します

C /C++でのプロセス同期

セマフォ

セマフォは、TestAndSet()およびSwap()命令によって生成される問題を克服するために使用される同期ツールです。セマフォSは、wait()とsignal()の2つの標準的なアトミック操作を介してアクセスできる整数変数です

wait()の関数:

wait(S) {
   While S <= 0
   ; // no operation
   S--;
}

Signal()の関数:

signal(S) {
   S++;
}

1つのプロセスがセマフォの値を変更している場合、他のプロセスが同じセマフォ値を同時に操作することはできません。

以下に示すのは、セマフォを使用した相互排除の実装です

C /C++でのプロセス同期

オペレーティングシステムは、次の2種類のsemsphorを使用します-

セマフォのカウント −このタイプのセマフォの値は、無制限のドメインを超える可能性があります

バイナリセマフォ −このタイプのセマフォの値は、0から1の間で超える可能性があります。これらはMutexロックとも呼ばれます。オペレーティングシステムはこれを利用して、複数のプロセスのクリティカルセクションの問題を解決します。


  1. C / C ++のmemcpy()

    この記事では、C ++ STLでのmemcpy()関数の動作、構文、および例について説明します。 memcpy()とは何ですか? memcpy()関数は、C ++ STLに組み込まれている関数であり、ヘッダーファイルで定義されています。 memcpy()関数は、メモリのブロックをコピーするために使用されます。この関数は、あるメモリ位置から別のメモリ位置に値の数をコピーするために使用されます。 関数の結果は、データのバイナリコピーです。この関数は、終了ソースまたは終了ヌル文字をチェックせず、ソースからnumバイトをコピーするだけです。 例 void memcpy( void* destin

  2. C / C ++のAAツリー?

    コンピュータサイエンスのAAツリーは、順序付けられたデータを効率的に保存および取得するために実装されたバランスの取れたツリーの形式として定義されます。 AAツリーは、エントリの効率的な追加と削除をサポートするバイナリ検索ツリーの形式である赤黒ツリーのバリエーションとして扱われます。赤黒木とは対照的に、AAツリーの赤いノードは、左のサブチャイルドではなく、右のサブチャイルドとしてのみ追加できます。この操作の結果、2-3-4ツリーではなく2-3ツリーのシミュレーションが行われるため、メンテナンス操作が簡素化されます。赤黒木のメンテナンスアルゴリズムでは、ツリーのバランスを適切にとるために、7つの異