已浏览 22次
0
据我了解,或多或少,所有系统都将对磁盘的写入作为对扇区的原子写入(通常为512或4096字节)。但是阅读呢?
即是说,如果我有一个使用read(2)命令顺序读取文件的进程,那么在我完成读取整个扇区之前,是否有可能覆盖该扇区,或者整个扇区是通过原子操作复制到内存的?
让我们以玩具为例;我有一个mmap:ed文件的生产者。该生产者的任务是在第一个扇区的某个位置写字母“ A”,然后将其移动到仍位于第一个扇区的另一个位置。由于生产者不知道何时将内存写入磁盘,因此请确保始终将“ A”写入新地址,然后再将其从旧地址中删除。因此,当查看磁盘上的文件时,可能存在2个“ A”,但绝不能小于1。但是请考虑以下情况:对一个扇区的读取不是原子的(例如,使用mmap带有MAP_SHARED?),那么可能会发生,当使用者进程开始读取文件时,“ A”位于扇区的后半部分,但是当使用者进程到达该扇区的第二部分时,会进行新的(原子的)写入该扇区的“ A”移到该扇区的上半部分。如果消费者继续阅读该行业的后半部分,则在该行业的任何地方都看不到任何“ A”。使用时仍然有风险read(2)吗?
实际上,NAND闪存,硬盘和CD-ROM将成为原子读取扇区,因为硬件无法同时从同一块读取和写入数据。此外,它们存储每个扇区的校验和,因此任何撕裂的写入都将被作为读取错误丢弃。
但是,这对您而言都不重要,因为read/write/mmap可以在VFS上操作,而不能直接在设备上操作。当您read从mmap'd页面执行a时,您会获得该页面的简单非原子副本,并且实际上可能没有显示“ A”。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。