1. pagecache
页高速缓存, 简称页高缓.
pagecache 是通过将磁盘中的数据缓存到内存中, 从而减少磁盘I/O操作, 从而提高性能.
1.1. pagecache 的管理
linux 通过 radix tree 和两个双向链表管理 pagecache.
radix tree 是一种搜索树, 用于快速查找脏的 (dirty) 或回写的 (writeback) 页面.
active_list 和 inactive_list 两个双向链表, 用于回收 pagecache.
active_list 中的 page 被认为是 hot, 内存回收时不能释放; 之后在 inactive_list 中的 page 才可以回收.
首次缓存数据的 page 会被加入到 inactive_list 中, 已经在 inactive_list 中的 page 再次访问就会移入 active_list 中.
这两个链表都使用了伪 LRU 算法, 从尾部加入, 从头部移除.
如果 active_list 中 page 数量远远大于 inactive_list, 那么 active_list 头部的就会被移入 inactive_list 中, 从而维持两个链表的平衡.
1.2. 读
当内核发起一个读请求时, 首先检查请求的数据是否在 pagecache 中, 如果没有命中 (cache miss), 则从磁盘中读取数据, 并缓存起来, 之后读相同文件的请求就能命中 (cache hit) 了.
pagecache 可以只缓存文件的部分内容, 不需要把整个文件都缓存起来.
1.3. 写
pagecache 缓存的存储设备称为后备存储 (backing store);
当内核发起一个写请求, 会直接往 page 中写入, 后备存储中的内容不会直接更新. 内核会将被写入的 page 标记为 dirty, 之后内核会周期性的写回到磁盘上.