[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:ページに対するI/O要求の発行
}}}
= ページに対するI/O要求の発行 = #SECTION03330000000000000000
generic_readpage関数は、要求のあったiノードのあるオフッセット位置から1ページ分の大きさのデータをページに読み込む汎用ルーチンである。(NFSのようにローカルディスク上にデータのないファイルシステムは別の処理ルーチンを用意)bmap関数(各ファイルシステムごとに異なる)を用いて、iノードとオフセットからI/O対象となるブロック番号群を計算し、brw_page関数を呼び出す。このアルゴリズムからも ページサイズ>=ブロックサイズでなければならないことが読み取れる。[[Footnote(VAXのような512byteページマシンだと大変だ)]]
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 [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]