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

block_read_full_page関数は、要求のあったiノードのあるオフッセット位置から1ページ分の大きさのデータをページに読み込む汎用ルーチンである。block_write_full_page関数は、同様に1ページ分の大きさのデータをページへ書き込む汎用ルーチンである。

ただし、I/O処理はページ単位でしか行えないため、書き込み処理は少々面倒な操作も行えるようになっている。block_prepare_write関数は、書き込み要求がページ単位でない場合、まず半端な領域のデータをディスクから読み込む、または0クリアする処理を行い、その後generic_commit_write関数によりページ単位の書き込みを行う。

(NFSのようにローカルディスク上にデータのないファイルシステムは独自の処理ルーチンを用意)

各I/O関数は、bmap関数(各ファイルシステムごとに異なる)を用いて、iノードとオフセットからI/O対象となるブロック番号群を計算し、I/Oを起動する。このアルゴリズムからも ページサイズ>=ブロックサイズでなければならないことが読み取れる。*1

上記ページI/O関数群は、I/O要求のあったページを先に述べたバッファに分解し、バッファキャッシュの処理ルーチンを利用してI/Oを行う。ローカルディスク用のファイルシステムのページキャッシュは同時にバッファキャッシュハッシュにも登録されることになる。


 

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


  1. *1