バッファ管理。BufferAllocでキャッシュにヒットしない場合
BufferAllocでキャッシュにヒットしない場合
- BufferAlloc
- StrategyGetBuffer関数からバッファを取得する。
- バッファがダーティならフラッシュしてから利用。
- すでに使われたことがある?(BM_TAG_VALIDのビットが立っている)バッファについてはハッシュテーブルのパーティションをロック。
- ハッシュテーブルに追加しキャッシュする。他のバックエンドプロセスと衝突したらそれについて処理。
- バッファを使おうとしているのが自分だけでバッファがダーティでないことを確認できたらそれを返す候補とする。
- バッファのタグやフラグを再セット。
- すでに使われていた?(BM_TAG_VALIDのビットが立っている)バッファについてはハッシュテーブルから削除。
- バッファを返す。
- StrategyGetBuffer
- BM_TAG_VALIDの意味がよくわからない。
- ロックの処理が色々とおこなわれているけれどいまのところはスルー。
- clock sweepアルゴリズムについては宿題。コードを見る限りは単純そうだけど、よくわからない。
- ロックフリーGCLOCKページ置換アルゴリズムが参考になるのかも。
- Database Management Systemsにも記述がある。