スピンロック関数

下記、spin_lock(&val)が成功した後、ロック変数valで保護された資源を安全にアクセス可能となる。資源へのアクセスが終了したら、spin_unlock(&val)で資源のロックの開放を行う。この実装上、ロック時間は最低限の時間にしなければならない。

  • spin_lock(&val)
    • 変数valのロックを行う。 ロック出来ない場合は、成功するまでビジーウェイトする。
  • spin_unlock(&val)
    • 変数valのロック解除を行う。
  • spin_trylock(&val)
    • 変数valのロックを行う。 即ロック出来ない場合は、エラーとなる。

もし、複数CPU間で共有される資源が割り込みハンドラからも利用されるのであれば、ローカルCPUへ対する割り込みも禁止する必要がある。

  • spin_lock_irq(&val)
    • ローカルCPUの割り込みを禁止した上で、変数valのロックを行う。 ロック出来ない場合は、成功するまでビジーウェイトする。 ローカルCPUの割り込みを禁止することにより、資源アクセスの 可能性のある割り込みがそのCPU上で発生することを抑制する。
  • spin_lock_irqsave(&val, flags)
    • ローカルCPUの割り込みを禁止した上で、変数valのロックを行う。 ロック出来ない場合は、成功するまでビジーウェイトする。 flagsには、直前の割り込み禁止状態が保存される。
  • spin_unlock_irq(&val)
    • 変数valのロック解除と、ローカルCPUの割り込み禁止解除を行う。
  • spin_unlock_irqrestore(&val, flags)
    • 変数valのロック解除し、ローカルCPUの割り込み状態をflagsに 示された値にする。

もし、複数CPU間で共有される資源がソフト割り込みハンドラからも利用されるのであれば、ローカルCPU上でのソフト割り込み実行も禁止する必要がある。

  • spin_lock_bh(&val)
    • ローカルCPU上でのソフト割り込みハンドラ実行を禁止した上で、 変数valのロックを行う。 ロック出来ない場合は、成功するまでビジーウェイトする。
  • spin_unlock_bh(&val)
    • 変数valのロック解除と、ローカルCPU上でのソフト割り込み ハンドラ実行を許可する。

また、readロック、writeロックのメカニズムも提供されている。一つの資源を複数のプロセスから同時にreadロックを行い、同時に資源を参照することが可能である。ただし、資源がwriteロックされている場合は、readロックはビジーウェイトさせられる。逆にreadロックをかけれれている資源に対しwriteロックを行おうとした場合もビジーウェイトさせられる。

参照頻度の高く、かつ更新を伴わない参照が多い資源に関しては、単純なspin_lock関数より複数のプロセスからの同時アクセスを許すこれらのロックメカニズムの方が効率が良い。割り込み禁止、ソフト割り込み禁止と組合せたreadロック、writeロック関数も用意されている。

  • read_lock(&val)
    • 資源のreadロックを行う。もし既に資源がwriteロックされている 場合は、writeロックが解除されるまでビジーウェイトする。
    • 複数のプロセスから多重にロックすることが可能。
  • write_lock(&val)
    • 資源のwriteロックを行う。もし既に資源がreadロックまたは writeロックされている場合は、ロックが解除されるまで ビジーウェイトする。
  • write_trylock(&val)
    • 資源のwriteロックを行う。もし既に資源がreadロックまたは writeロックされているされている場合はエラーとなる。
  • read_unlock(&val) write_unlock(&val)
    • readロックまたはwriteロックの解除を行う。

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1