【问题标题】:Compare-and-Swap over POSIX-compliant filesystem objects在符合 POSIX 的文件系统对象上进行比较和交换
【发布时间】:2015-02-09 19:31:24
【问题描述】:

符合 POSIX 的操作系统可以对文件系统对象(文件和文件夹)进行原子操作。这是presumably atomic operations的列表:

  • 重命名或移动文件或文件夹
  • 创建硬链接
  • 创建符号链接
  • 创建文件夹
  • 创建并打开一个空文件

是否可以基于这些操作构建用于操作文件的比较和交换算法?

假设我们有几个进程正在对单个文件执行并发读/写。文件的特征在于其修订版本。假设将修订添加到文件名,并且文件有一个符号链接,进程可以使用该符号链接来读取它。这些进程不能(由于某些原因)与互斥锁、信号量等同步,但它们能够创建辅助文件和文件夹。他们是否能够对文件执行基于修订的比较和交换修改(创建一个新文件,创建和重命名符号链接),这意味着如果多个进程要同时修改它,一个会成功,其余的会失败并显示一些错误代码?

算法必须能够抵抗算法任何步骤中任何进程的突然终止。

【问题讨论】:

  • 比较和交换的“比较”部分比较的是什么?
  • 文件可能有修订版,“比较”部分可以比较修订版。

标签: algorithm filesystems posix atomic compare-and-swap


【解决方案1】:

天哪。

让我们假设每个进程都可以访问一个唯一的标识符,以避免破坏对称性的问题。这是一次性共识对象的无等待实现。

  1. 创建一个具有唯一名称的目录。
  2. 在该目录中创建一个文件,其名称是创建过程的输入。
  3. 将目录重命名为共识对象的名称。这将失败,除非这是第一次这样的重命名。
  4. 列出我们尝试重命名的目录。里面的文件名就是共识决定。

现在可以simulate an arbitrary object in a wait-free manner,在分布式计算中使用标准结果。享受垃圾收集的乐趣=P

【讨论】:

  • 嗯...听起来很合理。我会尝试这个解决方案。感谢您提供指向任意对象的无等待模拟的链接。
  • @VolodymyrFrolov 如果可以的话,你真的应该 fcntl 锁定。
  • 不确定 fcntl 是否适用于包括 windows 在内的所有平台。
【解决方案2】:

如果您在原子操作列表中考虑 fcntl(2),则可以轻松构建通用互斥体原语。我经常使用flock(1) 命令行工具在shell 脚本中执行此操作。 (flock(1) 是 util-linux-ng 包的一部分。)

flock(2) 不是 POSIX 指定的,但 fcntl(2) 是。我认为flock(1) 在某些情况下(例如NFS)可能会使用fcntl(2)。

所以算法是这样的:

    1. 对您要操作的资源所特有的某个文件执行非阻塞 fcntl()。这可能是数据文件本身,也可能是每个进程都同意用作互斥对象的某个空文件。
  • 2a。如果 fcntl 成功,则交换文件中的数据。
  • 2b。如果 fcntl 不成功,请不要触摸数据文件。
    1. 释放文件上的 fcntl。

你当然可以做一个阻塞 fcntl(2),但是没有办法知道每个进程阻塞和唤醒的顺序,所以这是否合适取决于应用程序。

请注意,fcntl(2) 是建议性的,因此它不会阻止对数据文件进行不必要的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多