カーネル内の一部のコンテキストでは、スレッドをブロックできません。該当するコンテキストとして、ハイレベル割り込みコンテキストや、ディスパッチャの状態を操作するコンテキストがあります。これらのコンテキストでは、スレッドをブロックできないため、適応型ロックを使用できません。これらのコンテキストでクリティカルセクションに対する相互排他を実現するには、適応型ロックの代わりに「スピンロック」を使用します。スピンロックは、その名前からわかるように、競合が発生すると、所有スレッドがロックを解放するまで「スピン」します。スピンロック関連の 3 つのプローブについては、表 18–2 のとおりです。
表 18–2 スピンロックプローブ
spin-acquire |
スピンロックの獲得後すぐに起動する保持イベントプローブ。 |
spin-spin |
保持されているスピンロックでスピンしたスレッドが、このスピンロックを正常に獲得したあと起動する競合イベントプローブ。spin-acquire と spin-spin の両方が有効なときは、spin-spin のほうが先に起動します。spin-spin の arg1 には、「スピン時間」が入ります。スピン時間とは、ロックが獲得されるまでスピン状態で消費されたナノ秒数を示す値です。スピンカウントは、スピン時間の比較に利用されます。単独ではほとんど利用されません。 |
spin-release |
スピンロックの解放後すぐに起動する保持イベントプローブ。 |
スピンロックよりも適応型ロックのほうが一般的です。以下のスクリプトで、2 種類のロックのそれぞれの合計を表示すると、この観察が裏付けられます。
lockstat:::adaptive-acquire /execname == "date"/ { @locks["adaptive"] = count(); } lockstat:::spin-acquire /execname == "date"/ { @locks["spin"] = count(); }
このスクリプトの実行を開始したら、別のウィンドウを開いて date(1) コマンドを実行します。DTrace スクリプトを終了すると、次のような出力が得られます。
# dtrace -s ./whatlock.d dtrace: script './whatlock.d' matched 5 probes ^C spin 26 adaptive 2981 |
この出力からわかるように、date コマンドの実行中に獲得されたロックの 99 パーセントは適応型ロックです。date コマンドのような単純な処理でも、このように多くのロックが獲得されます。Solaris カーネルに代表されるきわめてスケーラブルなシステムでは、きめ細かいロック処理が要求されます。たくさんのロックを獲得する必要があるのは、このためです。