【问题标题】:How does one programmatically determine if "write" system call is atomic on a particular file?如何以编程方式确定“写入”系统调用在特定文件上是否是原子的?
【发布时间】:2011-12-01 09:31:42
【问题描述】:

在某些情况下,编码器不能依赖系统调用是原子的,例如如果文件在 NFS 文件系统上。 (参见NFS Overview, FAQ and HOWTO Documents)。但大多数数据库工作最终都需要原子系统调用。 (参考Atomicity of database systems)。

是否有一种标准(且独立于操作系统)的方式来确认写入(和其他系统调用)在 C(或 python)中的特定 FILE 上是原子的。

有什么建议吗?

后续说明:管道上的原子性在下面讨论:

请特别注意专门处理 O_APPEND 的“man”页摘录:

如果设置了文件状态标志的 O_APPEND 标志,则文件 偏移量应在每次写入之前设置到文件的末尾,并且没有 干预文件修改操作应在更改之间发生 文件偏移量和写操作。

【问题讨论】:

  • 我想您会发现数据库不需要原子系统调用:它们需要对数据库进行原子更新的外观,但这是使用事务日志完成的.在任何时候,实际的数据库文件可能不一致,但事务日志包含使它们再次一致所需的信息。
  • NFS 充满了严重破坏、不合规的行为,使其不适合大多数用途。将 smb/cifs/9p/anything-but-nfs 用于严重的网络文件系统使用。
  • 大多数数据库采用的方法似乎是在文档中添加一个突出的注释,即“不要在 NFS 上运行它。”

标签: python c portability system-calls atomic


【解决方案1】:

POSIX 中定义的write 调用根本没有原子性保证。所以你不需要确认任何东西,它不是原子的。

如果成功完成,它甚至不能保证数据会到达硬盘驱动器(如果有驱动器的话)。成功读回数据也不能给你任何保证。

您需要使用sync 系列函数来获得一些持久性保证。

【讨论】:

  • write 对管道有一些原子性保证,对常规文件有排序保证。
  • 问题在标题中说“文件”并谈到数据库工作。虽然你是对的,但我真的不认为提问者可以依赖这些保证来进行 ACID 类型的工作。
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多