【发布时间】:2013-09-27 05:20:06
【问题描述】:
我有一个关于脏页写回的问题。如果修改了部分页面数据,回写是会将整个页面写入磁盘,还是仅将修改数据的部分页面写入磁盘?
【问题讨论】:
标签: linux memory-management kernel
我有一个关于脏页写回的问题。如果修改了部分页面数据,回写是会将整个页面写入磁盘,还是仅将修改数据的部分页面写入磁盘?
【问题讨论】:
标签: linux memory-management kernel
x86 系统上的内存管理硬件的粒度为 4096 字节。这意味着:无法找出一个 4096 字节页面的哪些字节真正改变了,哪些没有改变。
理论上磁盘驱动系统可以检查字节是否被改变,并且不会写入没有改变的512字节块。
然而,这意味着 - 如果块不再在磁盘缓存中 - 必须从硬盘读取页面以检查它是否在写入之前发生了变化。
我不认为 Linux 会这样做,因为从磁盘读取页面会花费太多时间。
【讨论】:
在每次硬件中断时,CPU 都希望尽可能多地写入硬盘控制器可以处理的数据——这个大小由我们定义为 blksize(或 ONE 扇区,在 Linux 中):
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
但是等待大文件的 SINGLE 中断太久可能会使系统显得无响应,因此将块分成较小的大小(如 512 字节)是合乎逻辑的,以便 CPU 可以在传输每个 512 字节的同时处理其他任务.因此,无论您更改了一个字节还是 511 个字节,只要它在该单个块内,所有数据都会同时写入。在整个 linux 内核中,无论是否将块标记为可写脏,都通过一个唯一标识符:扇区号,因此任何小于扇区大小的东西都难以有效管理。
说了这么多,别忘了硬盘控制器本身也有写操作的最小块大小。
【讨论】: