【スピンロック】

スピンロック とは?

公開:
💡 鍵が空くまで、その場で確かめながら待つ

ロックが空くまで繰り返し状態を確かめながら待つ、排他制御の方式。短い待ち時間に向く場合があるが、待機中もCPU資源を使う。

📌 このページのポイント
鍵が空くまで、取得を繰り返し試す 持ち主 保護区間を実行 持ち主 ロックを解放 待ち手 取得に成功 待ち手:試す → 失敗 → また試す 待機コストと、眠らせて起こすコストを比べる
待機中にもCPUを使う方式。長い処理や眠る処理を保護区間に置かない。
ひよこ ひよこ
ロックを待つ方法に違いがあるの?
ペンギン先生 ペンギン先生
あるよ。スピンロックは「もう取れるかな」と繰り返し確かめて待つ方式だよ。一方、眠って待つ方式では、待つスレッドを休ませて別の仕事にCPUを回せる。実際のロックには両方を組み合わせたものもあるんだ。
ひよこ ひよこ
眠って待つほうがよさそうだけど?
ペンギン先生 ペンギン先生
待ち時間がごく短ければ、眠らせたり起こしたりする手間のほうが大きい場合があるよ。別のCPUで実行中の持ち主がすぐ鍵を返すなら、少し回って待つほうが都合がよいこともあるんだ。いつでも速いわけではないよ。
ひよこ ひよこ
使うときの注意は?
ペンギン先生 ペンギン先生
保護する処理を短くして、一般的なスピンロックを持ったまま入出力などで眠らないことだね。持ち主が動けないまま待ち手だけがCPUを使うと、進行を妨げる。割り込みから同じロックを取るかなど、実行環境の規則も大事だよ。
ひよこ ひよこ
書き換えるときだけ鍵をかければいい?
ペンギン先生 ペンギン先生
同時に読む側の保護も必要だよ。ほかの同期方式で安全を確保している場合を除き、同じ共有データに触る処理は同じルールを守るんだ。また、変数を眺めるだけでは排他にならず、取得の原子性とメモリ順序を備えたロックを使う必要があるね。
もっと詳しく知りたい人へ

Linuxのspinlock_tは必ず回り続けて待ちますか?

構成によります。PREEMPT_RTではspinlock_tの意味が変わり、RT-mutexを基にした待機が使われます。raw_spinlock_tは厳密なスピンロックです。一般的な概念と、特定のカーネルAPIの動作を区別します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「スピンロック」って出てきたら「眠らずに取得を試しながら待つロック」と思えればだいたいOK!

参考資料

← 用語集にもどる