バッファキャッシュの構造

キャッシュしているバッファは高速に検索できるよう下図のようにハッシュ管理(hash_table[])されている。ハッシュ値は、デバイス番号とブロック番号から計算される。

ディスクブロックと一致するデータを持つバッファは、lru_listBUF_CLEANに古い順番にリンクされる。(クリーンなバッファと呼ぶ) バッファの解放処理が行われる場合は、lru_listBUF_CLEANの先頭にあるものから解放される。このため、バッファへのアクセスがある度にそのバッファをlru_listBUF_CLEANの最後に繋ぎ直し、バッファの解放処理の候補とならないようにしている。lru_listBUF_CLEANは、伝統的なUNIXのバッファフリーリストに相当する。

書き込みのあったバッファは基本的に即ディスクには書き込むことはせず、遅延書き込みとしている。(性能向上が目的)遅延書き込みのバッファはBH_Dirtyフラグを立てた後、lru_listBUF_DIRTYにリンクされる。これらのデータは、いづれbdflushデーモンなどにより古いバッファから順にディスクへ書き戻される。書き戻されたあとは再びlru_listBUF_CLEANに繋ぎ直される。

I/O処理中のバッファはロックし(BH_Lockを立てる)、他のプロセスからのアクセスをブロックする。書き込みI/O処理中のバッファはlru_listBUF_LOCKEDにリンクされる。

利用されていない空のバッファは、バッファサイズ毎に分類されフリーリストfree_list[]に繋げられている。

img19.gif

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