【问题标题】:writeback of dirty pages in linuxlinux中脏页的写回
【发布时间】:2013-09-27 05:20:06
【问题描述】:

我有一个关于脏页写回的问题。如果修改了部分页面数据,回写是会将整个页面写入磁盘,还是仅将修改数据的部分页面写入磁盘?

【问题讨论】:

    标签: linux memory-management kernel


    【解决方案1】:

    x86 系统上的内存管理硬件的粒度为 4096 字节。这意味着:无法找出一个 4096 字节页面的哪些字节真正改变了,哪些没有改变。

    理论上磁盘驱动系统可以检查字节是否被改变,并且不会写入没有改变的512字节块。

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

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

    【讨论】:

    • 是的,需要强调的是,用于指示页面是否脏的这一 SINGLE 位信息在每个页面的 PTE 中。因此,单个位只能指示该 PAGE 是否脏,但当然,这是硬件分页机制:页大小也可以更改(有其他后果)。
    【解决方案2】:

    在每次硬件中断时,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 内核中,无论是否将块标记为可写脏,都通过一个唯一标识符:扇区号,因此任何小于扇区大小的东西都难以有效管理。

    说了这么多,别忘了硬盘控制器本身也有写操作的最小块大小。

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 2017-02-17
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2021-10-20
      • 2019-02-15
      相关资源
      最近更新 更多