Mais conteúdo relacionado
Semelhante a Linuxカーネル解読室輪講@はてな 第6章
Semelhante a Linuxカーネル解読室輪講@はてな 第6章 (20)
Linuxカーネル解読室輪講@はてな 第6章
- 11. Spin lock いわゆる悲観的ロック CPUのアトミックな操作命令に依存 HTに配慮した実装 OoOEへの配慮が必要(メモリバリア) ロック取得のたびに、キャッシュラインのフラッシュが発生する
- 12. Spin lock 実装例(from Wikipedia) lock: # ロック変数。1 = ロック済み, 0 = ロックされていない dd 0 spin_lock: moveax, 1 # EAX レジスタに 1 をセット loop: xchgeax, [lock] # アトミックにEAXレジスタとロック変数の値を交換 # ロックには常に 1 が格納され、以前の値が EAX レジスタに格納される。 test eax, eax # EAX 自身をチェック。EAX がゼロならば プロセッサのゼロフラグがセットされる。 # EAX が 0 なら、ロックは解放状態から新たに確保されたとみなせる。 # そうでなければ、EAX は 1 であり、ロックを獲得できていない。 jnz loop # ゼロフラグがセットされていないときは XCHG 命令に戻る。 # これはロックが既に他に獲得されていた場合で、スピンする必要がある。 ret # ロックを獲得できたので、呼び出した関数へ戻る。 spin_unlock: moveax, 0 # EAX レジスタに 0 をセット xchgeax, [lock] # アトミックに EAX レジスタとロック変数を交換 ret # ロックを解放 出典: http://ja.wikipedia.org/wiki/スピンロック
- 15. RCU Read-Copy-Update リソースにロック変数を準備しない手法(->参照時の変数チェックが必要ない) 更新の遅延処理が可能 コピーGCの発想に近い? 更新処理はspin lock等を用いて排他処理する 更新の手順: Read&Copy 元データの構造体をコピーして新しいデータを作る Update 元データへの参照(ポインタ)を新しいデータに向ける 元データを参照しているスレッドが無くなったと判断されたら(※)元データをGCする ルール 「読み手はRCUクリティカルセクションでは絶対にコンテキストスイッチしてはいけない」 IP routing tableの更新等に利用 更新には(かなり)時間がかかる(全プロセスが一通り起床するまで?) ※各CPUがRCUクリティカルセクションを抜けたかどうかは、カーネル内のCPUビットマップにより管理されている。 スケジューラからRCUがコールバックされるので、各CPUがビットマップ上のRCU状態フラグを都度更新する。