比较和交换符合POSIX的文件系统对象

时间:2015-02-09 19:31:24

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

POSIX兼容的操作系统可以通过文件系统对象(文件和文件夹)以原子方式执行多项操作。以下是此类presumably atomic operations的列表:

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

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

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

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

2 个答案:

答案 0 :(得分:3)

哦,小伙子。

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

  1. 创建一个具有唯一名称的目录。
  2. 在该目录中创建一个文件,其名称是创建过程的输入。
  3. 将目录重命名为共识对象的名称。除非这是第一次重命名,否则这将失败。
  4. 列出我们尝试重命名自己的目录。内部文件的名称是共识决定。
  5. 现在可以simulate an arbitrary object in a wait-free manner使用分布式计算中的标准结果。有趣的垃圾收集= P

答案 1 :(得分:2)

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

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

所以算法类似于:

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

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

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