バッファの確保

バッファの確保はgetblk関数によって行われる。(伝統的UNIXと同じ)バッファ管理のアルゴリズムの基本は、「Design Of UNIX」にあるものと思われる。getblk関数の引き数は、デバイス番号、ブロック番号、バッファサイズの三つである。大雑把なアルゴリズムは以下のとおりバッファキャッシュ域本体とその領域を管理するbuffer_head構造体は必要に応じて動的に拡張される。

   getblk(デバイス番号、ブロック番号, バッファサイズ)
      for(;;) {
           if(目的のバッファがハッシュテーブルに見つかった) {
                バッファの参照数を一つ上げる
                if(バッファがクリーンか?)
                     そのバッファをlru_list[BUF_CLEAN]の最後に繋ぎなおす
                return バッファ;
           }

           if(free_list[]から目的のサイズのバッファを取ってくるのに成功) {
               バッファヘッドを初期化し、ハッシュに登録する。
               return バッファ;
           }

           新たにメモリを確保しfree_list[]に登録(refill_freelist関数)
      }

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