【问题标题】:How to synchronize file I/O of many independent applications on Linux?Linux上如何同步多个独立应用的文件I/O?
【发布时间】:2019-02-25 04:30:21
【问题描述】:

我正在为 Linux 编写一个软件,它可以在后台主动处理用户的文件,同时与我无法控制的其他应用程序一起工作。我想让我的后台应用程序不覆盖其他应用程序所做的更改。但是有一个问题 - 与 Windows 不同,Linux 不提供强制文件锁定功能,这可能会由于我想避免的竞争条件而破坏用户的工作。

所以我想知道 - Linux 上是否有提供某种同步机制的文件系统,例如 compare-and-swap 操作、all-or-nothing transactions、强制文件锁定(如在 Windows 中)?

【问题讨论】:

  • 您错过了问题陈述。你到底想做什么?
  • @MaximEgorushkin, “我想让它不覆盖用户所做的更改” - 这还不够吗?
  • 这个问题陈述有一个简单的解决方案:写入新文件。
  • 用户进程可能正在使用缓冲 I/O(例如 stdio 函数),因此用户写入可能在用户空间缓冲区中挂起。但是文件观察者不可能知道这一点。您所说的问题没有解决方案。

标签: linux concurrency io transactions filesystems


【解决方案1】:

我相信有三种可能的解决方案

1) 使所有程序都使用自定义文件 I/O 库来实现您需要的功能。如果您无权访问源代码,此解决方案可能不可行。您也可以考虑使用 mmap 以便将更改写入内存。您使用后台进程将脏页同步到现有文件或新文件。

2) 替换受影响程序将使用的标准 C/C++ 库(例如 libc.so)。您可以使用ldd 找出库依赖关系。您需要更新标准 C/C++ 的源代码以实现您需要的功能。这对大多数人来说可能太难了。

3) 创建文件系统。你可以参考网上很多文章,比如https://kukuruku.co/post/writing-a-file-system-in-linux-kernel/。这是最好和最干净的解决方案。

希望对你有帮助。

【讨论】:

  • 我想我会选择选项 3) - 使用 FUSE 在常规文件系统上编写一个包装器,这将添加强制锁定功能或 CAS 操作。
【解决方案2】:

Rename is atomic。在决定调用 rename() 之前,由您的应用程序比较源和目标的“eTags”(可能在适当的锁定下)。

【讨论】:

  • 他们对我来说关键是compare-and-swap 能力。
  • 文件系统不提供基于文件属性的比较和交换。你的程序必须这样做。另见stackoverflow.com/questions/28417765/…
  • 您的程序必须这样做。 我不仅需要在应用程序内进行同步,还需要在所有访问文件系统的应用程序之间进行同步。
  • 嗯,我不确定这是否可能。希望有人能给出答案。
  • 我赞成这个答案,因为你的问题可能有非常复杂的用例和很多角落,但回答它的关键在于使最终的写入文件是原子的,而不是另一个人说。给定替换的原子方法,您可以写入临时位置,比较时间戳并整理程序中的更改;您无需担心获得写锁或损坏最终文件。如果您需要读取更新锁定,则需要一个数据库。
【解决方案3】:

mmap 似乎有您正在寻找的这种保护: https://www.kernel.org/doc/html/v4.13/media/uapi/v4l/func-mmap.html

保护 prot 参数描述了所需的内存保护。无论设备类型和数据交换方向如何,都应将其设置为 PROT_READ | PROT_WRITE,允许对图像缓冲区进行读写访问。驱动程序至少应该支持这种标志组合。

【讨论】:

    【解决方案4】:

    共享资源需要防止并发访问,因为如果多个执行线程同时访问和操作数据,线程可能会覆盖彼此的更改或访问处于不一致状态的数据。共享数据的并发访问是导致不稳定的一个原因,通常证明很难追踪和调试 - 立即获得它很重要 [1]

    线程可以使用以下两种工具来同步它们的操作:互斥锁和条件变量 [2]

    互斥锁(互斥的缩写)允许线程同步它们对共享资源的使用,例如,一个线程不会在另一个线程修改共享变量的同时尝试访问它。

    条件变量执行补充任务:它们允许线程相互通知共享变量(或其他共享资源)已更改状态。

    改编自:

    [1] 爱,R. (2005)。 Linux 内核开发,第二版。

    [2] Kerrish, M. (2010)。 Linux 编程接口。

    【讨论】:

    • 请记住,我寻求的解决方案是跨多个独立应用程序同步文件工作,而不仅仅是在我的应用程序内。
    • 问题需要明确。
    猜你喜欢
    • 2011-08-05
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2015-08-15
    • 2010-12-25
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多