スピンロックとセマフォの動作の基本的な違いは何ですか?
スピンロックとセマフォの動作の基本的な違いは何ですか?
回答:
両方とも、限られたリソースを管理します。まず、バイナリセマフォ(mutex)とスピンロックの違いについて説明します。
スピンロックはビジー待機を実行します。つまり、ループを実行し続けます。
while (try_acquire_resource ());
...
release();
非常に軽量なロック/ロック解除を実行しますが、ロックスレッドが同じリソースにアクセスしようとする他のスレッドによってプリエンプトされる場合、2番目のスレッドは、CPUクォンタムがなくなるまでリソースを単純に取得しようとします。
一方、ミューテックスの動作は次のようになります。
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)
スピンロックと バイナリセマフォ(1つだけが使用できるリソースを管理する)はほとんど同じです。違いは、スピンロックは実行するコードを管理し、バイナリセマフォは何らかの種類のリソース(CPU時間、表示出力など)を管理することです。
ただし、通常のセマフォは、いくつかに分割できるリソースにアクセスするいくつかのスレッドを管理できますが、制限されています(メモリ、ネットワーク帯域幅など)
要するに、スピンロックは、リソースを使用できるかどうかをセマフォに尋ね続けます。(子供がトイレを使わなければならず、他の誰かが終わるのを待っていると想像してください。)
出典:システムプログラミング、オペレーティングシステム、ウィキペディアの紹介