1. 序章

オペレーティングシステム(OS)プロセスは、同じシステムで実行されている他のプロセスと対話して、共通のタスクを完了します。 他のプロセスと相互作用するプロセスは、協調プロセスと呼ばれます。

プロセスによって実装されるプロセス間通信(IPC)戦略に基づいて、アドレス空間を他のプロセスと共有するか、メッセージ交換を介して通信することができます。 前者の手法では、両方のプロセスが共通のアドレス空間を共有するため、通信を制御することが重要です。

このプロセス通信の制御は、同期と呼ばれます。 適切な同期がないと、プロセスは古いデータを読み取ったり、他のプロセスデータを上書きしたりする可能性があります。

セマフォとミューテックスは、同期を実装し、プロセス調整を管理するための2つのメカニズムです。 この記事では、これら2つの同期ユーティリティを調べ、さまざまな特性を比較します。

2. クリティカルセクションを理解する

セマフォとミューテックスについて説明する前に、クリティカルセクションの問題を理解しましょう。

n個のプロセスを含むシステムがあると仮定します。 これらの各プロセスには、プロセスが共通の変数の更新、テーブルの更新、またはファイルへの書き込みを実行できるコードのセグメントがあります。 このコードセグメントは、プロセスのクリティカルセクションと呼ばれます。

2.1. クリティカルセクション問題の特徴

クリティカルセクションの本質的な特徴は、プロセスがクリティカルセクションの実行を開始すると、他のプロセスがそのクリティカルセクションを実行することを許可されないことです。 つまり、2つのプロセスがクリティカルセクションを同時に実行することはできません。 このクリティカルセクションの問題は、プロセスが協調を使用できるようにプロトコルを設計することです。

各プロセスは、クリティカルセクションに入る許可を取得する必要があります。 権限を実装するコードは、エントリセクションと呼ばれます。 同様に、クリティカルセクションの出口を実装するコードは、出口セクションと呼ばれます。

2.2. クリティカルセクション問題の基準

クリティカルセクションの問題の解決策は、次の基準を満たす必要があります。

  • 相互排除:プロセスがクリティカルセクションを実行している場合、他のプロセスはそのクリティカルセクションを実行できません
  • 進行状況:クリティカルセクションを実行しているプロセスがない場合、他のプロセスがクリティカルセクションの実行を決定できます。 ソリューションと実装に基づいて、クリティカルセクションを実行できるプロセスが選択されます。 注目すべき特徴は、プロセスが選択プロセスに進んでクリティカルセクションを実行できることです。
  • 制限付き待機:プロセスがクリティカルセクションエントリセクションを要求したとき、および別のプロセスがそのクリティカルセクションを実行した回数には、制限付き待機が必要です。

3. ミューテックスロック

OSのクリティカルセクションの問題を解決するためのユーティリティがいくつかあります。 相互排除( mutex )ロックまたはミューテックスが最も簡単なソリューションです。 ミューテックスロックを使用してクリティカルセクションを保護し、競合状態を防ぎます。 プロセスは、クリティカルセクションにアクセスする前にロックを取得する必要があり、クリティカルセクションの実行が終了するとロックを解放します。

3.1. Mutexロックはどのように機能しますか?

ロックを取得および解放するためのこれらの2つの機能は、acquire()とrelease()の2つの関数で表されます。 取得機能がロックを取得し、解放するとロックが解除されます。 ミューテックスロックには、ロックが使用可能かどうかを決定するブール変数があります。 ロックが使用可能な場合、acquire()メソッドは成功し、ロックは使用不可と見なされます。 使用できないロックにアクセスしようとするプロセスは、ロックが解放されるまでブロックされます。

次の擬似コードは、 acquire()メソッドを示しています。

次の擬似コードは、 release()メソッドを示しています。

3.2. ミューテックスのデメリット

ミューテックスロックの主な欠点は、ロックが使用できない場合にスレッドをスピンロックできることです。

