页高速缓存和页回写
页高速缓存为了减少对磁盘的I/O操作,将磁盘数据缓存在物理内存中,提高访问速度。
- 访问内存的速度比访问硬盘速度快几个数量级
- 局部性原理
1. 缓存方法
页高速缓存由内存中的物理页面组成,对应磁盘上的物理块。
- Write-through: write is done synchronously both to the cache and to the backing store.
- Write-back (also called write-behind): initially, writing is done only to the cache. The write to the backing store is postponed until the cache blocks containing the data are about to be modified/replaced by new content.
- Least Recently Used
- The Two-List Strategy(LRU/K)
2. Linux页高速缓存
Linux页高速缓存的目标是缓存任何基于页的对象,包含各种类型的文件和各种类型的内存映射。为了普遍性,Linux使用一个新对象管理缓存项和页I/O操作——address_space结构体。
- address_space结构体
address_space定义在linux/fs.h中,对于一个文件,它可以对应多个vm_area_struct,但只有一个address_space。
|
|
- address_space操作
与vfs对象类似,a_ops域指向了address_space相关的操作函数,由结构体address_space_operations表示。
|
|
- 基树
基树可以高效地检索页缓存,相关代码在lib/radix-tree.c,使用时包含头文件linux/radix-tree.h
3. flush线程
由于页高速缓存的存在,写操作会被延迟,内存中的脏数据会在特定情况下写回磁盘:
- 当空闲内存低于一个特定阈值,内核必须将脏页写回磁盘释放内存
- 当脏页在内存中驻留时间超过一个特定的阈值,内核必须将超时脏页写回磁盘
- 用户调用sync()和fsync(),内核会按要求执行回写操作
这些工作由内核的flusher线程执行。实现代码在mm/page_writeback.c和mm/backing-dev.c,回写机制实现在fs/fs-writeback.c
更多阅读: