ページに対するI/O要求の発行

generic_readpage関数は、要求のあったiノードのあるオフッセット位置から1ページ分の大きさのデータをページに読み込む汎用ルーチンである。(NFSのようにローカルディスク上にデータのないファイルシステムは別の処理ルーチンを用意)bmap関数(各ファイルシステムごとに異なる)を用いて、iノードとオフセットからI/O対象となるブロック番号群を計算し、brw_page関数を呼び出す。このアルゴリズムからも ページサイズ>=ブロックサイズでなければならないことが読み取れる。*1

brw_page関数は、バッファキャッシュとの整合性を考慮しつつページに対するI/O要求を発行する。以下に大雑把なアルゴリズムを示すが、一つのファイルのデータがページキャッシュとバッファキャッシュの両方に載ってしまう作りになっていることがわかる。

    brw_page(READ/WRITE, ページ, ブロックのリスト)
    バッファヘッドをハントしページとリンク
        do {
            if(バッファハッシュにヒットした) {
                if(バッファが有効でない) {
                    if(READ) READ I/O要求の発行(ll_rw_block)
                    バッファのI/O完了を待つ
                }
        if(READ) {
          バッファからページへデータをコピー
                } else {
          ページからバッファへデータをコピー
          バッファをDirtyにする
                }
        バッファの開放(brelse)
        continue
            }
        } while(ブロックのある間)
        I/O要求の発行(ll_rw_block関数)


(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1


  1. *1VAXのような512byteページマシンだと大変だ