【问题标题】:File-system: Overwriting data of equal length文件系统:覆盖等长的数据
【发布时间】:2016-12-06 16:02:36
【问题描述】:

我有一个项目,我必须非常频繁地更新磁盘上的数据以防断电。当用相等长度的数据覆盖文件中的 512b(我的驱动器的 1 个扇区)时,文件系统是否会标记已更改的扇区并在准备刷新时在磁盘上更新它们?还是每次刷新更改时都会写入整个文件?我主要关心 ext4,但我很好奇它是否与每个文件系统都相同。

如果标准不是跟踪更改而是覆盖整个文件,有没有办法改变这一点?一些写入选项?

【问题讨论】:

    标签: filesystems overwrite ext4 sector


    【解决方案1】:

    一般而言,Linux 文件缓存在页面缓存中,并且页面是否脏在页面级别进行跟踪。在 Intel x86 平台上,页面大小为 4k,所以如果你弄脏了 4k 页面,它会被写回 4k 页面。

    如果您只想覆盖单个 512 字节扇区,并且您有一个具有 512 字节扇区的 HDD,则可以使用 O_DIRECT 标志打开文件,如果您发出 512 字节写入,则文件偏移量为512 字节的倍数,并且您写入源的内存缓冲区也是 512 字节对齐的,那么您可以绕过页面缓存,写入将直接进入磁盘(因此为 O_DIRECT)。

    请注意,许多现代磁盘实际上使用 4k 物理扇区,但出于向后兼容性的原因,它们正在模拟 512 字节扇区。这些磁盘有时称为 512e 扇区(e 表示仿真)。在这些驱动器上,如果执行 512 字节扇区写入,磁盘将执行读取-修改-写入循环,因为驱动器内部一次只能写入 4k。您可以看到这会影响性能,但从功能的角度来看,它与传统的老式 512 扇区 HDD 相同。

    【讨论】:

    • 在一个 1mb 的文件中,如果我写了 300b 的 512b 扇区,它仍然只会覆盖一个扇区吗?它只会在擦除要覆盖的扇区之前对其他 212b 执行读取操作?
    • 如果使用直接I/O,则必须先进行直接I/O读取,然后再进行直接I/O写入,并且直接I/O操作必须遵循直接I/O规则——所以你必须进行 512 对齐读取,修改 300 字节,然后执行直接 I/O 写入,也遵循直接 I/O 规则 --- 所以缓冲区必须在 512 上对齐字节边界,要写入的偏移量必须是 512 字节对齐,长度必须是 512 字节的倍数。
    • 如果你做一个缓冲写,那么它会经过页面缓存,这意味着一个4k的读/修改/写周期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2015-11-29
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多