web-dev-qa-db-ja.com

スピンロックとセマフォの違いは何ですか?

実際のスピンロックとセマフォの基本的な違いは何ですか?

15
Renjith G

どちらも限られたリソースを管理します。まず、バイナリセマフォ(ミューテックス)とスピンロックの違いについて説明します。

スピンロック ビジー待機を実行します-つまり、ループを実行し続けます:

while (try_acquire_resource ());
...
release();

これは非常に軽量なロック/ロック解除を実行しますが、同じリソースにアクセスしようとする他のスレッドがロックスレッドをプリエンプトする場合、2番目のスレッドはCPUクォンタムがなくなるまでリソースを無理にしようとします。

一方、 mutex は次のように動作します。

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

したがって、スレッドがブロックされたリソースを取得しようとすると、そのスレッドが使用できるようになるまで中断されます。ロック/ロック解除ははるかに重いですが、待機は「自由」で「公正」です。

セマフォ は、複数回(初期化から既知)の使用が許可されているロックです。たとえば、3つのスレッドが同時にリソースを保持することは許可されますが、それ以上は許可されません。たとえば、プロデューサー/コンシューマーの問題で、または一般的にキューで使用されます。

P(resources_sem)
resource = resources.pop()
...
resources.Push(resources)
V(resources_sem)
13

スピンロックは、スリープが許可されていない割り込みコンテキストで使用されます。彼らはタイトなループでポーリングし、リソースが取得されるまで何もしません。主にISRで使用され、より安全で効率的です。

セマフォは、スリープ状態でも問題のないプロセスコンテキストで使用できます。

2
Kapil

これが私の答えです。スピンロックとbinaryセマフォ(1つのものだけが使用できるリソースを管理します)はほとんど同じです。それらの違いは、スピンロックが実行されるコードを管理するのに対し、バイナリセマフォはある種の特異なリソース(CPU時間、表示出力など)を管理することです。

通常のセマフォは、リソースにアクセスする複数のスレッドを管理できますが、リソースは複数に分割できますが、制限されます(メモリ、ネットワーク帯域幅など)。

つまり、スピンロックは、リソースを使用できるかどうかをセマフォに尋ね続ける可能性があります。 (子供がトイレを使用しなければならず、誰かが終わるのを待っていると想像してください。)

出典:システムプログラミング入門、オペレーティングシステム、ウィキペディア

1
valbaca