プロセスの同期: OS のクリティカル セクションの問題

プロセスの同期とは何ですか?

プロセスの同期 XNUMX つのプロセスが同じ共有データやリソースにアクセスできないようにプロセスの実行を調整するタスクです。

これは、複数のプロセスが一緒に実行され、複数のプロセスが同じ共有リソースまたはデータに同時にアクセスしようとする場合に、マルチプロセス システムで特に必要になります。

これにより、共有データの不整合が生じる可能性があります。 したがって、あるプロセスによって行われた変更は、他のプロセスが同じ共有データにアクセスしたときに必ずしも反映されるわけではありません。 この種のデータの不一致を回避するには、プロセスを相互に同期させる必要があります。

プロセスの同期はどのように機能しますか?

たとえば、プロセス A がメモリ位置のデータを変更している間に、別のプロセス B がメモリ位置からデータを読み取ろうとしているとします。 同じ 記憶の場所。 XNUMX番目のプロセスで読み取られたデータはエラーになる可能性が高いneo私達。

プロセスの同期が機能する

プログラムのセクション

クリティカル セクションの XNUMX つの重要な要素を次に示します。

  • エントリーセクション: これは、特定のプロセスへの参加を決定するプロセスの一部です。
  • クリティカルセクション: この部分により、XNUMX つのプロセスが共有変数を入力および変更できるようになります。
  • 終了セクション: 出口セクションを使用すると、入口セクションで待機している他のプロセスがクリティカル セクションに入ることができます。 また、実行を終了したプロセスがこのセクションを通じて削除されるべきかどうかもチェックします。
  • 残りのセクション: クリティカル、開始、および終了セクションに含まれないコードの他のすべての部分は、残りのセクションとして知られています。

クリティカルセクション問題とは何ですか?

クリティカル セクションは、特定の時点で信号プロセスによってアクセスできるコードのセグメントです。 このセクションは、他のプロセスからアクセスする必要がある共有データ リソースで構成されます。

  • クリティカル セクションへのエントリは wait() 関数によって処理され、P() として表されます。
  • クリティカル セクションからの終了は、V() として表される signal() 関数によって制御されます。

クリティカルセクションでは、単一のプロセスのみを実行できます。 クリティカル セクションの実行を待機している他のプロセスは、現在のプロセスが実行を完了するまで待つ必要があります。

クリティカルセクションのルール

クリティカル セクションでは、次の XNUMX つのルールをすべて適用する必要があります。

  • 相互排除: 相互排除は、共有リソースへのアクセスを制御するために使用される特別なタイプのバイナリ セマフォです。 これには、拡張優先度逆転の問題を回避するための優先度継承メカニズムが含まれています。 クリティカル セクションで同時に実行できるプロセスは XNUMX つだけです。
  • 進捗状況: このソリューションは、クリティカル セクションに誰もいなくて、誰かが参加したい場合に使用されます。その場合、リマインダー セクションにいないプロセスは、有限時間内に誰が参加すべきかを決定する必要があります。
  • バウンド待機中: プロセスがクリティカル セクションに入るリクエストを行う場合、クリティカル セクションに入ることができるプロセスの数には特定の制限があります。 したがって、制限に達すると、システムはプロセスへのリクエストがクリティカル セクションに入るのを許可する必要があります。

クリティカルセクションへのソリューション

プロセス同期ではクリティカルセクションが主役となり、問題を解決する必要があります。

クリティカル セクションの問題を解決するために広く使用されている方法をいくつか紹介します。

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

Peterson のソリューションは、クリティカル セクションの問題に対するソリューションとして広く使用されています。 このアルゴリズムはコンピューター科学者のピーターソンによって開発されたため、ピーターソンのソリューションと呼ばれています。

このソリューションでは、プロセスがクリティカルな状態で実行されている場合、他のプロセスはコードの残りの部分のみを実行し、その逆のことが起こる可能性があります。 この方法は、特定の時間にクリティカル セクションで XNUMX つのプロセスのみが実行されるようにするのにも役立ちます。

