【问题标题】:Can a read() by one process see a partial write() by another?一个进程的 read() 可以看到另一个进程的部分 write() 吗?
【发布时间】:2012-11-07 16:48:29
【问题描述】:

如果一个进程执行大小(和对齐)S(例如 8KB)的 write(),那么另一个进程是否有可能执行读取(大小和对齐 S 以及同一文件)看到混合旧数据和新数据?

写入过程为每个数据块添加校验和,我想知道是否可以使用读取过程在后台验证校验和。如果读者可以看到部分写入,那么它将错误地指示损坏。

这里适用哪些标准或文件?有没有一种可移植的方式来避免这里的问题,最好不要引入大量的锁定?

【问题讨论】:

  • 这是一个经典的多用户数据库问题,像oracle这样的产品通过大量的锁定和其他操作来保持并发。简单回答是不。没有任何保证。您必须实施互斥锁或文件锁定或任何您认为合理的保证。某种具有内核持久性的通用对象将解决问题 - 互斥体、信号量、锁定文件等。
  • 澄清:我的问题不在于写入是否真正进入磁盘,而在于其他进程是否可以在系统完全在线时看到部分写入。所以,如果崩溃后有撕裂的页面也没关系,我只是不想错误地断定当另一个进程在 write() 调用过程中存在损坏。
  • 在 windows 和 unix 中,写入和读取通常会命中文件缓存。 whamma 在下面更清楚地解释它。

标签: windows unix concurrency operating-system filesystems


【解决方案1】:

当一个函数保证完成而没有任何其他进程/线程/任何东西看到处于半完成状态的事物时,它被称为原子 .它要么发生了,要么没有发生,没有半途而废。虽然我不能与 Windows 对话,但在 POSIX(这是 Linux/BSD/etc 试图坚持的)中很少有文件操作可以保证是原子的。阅读和写作不保证是原子的

虽然您不太可能将 2 个字节写入文件,而另一个进程只能看到其中一个字节被写入,但如果运气不好,您的写入跨越了内存中的两个不同页面并且 VM 系统必须采取措施准备第二页,您可能会在第二个进程中看到一个字节而没有另一个字节。通常,如果文件中的内容是页面对齐的,它们将在内存中,但同样你不能依赖它。

Here's a list 有人用 POSIX 中的原子组成,这很短,我不能保证它的真实性。 (例如,我想不出为什么没有列出 unlink)。

我还提醒您不要测试似乎可以工作和运行的东西,当您开始通过网络文件系统(Unix 上的 NFS,或 Windows 上的 SMB 挂载)访问文件的那一刻,很多事情似乎是以前的原子不再是。

如果您希望在第一个进程写入文件时让第二个进程计算校验和,您可能希望在两者之间打开一个管道,并让第一个进程将管道中所有内容的副本写入校验和进程。这可能比处理锁定要快。

【讨论】:

  • 我相信你已经回答了这个问题,但是像“mv”这样的“原子”操作通常意味着“即使在电源故障的情况下也是原子的”。我不需要那么强的保证,我只需要知道它在系统在线时看起来是原子的。
  • 此外,校验和过程可以保证校验和在它到达磁盘后仍然有效(可能更晚)。在最初写的时候,我知道校验和是有效的,因为我只是设置了它,所以测试它不会有任何好处。
  • @Jeff “原子文件系统操作”和“原子文件系统”之间存在细微差别。如果您的文件系统挂载了“异步”标志,并且您在两个进程之间执行了原子操作,则可以保证保持原子状态。但不能保证它在磁盘上是原子的——异步标志意味着它可以按照它想要的任何顺序写入,即使这会使事情处于不一致的状态。所以你可以在运行时完全原子化,而不是在磁盘上原子化,甚至反之亦然,这取决于很多你不能依赖的东西。
  • @Jeff 仅仅因为您正在从不同的进程中读取文件并不意味着您实际上正在验证进入磁盘的内容。如果您在一个进程中写入磁盘,然后在另一个进程中读取它,那么您只是从内核的缓存中读取,这并不能证明事情已正确写入。除了卸载和重新安装整个文件系统之外,没有可移植的方式告诉操作系统真正从磁盘读回以确保它被正确写入。除非您在具有特殊存储的嵌入式系统中工作,否则可以安全地假设写入工作。
  • 我知道它可能没有命中磁盘,但最好在备份时验证校验和,因为即使它不是来自磁盘,它仍然通过校验和,它仍然是块我正在备份。但是如果它已经击中磁盘并且损坏了,那么在我说备份成功之前我想知道。
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多