1つのスレッドがロックを取得し、そのクリティカルセクションにある間、ロックを取得しようとする他のすべてのスレッドはループ内にあり、スレッドは定期的にロックが使用可能かどうかをチェックします。 したがって、ロックのために回転し、他のスレッドで生産的に使用された可能性のあるCPUサイクルを浪費します。

これは、単一のCPUマシンでの大きな問題です。 スレッドがロックを「ビジー」で待機しているため、スピンロックはビジー待機とも呼ばれます。

3.3. ミューテックスの利点

ミューテックスロックにはスピンロックの問題がありますが、利点があります。 プロセスがCPUでスピンロックするため、プロセスコンテキストスイッチが不要になります。

プロセスのコンテキストスイッチは、実行中のプロセス統計をプロセス制御ブロック(PCB)に保存し、別のプロセスをCPUにリロードする必要があるため、時間のかかる操作です。 1つのプロセスが1つのプロセッサコアでスピンでき、別のプロセスがクリティカルセクションを実行できるマルチプロセッサCPUがあります。 したがって、一部のシナリオでの短時間のスピンロックは、プロセスコンテキストスイッチよりも便利です。

4. セマフォ

セマフォは、ミューテックスロックと同様の同期機能を提供する別のユーティリティですが、より堅牢で洗練されています。

セマフォは整数変数であり、初期化とは別に、 wait() signal()の2つの標準的なアトミック操作によってアクセスされます。 wait()操作は P、と呼ばれ、 signal()操作はVと呼ばれます。

wait()操作を見てみましょう。

最後に、 signal()操作を見てみましょう。

!

wait()および signal()のセマフォの整数値に対するすべての操作は、アトミックに実行されます。 つまり、1つのプロセスがセマフォ値を変更すると、他のプロセスが同じセマフォ値を同時に変更することはできません。

セマフォSの値に基づいて、セマフォのカウントとバイナリセマフォの2つのカテゴリに分類されます。 カウントセマフォの値は、0から有限値までの範囲になります。 一方、バイナリセマフォの値は0から1の間です。

4.1. セマフォを数える

セマフォをカウントすると、特定のリソースのN個のインスタンスを制御できます。  類推してセマフォを数えることを説明しましょう。

3つの研究室がある図書館があり、それぞれが異なる部屋用に10個の鍵を持っている図書館員がいると仮定します。 読者が部屋へのアクセスを要求したら、部屋を使用するための鍵を入手する必要があります。 読者が使用を終えると、部屋の鍵を図書館員に返します。 すべての部屋が使用されると、新しいリーダーは、既存のリーダーによって部屋が空になるまで待つ必要があります。

上記の例では、リソースは部屋であり、そのインスタンスは10個あります。 これらのインスタンスは、10で初期化されるカウントセマフォによって管理されます。 このセマフォ値は、セマフォの wait()および signal()メソッドを介して制御されます。 次の図はこれを示しています。

4.2. バイナリセマフォ

バイナリセマフォには、0と1の2つの可能な値があります。 セマフォによって管理されるリソースが使用可能な場合、セマフォ値は1です。 それ以外の場合は0に設定され、リソースが使用できないことを示します。

バイナリセマフォには、ミューテックスロックと同じ機能があります。 ミューテックスロックをサポートしないシステムは、バイナリセマフォを利用して同じ機能を実現できます。

次の図は、バイナリセマフォを示しています。

5. セマフォvs。 Mutex

次の表は、セマフォロックとミューテックスロックの重要な特性をまとめたものです。

6. 結論

この記事では、ミューテックスとセマフォのさまざまな側面について説明しました。

最初に、クリティカルセクションと、クリティカルセクションの実行を制御するためのミューテックスまたはセマフォの必要性について説明しました。 次に、ミューテックスとセマフォについて話しました。

最後に、セマフォとミューテックスの比較を提供しました。