开发者社区> 问答> 正文

是从扇区中的磁盘原子读取吗?

已浏览 22次

0

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

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

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

展开
收起
祖安文状元 2020-01-07 14:22:00 387 0
1 条回答
写回答
取消 提交回答
  • 实际上,NAND闪存,硬盘和CD-ROM将成为原子读取扇区,因为硬件无法同时从同一块读取和写入数据。此外,它们存储每个扇区的校验和,因此任何撕裂的写入都将被作为读取错误丢弃。

    但是,这对您而言都不重要,因为read/write/mmap可以在VFS上操作,而不能直接在设备上操作。当您read从mmap'd页面执行a时,您会获得该页面的简单非原子副本,并且实际上可能没有显示“ A”。

    2020-01-07 14:22:05
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
用户态高速块缓存方案 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载