一、页高速缓存
内容对应磁盘上的物理块的内存物理页面。
写缓存实现策略:
1)nonwrite:直接写磁盘,同时将缓存中数据失效。
2)write-through cache:自动更新内存缓存同时更新磁盘文件。
3)写回:写到缓存中并标记页面为脏,加入脏页链表中,由写回进程周期性写回磁盘。(linux使用的方法)
缓存回收策略:
1)最近最少使用LRU:跟踪页面的访问(或按照访问时间顺序的页链表)
2)双链策略:修改的LRU。维护活跃链表和非活跃链表。以队列的形式换出。(linux使用)
二、laddress_space
linux页高速缓存可以缓存任何基于页的对象,可以包含多个不连续的物理磁盘块。
address_space对象:管理缓存项和页IO操作,对应虚拟地址vm_area_struct的物理地址,定义在<linux/fs.h>中。
i_mmap :优先搜索树,将堆与radix树结合的快速检索书,搜索范围包括address_space中所有共享与私有的映射页面。
基树radixtree:每个address_space都对应唯一基树,是i二叉树,可以根据偏移量检索页。<linux/radix_tree.h>
操作: 提供了与页高速缓存交互的方法,包括读页、更新等。
三、fulsher线程
脏页写回的情况:
1)空闲内存低于特定阈值
2)臧晔在内存中驻留时间超过某个阈值
3)进程调用sync和fsync系统调用时
脏页写回由一群内核线程执行flusher。不同的flusher线程处理不同的设备队列,避免了一个忙磁盘其它饥饿的情况。现在flusher和每个设备关联。