【问题标题】:Is reading from disk atomic in sectors?从扇区读取磁盘是原子的吗?
【发布时间】:2020-02-03 14:43:55
【问题描述】:

据我了解,或多或少所有系统都将写入磁盘作为扇区的原子写入(通常为 512 或 4096 字节)。但是阅读呢?

即如果我有一个使用 read(2) 命令顺序读取文件的进程,是否有可能在我完成读取整个扇区之前覆盖该扇区,或者整个扇区是否以原子操作复制到内存中?

让我们举一个玩具的例子;我有一个有mmap:ed 文件的制作人。这个生产者的任务是在第一个扇区的某个地方写下字母“A”,然后将它移动到另一个位置,仍然在第一个扇区中。由于生产者不知道何时将内存写入磁盘,因此它确保始终在新地址中写入“A”,然后再将其从旧地址中删除。因此,当查看磁盘上的文件时,可能存在 2 个“A”,但绝不会少于 1 个。但考虑一个扇区的读取不是原子的情况(例如,当使用另一个 mmapMAP_SHARED 读取时?),那么当消费者进程开始读取文件时,“A”可能在扇区的后半部分,但当消费者进程到达扇区的第二部分时,可能会发生新的(原子)写入扇区发生在“A”移动到扇区的前半部分的地方。如果消费者继续阅读该行业的后半部分,它将在该行业的任何地方都看不到任何“A”。使用read(2) 时这仍然存在风险吗?

【问题讨论】:

标签: linux file file-io io system-calls


【解决方案1】:

实际上,NAND 闪存、硬盘和 CD-ROM 将是扇区读取原子,因为硬件无法同时从同一块读取和写入。此外,它们存储每个扇区的校验和,因此任何损坏的写入都将作为读取错误被丢弃。

但是,在您的情况下,这些都不重要,因为 read/write/mmap 在 VFS 上运行,而不是直接在设备上运行。当您从 mmap'd 页面执行 read 时,您会得到该页面的简单非原子副本,它可能确实不会显示“A”。

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2020-10-11
    • 2014-04-30
    • 2023-03-23
    • 2013-11-20
    • 2013-06-04
    • 2012-09-02
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多