図1 スピン・ロックによる排他制御。1つの資源に対して1つのロック変数をメモリー上に用意します。そして,ロック変数を取得できたCPUだけが資源にアクセスできます。
図1 スピン・ロックによる排他制御。1つの資源に対して1つのロック変数をメモリー上に用意します。そして,ロック変数を取得できたCPUだけが資源にアクセスできます。
[画像のクリックで拡大表示]

 マルチプロセッサ環境において,各CPUが同じ資源(リソース)に同時アクセスする際に用いられる排他制御の仕組みです。Linux以外のOSでも利用されている,一般的な排他制御機構です。
 Linuxのスピン・ロックでは,1つの資源に対して1つのロック変数をメモリー上に用意します。そして,ロック変数を取得できたCPUだけが資源にアクセスできます(図1)。ロック変数を取得できなかったCPUは,ロック変数が取得できるまでループして待ち続けます。この状態を「ビジー・ウエイト」と呼びます。

 スピン・ロックは,マルチプロセッサ・システムで手軽に排他制御を実現する方法としてよく利用されています。ただし,ビジー・ウエイト中のCPUは処理が実行できずに待たされた状態になりますから,ビジー・ウエイトが頻繁に発生すると処理効率が悪くなります。処理効率を考えるなら,スピン・ロックで排他制御する資源をなるべく細かく分けるなどの工夫が必要です。

 スピン・ロックの一種に,「読み書き用スピン・ロック」があります。このスピン・ロックでは,CPUからの読み出し処理が競合した場合にはロックを行わず,どちらからも資源にアクセスできます。書き込むときのみ,通常通り排他制御を行います。読み書き用スピン・ロックは資源に対する参照処理が多い場合に有効です。