【问题标题】:Sharing data across processes on linux在 Linux 上跨进程共享数据
【发布时间】:2011-10-29 18:07:43
【问题描述】:

在我的应用程序中,我有一个分叉出一个子进程的进程,比如 child1,这个子进程在磁盘上写入一个巨大的二进制文件并退出。然后父进程派生出另一个子进程 child2,该子进程读取这个巨大的文件以进行进一步处理。

文件转储和重新加载使我的应用程序变慢,我正在考虑可能 完全避免磁盘 I/O 的方法。我确定的可能方式是 ram-disk 或 tmpfs。 我可以在我的应用程序中以某种方式实现 ram-disk 或 tmpfs 吗?或者有没有其他的 通过这种方式我可以完全避免磁盘 I/O 并可靠地跨进程发送数据。

【问题讨论】:

  • 为了正确看待更多事情,父进程实际上分叉了3-4个写入磁盘的子进程,然后这些文件被后续子进程读取。所有这些子进程不同时存在,在将数据写入磁盘后退出。
  • 由于涉及到很多流程,我认为设置管道可能会变得过于复杂和脆弱。相反,如果我可以构建一个封装的 API 来模拟我需要的一些磁盘的磁盘,那就太酷了!
  • 为什么要分叉?使用线程并将文件保存在内存中。

标签: c linux ipc fork


【解决方案1】:

在您的情况下,第一个子进程 child1 在 child2 存在之前退出,因此套接字通信或使用未命名的管道将无济于事,

但是共享内存可以完成这项工作: 在 child1 中创建一个对 all 具有读取权限的共享内存段,并在该共享内存中执行文件转储任务, 在 child2 中,将共享内存段附加到当前进程空间并读取转储的数据。

【讨论】:

【解决方案2】:

在fork之前创建一个匿名共享内存区域,然后fork之后所有的孩子都可以使用它:

char *shared = mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);

请注意,共享内存时需要一些同步机制。实现此目的的一种方法是将互斥体或信号量放在共享内存区域内。

【讨论】:

    【解决方案3】:

    如果两个子进程没有同时运行,管道或套接字将无法为您工作——它们的缓冲区对于“巨大的二进制文件”来说太小了,第一个进程将阻塞等待读取任何内容数据。

    在这种情况下,您宁愿需要某种共享内存。您可以使用 SysV IPC 共享内存 API、POSIX 共享内存 API(在最近的 Linux 上内部使用 tmpfs)或直接使用 tmpfs(通常安装在 /dev/shm,有时在 /tmp)文件系统上的文件。

    【讨论】:

    • 是的,子进程不会同时运行,但父进程处于活动状态,直到最后一个子进程退出。我一直在考虑直接在 tmpfs 文件系统上使用文件,但不知道如何从程序内部实现它们。有什么指点吗?
    【解决方案4】:

    您可以使用管道、套接字并利用 Linux 内核的 sendfile()splice() 功能(它们可以避免数据复制)。

    【讨论】:

      【解决方案5】:

      named pipe 正是您想要的。您可以将数据写入其中并从中读取数据,就像它是一个文件一样,但无需将其存储在磁盘上。

      【讨论】:

      • 为什么使用命名管道,当进程从单个进程派生出来并且可以直接共享文件描述符时?
      【解决方案6】:

      您可以使用管道在进程之间传递数据。 Here 是一个很好的概要和示例实现。

      【讨论】:

        【解决方案7】:

        生成两个进程并让它们通过套接字传输数据。 TCP 最容易上手,但如果您想要更高的效率,请使用 Unix Domain Sockets。这假设您不关心写入磁盘本身的数据。

        【讨论】:

        • 其实这2个子进程并不同时存在。第一个完成工作,转储文件并退出,然后分叉下一个子代​​,它加载此文件并执行其余处理。我可以在 parent-child1 和 parent-child2 之间设置一个套接字吗?
        • 让它们同时运行怎么样?作为附带好处,它可能会大大减少总运行时间。
        猜你喜欢
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        相关资源
        最近更新 更多