スピンロックとセマフォの基本的な動作上の違いは何ですか?
答え1
どちらも制限されたリソースを管理します。まず、バイナリセマフォ(ミューテックスロック)とスピンロックの違いを説明します。
スピンロック忙しい待機が行われます。つまり、ループを実行し続けます。
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)
答え2
スピンロックは、休止を許可しない割り込みコンテキストで使用されます。これらは、緊密な循環を介してポーリングし、リソースを取得する前に他のタスクを実行しません。主にISRに使用され、より安全で効率的です。
セマフォは、省電力モードが許可されているプロセスコンテキストで使用できます。
答え3
私の簡単な答えは次のとおりです。スピンロックとバイナリ1 つだけ使用できるリソースを管理するセマフォはほぼ同じです。 2つの違いは、スピンロックが実行するコードを管理し、バイナリセマフォが単一のリソース(CPU時間、ディスプレイ出力など)を管理することです。
ただし、汎用セマフォはリソースにアクセスする複数のスレッドを管理できます。これは複数に分割できますが、制限(メモリ、ネットワーク帯域幅など)が適用されます。
簡単に言えば、スピンロックはリソースが利用可能かどうかセマフォに継続的に尋ねることができます。 (トイレを使用する必要があり、他の人が終わるまで待つ子供を想像してください。)
出典:システムプログラミングの紹介、オペレーティングシステム、ウィキペディア