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


15

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



@Gilles私もそれを見ましたが、ページ上のセマフォについての唯一の言及は、「スピンロックとセマフォの違いを知りたい場合、それは別の質問です」とウォーレンがコメントしていることです。
マイケルMrozek

@Michael:わかりました、そこの答えは要点に対処したと思いますが、セマフォが他の種類のロックの1つであると明示的に述べたものは誰もいません。
ジル「SO-悪であるのをやめる」

Linus Torvalds氏によって説明:yarchive.net/comp/linux/semaphores.html
myaut

stackoverflow.com/questions/195853/spinlock-versus-semaphoreの複製私が尋ねたスレッドには多くの良い説明があります。
iankits

回答:


13

両方とも、限られたリソースを管理します。まず、バイナリセマフォ(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)

良い説明、私はただ一つの点を強調したいです。セマフォとミューテックスはインターフェースの問題です。セマフォは最大N個のスレッドによって保持されますが、ミューテックスは保持されるかされません。mutexはN = 1のセマフォの特殊なケースです。スピンロックと他の種類のロックは実装の問題です。スピンロックはロックを取得しようとし続けますが、他の種類のロックは通知を待ちます。Linuxカーネルコンテキストでは、スピン実装の唯一のロックはmutexインターフェイスを備えています。
ジル「SO-悪であるのをやめる」

Linuxカーネルコンテキストでは、スピン実装の唯一のロックはmutexインターフェイスを備えています。私はこの行を理解しています。拡大していただけますか?
セン

@Sen:彼は、Linuxのスピンロックがバイナリで動作する(ロックされているかどうか)ことを意味しました。セマフォとして動作する回転ロックを使用することができます。
マチェイピエチョトカ

「しかし、同じスレッドにアクセスしようとするロックスレッドが他のスレッドに取って代わられる場合、2番目のスレッドはCPUクォンタムを使い果たすまでリソースを単純に取得しようとします。」優先度の高いタスクがリソースにアクセスする必要がある場合はどうなりますか?単にキューに入れられますか?優先度の異なるタスク間でリソースを共有することを無効にした方が良いかもしれません。
Hibou57

@ Hibou57:はい、状態が一貫しておらず、リソースを使用すると「面白い」効果があるためブロックされます(たとえば、優先度の低いスレッドがリンクリストに何かを追加または削除する途中でした)。このステートメントのポイントは、スレッドがブロックされた場合、スケジュールされないため、スピンロックで待機しているスレッドがリソースを消費しないようにすることでした。リアルタイムシステムのロック(特に難しい)は別のトピックであり、それに答えるのに十分な知識はありませんが、これらのシステムは優先度の高い寄付やその他の手法を実装することがあります。
マチェイピエチョトカ

2

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

セマフォは、睡眠が問題ないプロセスコンテキストで使用できます。


1

スピンロックと バイナリセマフォ(1つだけが使用できるリソースを管理する)はほとんど同じです。違いは、スピンロックは実行するコードを管理し、バイナリセマフォは何らかの種類のリソース(CPU時間、表示出力など)を管理することです。

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.