バッファ管理。BufferAllocでキャッシュにヒットしない場合

BufferAllocでキャッシュにヒットしない場合

  • BufferAlloc
    • StrategyGetBuffer関数からバッファを取得する。
    • バッファがダーティならフラッシュしてから利用。
    • すでに使われたことがある?(BM_TAG_VALIDのビットが立っている)バッファについてはハッシュテーブルのパーティションをロック。
    • ハッシュテーブルに追加しキャッシュする。他のバックエンドプロセスと衝突したらそれについて処理。
    • バッファを使おうとしているのが自分だけでバッファがダーティでないことを確認できたらそれを返す候補とする。
    • バッファのタグやフラグを再セット。
    • すでに使われていた?(BM_TAG_VALIDのビットが立っている)バッファについてはハッシュテーブルから削除。
    • バッファを返す。
  • StrategyGetBuffer
    • デフォルト4096のフレーム(ページ?)の中から空いているものがあればそのバッファを返す。
    • 空いていなければclock sweepというアルゴリズムを使って使えるものを探して返す。
    • clock sweepアルゴリズムを使っても見つからなければエラー扱い。通常は起きない?