为什么设计缓存?
1. 存储设备访问速度的巨大差异
2. temporal
如何设计缓存?
1. 大小
2. 对齐,方便寻址
3. 一致性(主要是写策略)
3.1 nowrite
3.2 write-through cache
3.3 回写,标dirty,按阈值回写
回写又要考虑何时写? 怎么写
3.3.1 按时间定期回写
3.3.2 按实际大小
3.3.3 按脏页百分比
3.3.4 调用sync(),fsync()
回写方式
1. 阻塞写 stop process
2. 异步写, 启动一个线程
2.6之后由一群内核线程(flusher线程)执行wirteback
4. 缓存回收
有缓存就要考虑其回收
LRU及其他算法(以前是按时间的单链现在是双链(甚至n链LRU/n),单链对只访问一次文件再不访问的情景很不好)
页面缓存都缓存什么?
读写操作时,缓存如下文件:
* 正规文件
* 块设备文件
* 内存映射文件
若页是4KB,物理块是512B,那一个页可能包含多个块,并且可以不连续.
所以索引不能用设备名称和块号做page cache中数据的索引
为什么不用设备号,块以及inode进行索引?
因为Linux想缓存除了文件系统之外的可以基于页的对象
所以通过结构体address_space来管理缓存和页I/O
页面缓存不同进程共享. (通过虚拟地址vm_area_struct, 即文件可以有多个虚拟地址,但是物理存内存只一份)
网友评论