1

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

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

4

1 回答 1

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 相同。

于 2016-08-01T23:25:24.963 回答