在linux中写回脏页面

时间:2013-09-27 05:20:06

标签: linux memory-management kernel

我对脏页的回写有疑问。如果页面数据的一部分被修改,写回会将整个页面写入磁盘,还是只将部分页面写入修改过的数据?

2 个答案:

答案 0 :(得分:3)

x86系统上的内存管理硬件的粒度为4096字节。这意味着:无法确定4096字节页面的哪些字节真正发生了变化,哪些字节未发生变化。

理论上,磁盘驱动程序系统可以检查字节是否已更改,而不是写入尚未更改的512字节块。

但是这意味着 - 如果块不再在磁盘高速缓存中 - 必须从硬盘读取页面以检查它是否在写入之前发生了变化。

我认为Linux不会这样做,因为从磁盘读取页面会花费太多时间。

答案 1 :(得分:1)

在EACH硬件中断时,CPU希望尽可能多地写入硬盘控制器可以处理的数据 - 这个大小由我们定义为blksize(或Linux中的ONE扇区):

http://en.wikipedia.org/wiki/Disk_sector

https://superuser.com/questions/121252/how-do-i-find-the-hardware-block-read-size-for-my-hard-drive

但是对于大文件等待太长时间的单个中断可能会使系统显示无响应,因此将块分解为更小的大小(如512字节)是合乎逻辑的,这样CPU可以处理其他任务,同时将每个512字节向下传输。因此,无论您是更改了一个字节还是511个字节,只要它在该单个块内,所有数据都会同时写入。在整个linux内核中,将块标记为脏写入或不写入,所有内容都由单个唯一标识符组成:扇区号,因此任何小于扇区大小的内容都难以进行有效管理。

所有这些都说,不要忘记硬盘控制器本身也有最小的块大小用于写入操作。