页高速缓存
页高速缓存
页高速缓存是Linux实现磁盘缓存,由内存中的物理页面组成,内容对应磁盘上的物理块
- 作用:减少对磁盘的IO操作
- 实现:通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问
- 读操作:比如read。检查数据是否在页高速缓存,有则直接拷贝到进程地址空间;无则调度块IO操作从磁盘中读取数据再放入页,再将页加入页高速缓存,再拷贝到进程地址空间
- 写操作:
- 页回写。直接写到页高速缓存,标记为“脏”,并加入到脏页链表,由回写进程周期性将脏页链表中的页写回磁盘
- 如果页高速缓存没有该页,分配空闲项;内核创建一个写请求,数据从用户空间拷贝到了内核缓冲(新版本内核缓冲就是页高速缓存),最后将数据写入磁盘
- 好处:延迟写回磁盘,减少操作次数
- 缓存回收:Linux选择不脏的页进行替换,如果没有足够的干净页面,内核强制进行页回写
address_space
Linux用来管理缓存项和页IO操作,是虚存区VMA的物理地址对等体
- 一个文件只能由一个address_space,但可以有多个vm_area_struct
- 如何检查页是否在页高速缓存:使用基树,通过address_space和偏移量来搜索
- 和虚拟文件系统中的inode有关联
flusher线程
脏页写回磁盘时机
- 当空闲内存低于一个特定阈值时,内核必须把脏页写回磁盘以释放内存,因为只有不脏的内存才能回收
- 脏页在内存驻留时间超过一个特定阈值,内核把超时的脏页写回磁盘,确保脏页不会无限期驻留内存(个人认为避免断电导致长时间多次修改都丢失)
- 用户进程显示调用回写操作
- 线程会周期性运行将超时脏页写回