プロセス Synchronization: OS のクリティカル セクションの問題
⚡ スマートサマリー
プロセス Sync同期化とは、2つのプロセスが同時に同じ共有データやリソースにアクセスしないように、プロセスの実行を調整する作業です。クリティカルセクションへのアクセスを制御することで、マルチプロセスシステムにおけるデータの不整合を防ぎます。

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


