脏页写入磁盘的机制与原理
在计算机系统中,内核会不断地将包含块设备数据的页面填充到页面缓存中。当进程修改某些数据时,对应的页面会被标记为脏页,也就是设置其PG_dirty标志。
1. 脏页延迟写入与问题
Unix 系统允许将脏页延迟写入块设备,这显著提高了系统性能。因为对缓存中的一个页面进行多次写操作,只需对相应的磁盘扇区进行一次缓慢的物理更新即可。而且,写操作不像读操作那样关键,因为进程通常不会因延迟写入而挂起,但往往会因延迟读取而挂起。由于延迟写入,每个物理块设备平均处理的读请求会比写请求多得多。
然而,将延迟写入策略发挥到极致有两个主要缺点:
-数据丢失风险:如果发生硬件或电源故障,RAM 中的内容将无法恢复,因此自系统启动以来所做的许多文件更新都会丢失。
-内存需求过大:页面缓存的大小,以及容纳它所需的 RAM 大小必须非常大,至少要与所访问的块设备大小一样。
因此,在以下情况下,脏页会被刷新(写入)到磁盘:
- 页面缓存过满,需要更多页面,或者脏页数量过多。
- 页面变为脏页后经过的时间过长。
- 进程请求刷新块设备或特定文件的所有待处理更改,这可以通过调用sync()、fsync()或fdatasync()系统调用来实现。
对于缓冲页,情况更为复杂。与每个缓冲页关联的缓冲区头允许内核跟踪每个单独块缓冲区的状态。如果关联的缓冲区头中至少有一个设置了B