页高速缓存和页回写

嵌入式学习Day6


1.先说页高速缓存是什么

Linux 读普通文件时,通常不是每次都直接访问磁盘,而是先看内存里有没有这页文件数据。如果有就称为缓存命中 比如你读一个文件的第 0~4095 字节:

以后再读这部分内容时:


2.页高速缓存 缓存的是什么

它缓存的是文件的内容页,不是进程私有匿名页 1)文件页(file-backed page)

2)匿名页(anonymous page)


3.页高速缓存放在哪里

从内核视角,文件有一个 address_space 对象,里面管理这个文件对应的页缓存。

文件 -> inode -> address_space -> cached pages

4.当进程执行 write() 往磁盘文件写数据时,页高速缓存到底怎么参与

目前有三种写缓存策略

4.1不缓存(nowrite)’


4.2 写透缓存(write-through)

写操作既更新内存缓存,也同时更新磁盘文件。 也就是:

4.3 回写(write-back)

Linux 采用的主要方式


5.缓存回收策略

5.1缓存回收的目标

5.2 回收规则


5.3 最近最少使用(LRU)策略

理想策略是难以实现的,所以对于通用的回收算法,最常用的就是LRU

LRU 被一次性访问污染缓存

5.4 linux系统改进的LRU

但在操作系统里,页访问是极其频繁的:


Linux系统将其缓存回收机制设置为一个“两级候选机制” 第一级:inactive list 新页、冷页、可疑页先放这里。 第二级:active list 只有那些被证明更有复用价值的页,才进入这里。 于是回收时:

页怎么从 inactive 升到 active?

这就解决了LRU之前害怕访问大文件是别一次性访问污染的问题


6. address_space结构体

address_space 代表一个“可分页缓存的对象”的页缓存空间

文件 -> inode -> address_space -> cached pages

你可以把 address_space 理解成某个文件在内存里的“页缓存目录”他记录着:


6.1 为什么需要address_space结构体

从文件看来,数据是线性的,但在磁盘上,这些数据未必连续存放。比如文件的第 0 页逻辑上是连续 4KB,但底层磁盘块可能分散在不同位置。所以页缓存不能简单按“设备名 + 物理块号”来索引。

这时候就要回忆一下之前的块IO层了,使用IO读取数据的时候是使用设备名+物理块号来索引的 页高速缓存和页回写 配图 1