クリティカルセクションへのソリューション

PROCESS Pi
FLAG[i] = true
while( (turn != i) AND (CS is !free) ){ wait;
}
CRITICAL SECTION FLAG[i] = false
turn = j; //choose another process to go to CS
  • N 個のプロセス (P1、P2、… PN) があり、すべてのプロセスがある時点でクリティカル セクションに入る必要があると仮定します。
  • サイズ N の FLAG[] 配列が維持されます。これはデフォルトでは false です。 したがって、プロセスがクリティカル セクションに入る必要がある場合は常に、そのフラグを true に設定する必要があります。 たとえば、Pi が入力したい場合は、FLAG[i]=TRUE が設定されます。
  • TURN と呼ばれる別の変数は、現在 CS への入力を待機しているプロセス番号を示します。
  • 終了中にクリティカル セクションに入るプロセスは、TURN を準備完了プロセスのリストの別の番号に変更します。
  • 例: ターンが 2 の場合、P2 はクリティカル セクションに入り、終了時にターン = 3 となるため、P3 は待機ループから抜け出します。

同期ハードウェア

クリティカルセクションの問題はハードウェアによって解決される場合もあります。 一部のオペレーティング システムでは、プロセスがクリティカル セクションに入るときにロックを取得し、そこから出た後にロックを解放するロック機能を提供しています。

そのため、別のプロセスがクリティカルセクションに入ろうとした場合、ロックされているため入ることができません。 これは、ロック自体を取得することによって解放されている場合にのみ可能です。

ミューテックスロック

同期ハードウェアは誰でも簡単に実装できる方法ではないため、ミューテックス ロックとして知られる厳密なソフトウェア方法も導入されました。

このアプローチでは、コードのエントリ セクションで、クリティカル セクション内で使用されるクリティカル リソースに対して LOCK が取得されます。 出口セクションではロックが解除されます。

セマフォソリューション

セマフォ は、負ではなく、スレッド間で共有される単なる変数です。 これは、クリティカル セクション問題に対する別のアルゴリズムまたは解決策です。 これはシグナリング メカニズムであり、セマフォを待機しているスレッドであり、別のスレッドによってシグナリングされる可能性があります。

XNUMXつ使用します atomic 操作、1) 待機、2) プロセス同期の信号。

WAIT ( S ):
while ( S <= 0 );
S = S - 1;
SIGNAL ( S ):
S = S + 1;

まとめ

  • プロセスの同期は、XNUMX つのプロセスが同じ共有データやリソースにアクセスできないようにプロセスの実行を調整するタスクです。
  • クリティカルセクションの 1 つの要素は 2) エントリーセクション 3) クリティカルセクション 4) イグジットセクション XNUMX) リマインダーセクション
  • クリティカル セクションは、特定の時点で信号プロセスによってアクセスできるコードのセグメントです。
  • クリティカルセクションごとに強制しなければならない 1 つのマストルールは次のとおりです: 2) 相互排他 3) プロセスソリューション XNUMX) バインドされた待機
  • 相互排除は、共有リソースへのアクセスを制御するために使用される特別なタイプのバイナリ セマフォです。
  • プロセスソリューションは、重要なセクションに誰もいなくて、誰かが入りたい場合に使用されます。
  • バウンド待機ソリューションでは、プロセスがそのクリティカル セクションに入るリクエストを行った後、そのクリティカル セクションに入ることができる他のプロセスの数には制限があります。
  • Peterson のソリューションは、クリティカル セクションの問題に対するソリューションとして広く使用されています。
  • クリティカルセクションの問題もハードウェアの同期により解決
  • 同期ハードウェアは誰でも実装できる簡単な方法ではないため、ミューテックス ロックとして知られる厳密なソフトウェア方法も導入されました。
  • セマフォは、クリティカル セクションの問題に対する別のアルゴリズムまたは解決策です。