POSIX兼容的操作系统可以通过文件系统对象(文件和文件夹)以原子方式执行多项操作。以下是此类presumably atomic operations的列表:
是否可以构建基于这些操作来操作文件的比较和交换算法?
假设我们有几个进程在单个文件上执行并发读/写。文件的特点是其修订版。假设修订版已添加到文件名中,并且文件的符号链接可由进程用来读取它。这些进程不能(由于某些原因)与互斥锁,信号量等同步,但它们能够创建辅助文件和文件夹。他们是否能够对文件执行基于修订的比较和交换修改(创建新文件,创建和重命名符号链接),这意味着如果多个进程同时修改它,一个将成功,其余将成功失败了一些错误代码?
算法必须能够抵抗算法任何步骤中任何进程的突然终止。
答案 0 :(得分:3)
哦,小伙子。
假设每个进程都可以访问唯一标识符,以避免破坏对称性的问题。这是一次性共识对象的无等待实现。
现在可以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)。
所以算法类似于:
你当然可以做一个阻塞的fcntl(2),但是没有办法知道每个进程阻塞和唤醒的顺序,所以这是否合适取决于应用程序。
请注意,fcntl(2)是建议性的,因此不会阻止对数据文件进行不必要的操作。