Linux Kernel(2.6)の実装に関するメモ書き

PageCache


Rev.9を表示中。最新版はこちら

PageCacheはファイルをキャッシュする。
キャッシュ単位はページ単位でファイルの先頭からページ単位に区切ってキャッシュする。
ファイルのRead/WriteはPageCacheを経由する。

PageCacheの管理方法

RadixTreeとLRUリスト(Active,Inactiveリスト)で管理される。

RadixTreeはi-node単位に持つ(i-node単位にaddress spaceがあり、そこにPageCacheのPageTreeのRootがある)。RadixTreeのキーはaddress space内でのページオフセット(ページ数)。i-nodeがブロックデバイスの場合はaddress spaceはデバイス全体を指すのでデバイス先頭からのページ数になる。

ページキャッシュはinode(正確にはaddress space)とファイル先頭からのオフセット(ページ数)でユニークに識別される。

ページキャッシュの構造を図1に示す。




図1 PageCacheの構造

  • inodeのi_mappingは、このinodeに対応するaddress_spaceを指す。
  • address_spaceのhostはinodeを指す。ブロックデバイスだった場合は、ブロックデバイスのinodeを指している。
  • page_treeはPageCacheであるRadixTreeへのポインタ。
  • RadiXTreeにはページオフセットをキーにpage構造体が登録されている。
  • pageのmappingは属しているaddress_spaceを指す(つまりinodeのaddress_space)。
  • indexはファイル先頭からのオフセットでファイルの何処をキャッシュしているかを示している。
  • pageに該当する物理ページにindexが指しているファイルの内容がキャッシュされている。

LRUリストは各Zone(struct zone)毎にあるActive,Inactiveリストが使われる。


[関連関数]
find_or_create_page()
PageCacheを割り当てる。

割り当てたPageCacheはRadixTreeとLRUリストに登録される。LRUリストはInactiveリストの方につながれる。

find_or_create_page() -> add_to_page_cache_lru() -> lru_cache_add() ->  __pagevec_lru_add() -> add_page_to_inactive_list() - Inactiveリストへ登録


find_get_page(mapping, offset)
PageCacheの検索ルーチン
mappingのoffsetページをキャッシュしているPageCacheを検索する。

mapping->page_treeのRadixTreeからoffset(ページ数)でPageCacheを検索


add_to_page_cache()
PageCacheを追加する。
RadixTreeへの追加のみで、LRUリストには追加されない。

pageにはPG_lockedがセットされる。


add_to_page_cache_lru()
add_to_page_cache()を呼んで、RadixTreeにPageCacheを登録してLRUリストにも登録する。

remove_from_page_cache()


[フラグ]
PG_uptodate
ページにデータが読みこまれてキャッシュが最新の状態になるとSetPageUptodate()で設定する。
mpage_end_io_read()参照。

[関連ページ]
物理ページ管理


最終更新 2006/07/10 13:48:06 - kztomita
(2006/03/27 14:03:40 作成)
添付ファイル
pagecache.png - kztomita


リンク
最近更新したページ
検索