プロセス Synchronization: OS のクリティカル セクションの問題
プロセスとは Synchronization?
プロセス Sync神化 XNUMX つのプロセスが同じ共有データやリソースにアクセスできないようにプロセスの実行を調整するタスクです。
これは、複数のプロセスが一緒に実行され、複数のプロセスが同じ共有リソースまたはデータに同時にアクセスしようとする場合に、マルチプロセス システムで特に必要になります。
これにより、共有データの不整合が発生する可能性があります。そのため、1 つのプロセスによって行われた変更は、他のプロセスが同じ共有データにアクセスしたときに必ずしも反映されるわけではありません。このようなデータの不整合を回避するには、プロセスを相互に同期する必要があります。
プロセスの方法 Synchronization 作品?
たとえば、プロセス A がメモリ位置のデータを変更している間に、別のプロセス B がメモリ位置からデータを読み取ろうとしているとします。 同じ メモリの場所。2 番目のプロセスによって読み取られたデータはエラーになる可能性が高くなります。
プログラムのセクション
クリティカル セクションの XNUMX つの重要な要素を次に示します。
- エントリーセクション: これは、特定のプロセスへの参加を決定するプロセスの一部です。
- クリティカルセクション: この部分により、XNUMX つのプロセスが共有変数を入力および変更できるようになります。
- 終了セクション: 出口セクションを使用すると、入口セクションで待機している他のプロセスがクリティカル セクションに入ることができます。 また、実行を終了したプロセスがこのセクションを通じて削除されるべきかどうかもチェックします。
- 残りのセクション: クリティカル、開始、および終了セクションに含まれないコードの他のすべての部分は、残りのセクションとして知られています。
クリティカルセクション問題とは何ですか?
クリティカル セクションは、特定の時点で信号プロセスによってアクセスできるコードのセグメントです。 このセクションは、他のプロセスからアクセスする必要がある共有データ リソースで構成されます。
- クリティカル セクションへのエントリは wait() 関数によって処理され、P() として表されます。
- クリティカル セクションからの終了は、V() として表される signal() 関数によって制御されます。
クリティカルセクションでは、単一のプロセスのみを実行できます。 クリティカル セクションの実行を待機している他のプロセスは、現在のプロセスが実行を完了するまで待つ必要があります。
クリティカルセクションのルール
クリティカル セクションでは、次の XNUMX つのルールをすべて適用する必要があります。
- 相互排除: 相互排除は、共有リソースへのアクセスを制御するために使用される特別なタイプのバイナリ セマフォです。 これには、拡張優先度逆転の問題を回避するための優先度継承メカニズムが含まれています。 クリティカル セクションで同時に実行できるプロセスは XNUMX つだけです。
- 進捗状況: このソリューションは、クリティカル セクションに誰もいなくて、誰かが参加したい場合に使用されます。その場合、リマインダー セクションにいないプロセスは、有限時間内に誰が参加すべきかを決定する必要があります。
- バウンド待機中: プロセスがクリティカル セクションに入るリクエストを行う場合、クリティカル セクションに入ることができるプロセスの数には特定の制限があります。 したがって、制限に達すると、システムはプロセスへのリクエストがクリティカル セクションに入るのを許可する必要があります。
クリティカルセクションへのソリューション
処理中 Sync問題を解決するには、クリティカルセクションが中心的な役割を果たします。
クリティカル セクションの問題を解決するために広く使用されている方法をいくつか紹介します。
ピーターソンのソリューション
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 は待機ループから抜け出します。
Syncハードウェアの権威化
場合によっては、クリティカル セクションの問題もハードウェアによって解決されます。一部のオペレーティング システムでは、プロセスがクリティカル セクションに入るときにロックを取得し、クリティカル セクションを出るときにロックを解除するロック機能が提供されています。
そのため、別のプロセスがクリティカルセクションに入ろうとした場合、ロックされているため入ることができません。 これは、ロック自体を取得することによって解放されている場合にのみ可能です。
ミューテックスロック
SyncHronization ハードウェアは誰でも簡単に実装できる方法ではないため、Mutex Locks として知られる厳密なソフトウェア方法も導入されました。
このアプローチでは、コードのエントリ セクションで、クリティカル セクション内で使用されるクリティカル リソースに対して LOCK が取得されます。 出口セクションではロックが解除されます。
Semaphore 解決策
Semaphore は、負ではなく、スレッド間で共有される単なる変数です。 これは、クリティカル セクション問題に対する別のアルゴリズムまたは解決策です。 これはシグナリング メカニズムであり、セマフォを待機しているスレッドであり、別のスレッドによってシグナリングされる可能性があります。
プロセス同期には、1) wait と 2) signal という XNUMX つのアトミック操作を使用します。
例
WAIT ( S ): while ( S <= 0 ); S = S - 1; SIGNAL ( S ): S = S + 1;
まとめ
- プロセス同期とは、2 つのプロセスが同じ共有データとリソースにアクセスできないようにプロセスの実行を調整するタスクです。
- クリティカルセクションの 1 つの要素は 2) エントリーセクション 3) クリティカルセクション 4) イグジットセクション XNUMX) リマインダーセクション
- クリティカル セクションは、特定の時点で信号プロセスによってアクセスできるコードのセグメントです。
- クリティカルセクションごとに強制しなければならない 1 つのマストルールは次のとおりです: 2) 相互排他 3) プロセスソリューション XNUMX) バインドされた待機
- 相互排除は、共有リソースへのアクセスを制御するために使用される特別なタイプのバイナリ セマフォです。
- プロセスソリューションは、重要なセクションに誰もいなくて、誰かが入りたい場合に使用されます。
- バウンド待機ソリューションでは、プロセスがそのクリティカル セクションに入るリクエストを行った後、そのクリティカル セクションに入ることができる他のプロセスの数には制限があります。
- Peterson のソリューションは、クリティカル セクションの問題に対するソリューションとして広く使用されています。
- クリティカルセクションの問題もハードウェアの同期によって解決される
- Synchronization ハードウェアは誰でも簡単に実装できる方法ではないため、Mutex Locks として知られる厳密なソフトウェア方法も導入されました。
- Semaphore クリティカル セクション問題に対する別のアルゴリズムまたはソリューションです。