【发布时间】:2020-02-03 14:43:55
【问题描述】:
据我了解,或多或少所有系统都将写入磁盘作为扇区的原子写入(通常为 512 或 4096 字节)。但是阅读呢?
即如果我有一个使用 read(2) 命令顺序读取文件的进程,是否有可能在我完成读取整个扇区之前覆盖该扇区,或者整个扇区是否以原子操作复制到内存中?
让我们举一个玩具的例子;我有一个有mmap:ed 文件的制作人。这个生产者的任务是在第一个扇区的某个地方写下字母“A”,然后将它移动到另一个位置,仍然在第一个扇区中。由于生产者不知道何时将内存写入磁盘,因此它确保始终在新地址中写入“A”,然后再将其从旧地址中删除。因此,当查看磁盘上的文件时,可能存在 2 个“A”,但绝不会少于 1 个。但考虑一个扇区的读取不是原子的情况(例如,当使用另一个 mmap 和 MAP_SHARED 读取时?),那么当消费者进程开始读取文件时,“A”可能在扇区的后半部分,但当消费者进程到达扇区的第二部分时,可能会发生新的(原子)写入扇区发生在“A”移动到扇区的前半部分的地方。如果消费者继续阅读该行业的后半部分,它将在该行业的任何地方都看不到任何“A”。使用read(2) 时这仍然存在风险吗?
【问题讨论】:
标签: linux file file-io io system-calls