1. 序章

オペレーティングシステムでのプロセスの同期とは、並行環境でスレッドまたはプロセスを同期することを意味します。 主な目的は、競合状態とデッドロックを防ぐことです。

このチュートリアルでは、セマフォとスピンロックの違いを調査します。 両方を使用してプロセスを同期できます。

2. プロセス同期ツール

まず、いくつかの定義を要約してみましょう。

ロックは、他のスレッドが一部のリソースにアクセスするのをブロックします。 ロックを持っている1つのスレッドだけがアクセスできます。 リソースを必要とする他のスレッドは待機する必要があります。

スピンロックは、ビジーウェイトによってプロセスの同期を実現します。 したがって、ロックされたセクションにアクセスしようとするスレッドはループしているだけです。 スレッドはループ中に実際の作業を実行しないことに注意してください。

セマフォは、ビジー待機を強制しない同期ツールです。 簡単に言えば、これはプロセス間で共有される整数値です。 とりわけ、同時環境で限られたリソースにアクセスする複数のプロセスに信号を送ります。 その2つの操作、つまりwaitsignalは、セマフォの値を変更します。

セマフォには2つのタイプがあります。 バイナリセマフォには、名前が示すように2つの値しかありません。 これにより、1つのプロセスのみがクリティカルセクションにアクセスできるようになります。

カウントセマフォは、任意の正の整数値を取ることができます。 この値は、共有リソースに同時にアクセスできるプロセスの数を定義します。

もう1つのよく知られているプロセス同期ツールは、mutexです。 これは別のロックメカニズムであり、セマフォのようなシグナリングメカニズムではありません。

3. スピンロック対。 セマフォ

このセクションでは、スピンロックとセマフォについて詳しく見ていきましょう。

スピンロックは、スレッドがそれにアクセスしようとしてループで待機するように強制します。この待機時間中、スレッドはタスクを実行しません。 ロックが使用可能かどうかのみをチェックします。

一方、セマフォはビジーウェイトなしでプロセスの同期を実現します。その待機操作により、プロセスはスリープ状態になります。 したがって、ビジーウェイトはシステムリソースを浪費しません。

リソースが使用可能になると、シグナル操作によってセマフォ値が変更されます。 次に、待機リストの次のプロセスがウェイクアップされます。 ただし、スピンロックでは、ロックを待機しているプロセスは、ループ内で継続的にテストしてアクセスを取得する必要があります。

スピンロックの実装は簡単です。 最小限の時間ロックが必要な場合に適しています。 待機時間が長い場合は、セマフォの方が効率的です。

スピンロックは、1つのスレッドだけがロックにアクセスできるようにします。 同様に、バイナリセマフォは相互排除を提供します。 ただし、セマフォをカウントすると、複数のプロセスがリソースにアクセスできます。

システムにプロセッサが1つしかない場合は、スピンロックによってシステムがビジー状態になります。 ロックのないプロセスがループでスタックするため、プロセッサは十分に活用されません。 この場合、セマフォを使用すると、待機中のプロセスが実行されないため、プロセッサの使用率が高くなります。

そのため、システムサンニングスピンロックで割り込みを無効にすることをお勧めします。 逆に、セマフォを操作するときに割り込みを無効にする必要はありません。

同様に、スピンロックを使用する場合は、プリエンプションを無効にする必要があります。 繰り返しますが、プリエンプションはセマフォに影響を与えません。

4. 概要

前のセクションで学んだことを表にまとめましょう。

5. 結論

この記事では、2つの同期メカニズムを比較しました。

Spinlockは低レベルの同期ソリューションです。 すばやく簡単に実装できます。 ただし、システムリソースを浪費します。

セマフォは、プロセス同期の問題に対する高度なソリューションを提供します。 待機中のプロセスをスリープ状態にするため、システムリソースを浪費することはありません。 それでも、セマフォを不注意に使用すると、デッドロックが発生する可能性があります。