【问题标题】:How can I serialize access to a directory in Linux?如何序列化对 Linux 中目录的访问?
【发布时间】:2015-06-25 07:01:57
【问题描述】:

假设一个处理器上同时运行了 4 个进程,并且需要将数据从 HDFS(与 Spark 一起使用)文件系统复制到本地目录。现在我只希望一个进程复制该数据,而其他进程只是等待该数据被第一个进程复制。

所以,基本上,我想要某种信号量机制,每个进程都试图获取信号量以尝试复制数据,但只有一个进程获取信号量。所有未能获取信号量的进程将等待信号量被清除(能够获取信号量的进程将在完成复制后将其清除),当它清除时,他们知道数据已经被复制.我如何在 Linux 中做到这一点?

【问题讨论】:

    标签: c linux apache-spark semaphore


    【解决方案1】:

    实现信号量的方法有很多种。经典的 System V 信号量方式在 man semop 中进行了描述,更广泛地在 man sem_overview 中进行了描述。

    您可能仍然想做一些更易于扩展和更现代的事情。许多 IPC 框架(Apache 也有其中的一两个!)具有原子 IPC 操作。这些可以用于实现信号量,但我会非常非常小心。

    一般来说,我经常鼓励编写多进程或多线程应用程序的人使用 C++ 而不是 C。如果您的状态被很好地封装在一个对象中,那么通常更容易看到必须保护共享状态的位置它自己的锁定。因此,我敦促您查看Boost's IPC synchronization mechanisms

    【讨论】:

      【解决方案2】:

      除了Marcus Müller's answer,你还可以使用一些file locking机制来同步。

      文件锁定在联网或远程文件系统上可能效果不佳。您应该在本地安装的文件系统(例如 Ext4、BTRFS、...)上使用它,而不是在远程文件系统(例如 NFS)上使用它

      例如,您可能会采用您的目录包含的约定(或者您将创建它)一些 .lock 文件并使用 advisory lock flock(2)(或 POSIX @987654324 @) 在访问该目录之前在该 .lock 文件上。

      如果使用flock,你甚至可以直接锁定目录....

      使用这种文件锁定方法的优点是您可以使用 flock(1) 编写 shell 脚本

      在 Linux 上,您还可以使用 inotify(7)(例如,在该目录中创建某些文件时收到通知)

      请注意,大多数解决方案都是(建议性的,所以)假设访问该目录的每个进程都遵循某种约定(换句话说,如果没有更多预防措施,例如使用 flock(1),粗心的用户可能会访问该目录 - 例如,使用普通的cp 命令 - 或其下的文件,而您的锁定进程正在访问该目录)。如果你不接受,你可能会寻找mandatory file locking(这是一些 Linux 内核和文件系统的一个特性,AFAIK 它有点被弃用了)。

      顺便说一句,您可能会阅读有关ACID 属性的更多信息并考虑使用一些数据库等...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-21
        • 2015-05-26
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        • 2012-09-29
        相关资源
        最近更新 更多