我有一个关于脏页写回的问题。如果修改了部分页面数据,写回会将整个页面写入磁盘,还是仅将修改数据的部分页面写入磁盘?
2 回答
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 内核中,无论是否将块标记为可写脏,都通过一个唯一标识符:扇区号,因此任何小于扇区大小的东西都很难进行有效管理。
综上所述,不要忘记硬盘控制器本身也有写操作的最小块大小。