はじめに
オペレーティングシステム(OS)プロセスは、同じシステムで実行されている他のプロセスと相互作用し、共通のタスクを完了します。 他のプロセスと相互作用するプロセスは、協調プロセスとして知られています。
プロセスによって実装されたプロセス間通信(IPC)戦略に基づいて、プロセスはアドレス空間を他のプロセスと共有するか、メッセージ交換を介して通信 前者の手法では、両方のプロセスが共通のアドレス空間を共有するため、通信を制御することが重要です。
このプロセス通信の制御は同期と呼ばれます。 適切な同期がなければ、プロセスは古いデータを読み込んだり、他のプロセスデータを上書きしたりする可能性があります。
セマフォとミューテックスは、同期を実装し、プロセスの調整を管理することができる二つのメカニズムです。 この記事では、これらの2つの同期ユーティリティを調べて、さまざまな特性を比較します。
Critical-Sectionの理解
セマフォとミューテックスについて議論する前に、critical-sectionの問題を理解しましょう。
n個のプロセスを含むシステムがあると仮定しましょう。 これらの各プロセスには、プロセスが共通の変数の更新、テーブルの更新、またはファイルへの書き込みを実行できるコードのセグメントがあります。 このコードのセグメントは、プロセスの重要なセクションと呼ばれます。
2.1. クリティカル-セクション問題の特徴
クリティカル-セクションの本質的な特徴は、プロセスがクリティカル-セクションの実行を開始すると、他のプ つまり、2つのプロセスが同時にクリティカルセクションを実行することはできません。 この重要な部分の問題は、プロセスが協力を使用できるようにプロトコルを設計することです。
各プロセスはクリティカルセクションに入る許可を得る必要があります。 アクセス許可を実装するコードの一部は、エントリセクションと呼ばれます。 同様に、クリティカルセクションの終了を実装するコードは、終了セクションと呼ばれます。
2.2. クリティカルセクション問題の基準
クリティカルセクション問題の解は、次の基準を満たす必要があります:
- 相互排除:プロセスがクリティカルセクションを実行している場合、他のプロセスはクリティカルセクションを実行できません
- 進行状況:プロセスがクリティカルセクションを実行していない場合、他のプロセスがクリティカルセクションを実行することを決定できます。 ソリューションと実装に基づいて、その重要なセクションを実行できるプロセスが選択されます。 注目すべき特徴は、プロセスがクリティカルセクション
- 境界待ちを実行するために選択プロセスに進む能力を持っていることです。プロセスがクリティカルセクションのエントリセクションを要求したときに、別のプロセスがそのクリティカルセクション
ミューテックスロック
を実行する回数に対して、境界待ちがある必要があります。OSにおけるクリティカルセクションの問題を解決するためのユーティリティがいくつかあります。 相互排他(ミューテックス)ロックまたはミューテックスは、最も簡単な解決策です。 重要なセクションを保護し、競合状態を防ぐためにミューテックスロックを使用します。 プロセスはクリティカルセクションにアクセスする前にロックを取得する必要があり、クリティカルセクションの実行が終了するとロックを解放
3.1. Mutexロックはどのように機能しますか?
ロックを取得および解放するためのこれらの2つの機能は、acquire()およびrelease()の2つの関数で表されます。 Acquire関数はロックを取得し、releaseはロックを解放します。 Mutexロックには、ロックが使用可能かどうかを決定するブール変数があります。 ロックが使用可能な場合、acquire()メソッドは成功し、ロックは使用できないと見なされます。 使用できないロックにアクセスしようとするプロセスは、ロックが解放されるまでブロックされます。
次の擬似コードは、acquire()メソッドを示しています:
次の擬似コードは、release()メソッドを示しています:
3.2. ミューテックスの欠点
ミューテックスロックの主な欠点は、ロックが利用できない場合にスレッドがスピンロックできることです。
あるスレッドがロックを取得し、そのクリティカルセクションにいる間、ロックを取得しようとする他のすべてのスレッドはループ内にあり、スレッドはロックが利用可能かどうかを定期的にチェックします。 したがって、ロックのために回転し、他のいくつかのスレッドで生産的に使用されていた可能性のあるCPUサイクルを無駄にします。
これは単一のCPUマシンの大きな問題です。 Spinlockは、スレッドがロックを待っている”ビジー”であるため、ビジー待機とも呼ばれます。
3.3. Mutexの利点
mutexロックはspinlockの問題に苦しんでいますが、利点があります。 プロセスがCPU内でスピンロックするので、それ以外の場合は必要だったプロセスコンテキストスイッチの必要性がなくなります。
プロセスのコンテキストスイッチは、実行中のプロセス統計をプロセス制御ブロック(PCB)に保存し、別のプロセスをCPUに再ロードする必要があるため、時 1つのプロセスが1つのプロセッサコアでスピンし、別のプロセスがそのクリティカルセクションを実行できるマルチプロセッサCpuがあります。 したがって、いくつかのシナリオでは、短い期間のスピンロックは、プロセスコンテキストスイッチよりも便利です。
セマフォ
セマフォは、ミューテックスロックに似た同期機能を提供しますが、より堅牢で洗練されたもう一つのユーティリティです。
セマフォは整数変数であり、初期化とは別に、wait()とsignal()という二つの標準的なアトミック演算によってアクセスされます。 Wait()操作はPと呼ばれ、signal()操作はVと呼ばれます。
wait()操作を見てみましょう:
最後に、signal()操作を見てみましょう:
!
wait()およびsignal()内のセマフォの整数値に対するすべての操作は原子的に実行されます。 つまり、あるプロセスがセマフォ値を変更すると、他のプロセスは同じセマフォ値を同時に変更することはできません。
セマフォSの値に基づいて、カウントセマフォとバイナリセマフォの二つのカテゴリに分類されます。 カウントセマフォの値は、0から有限の値までの範囲にすることができます。 一方、バイナリセマフォの値は0から1の間にすることができます。
4.1. セマフォのカウント
セマフォのカウントは、特定のリソースのN個のインスタンスを制御できます。 計数セマフォを類推して説明しましょう。
3つの研究室を持つ図書館が存在し、それぞれが異なる部屋のために10個の鍵を持っている図書館員がいると仮定しましょう。 読者が部屋にアクセスする必要があると、部屋を使用するための鍵を取得する必要があります。 読者が使用を完了すると、部屋の鍵を図書館員に返します。 すべての部屋が使用されると、新しい読者は、既存の読者によって部屋が空になるまで待つ必要があります。
上記の例では、リソースはルームであり、そのインスタンスは10個あります。 これらのインスタンスは、tenで初期化されるカウントセマフォを介して管理されます。 このセマフォの値は、セマフォのwait()メソッドとsignal()メソッドによって制御されます。 次の図は、これを示しています:
4.2. バイナリセマフォ
バイナリセマフォには、0と1の二つの値があります。 セマフォによって管理されるリソースが利用可能な場合、セマフォの値は1になります。 それ以外の場合は、リソースが使用できないことを示す0に設定されます。
バイナリセマフォはミューテックスロックと同じ機能を持ちます。 ミューテックスロックをサポートしていないシステムでは、バイナリセマフォを利用して同じ機能を実現できます。
次の図は、バイナリセマフォを示しています:
セマフォ対 Mutex
次の表は、セマフォとmutexロックの重要な特性をまとめたものです:
結論
この記事では、ミューテックスとセマフォのさまざまな側面について議論しました。
まず、critical sectionと、critical sectionの実行を制御するためのミューテックスまたはセマフォの必要性について議論しました。 次に、mutexとセマフォについて話しました。
最後に、セマフォとミューテックスの比較を提供しました。
あなたはコンピュータサイエンスや研究の経験の数年を持っている、とあなたはコミュニティとその経験を共有することに興味がある場合は、私たちの貢献のガイドラインを見てみましょう。