2015-02-09 37 views
4

POSIX兼容的操作系统可以使用文件系统对象(文件和文件夹)进行原子操作。这里有一个这样presumably atomic operations的列表:POSIX兼容的文件系统对象的比较和交换

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

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

假设我们有几个进程正在一个文件上执行并发读/写操作。一个文件的特点是其修订。假设修订版被添加到文件名中,并且该文件有一个符号链接,进程可以使用它来读取它。进程不能(由于某些原因)与互斥体,信号量等同步,但他们能够创建辅助文件和文件夹。他们是否能够对文件进行基于修订版的Compare-and-Swap修改(创建一个新文件,创建和重命名符号链接),意思是说,如果多个进程要同时修改它,一个会成功,其余的会有一些错误代码失败?

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

+0

在比较和交换的“比较”部分比较什么? – tmyklebu 2015-02-09 19:43:08

+0

该文件可能有版本,“比较”部分可能会比​​较版本。 – 2015-02-09 19:54:19

回答

2

哦,男孩。

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

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

现在有可能使用simulate an arbitrary object in a wait-free manner,在分布式计算中使用标准结果。玩得开心垃圾收集= P

+0

嗯......听起来很合理。我会尝试这个解决方案。感谢链接到任意对象的无等待模拟。 – 2015-02-09 20:02:41

+0

@VolodymyrFrolov你真的应该'fcntl'锁定,如果这是一个选项。 – 2015-02-09 20:06:44

+0

不确定fcntl是否可以在包括windows在内的所有平台上工作。 – 2015-02-09 20:48:36

2

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

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

所以该算法是这样的:

    1. 上的一些文件,它是独一无二的,你要处理的资源做一个非阻塞的fcntl()。这可能是数据文件本身,也可能是每个进程同意用作互斥对象的空文件。
  • 2a。如果fcntl成功,则交换文件中的数据。
  • 2b。如果fcntl不成功,请勿触摸数据文件。
    1. 释放文件中的fcntl。

你当然可以做一个阻塞的fcntl(2),但不会有任何办法知道什么样的顺序每个进程块和被唤醒,那么这是否合适取决于应用。

请注意,fcntl(2)是建议性的,所以它不会阻止不必要的数据文件操作。