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

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

ディスクブロックと一致するデータを持つバッファは、lru_listBUF_CLEANに古い順番にリンクされる。(クリーンなバッファと呼ぶ)

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

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

lru_listBUF_PROTECTEDは、各種バッファ操作で開放されないようにされたバッファ(BH_Protectedが立っている)をリンクするために用いられる。RAMディスクなどの用途に利用する場合に使用される。BH_Protectedが立ったバッファでも、lru_listBUF_DIRTYやlru_listBUF_LOCKEDにリンクされることもある。

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

img21.gif

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