【问题标题】:fork and IPC mechanism分叉和IPC机制
【发布时间】:2013-06-19 19:35:43
【问题描述】:

我正在编写一个单线程内存重的概念证明应用程序。 该应用程序本身并不会处理太多数据,主要会加载 GB 的数据,然后对其进行一些数据分析。

我不想通过 MT 实现来管理并发,不想实现(即互斥锁、自旋锁……)所以我决定这次使用亲爱的旧 fork()
在内存为 CoW 的 Linux 上,我应该能够有效地分析相同的数据集,而无需显式复制它们并使用简单的并行单线程逻辑(同样,这是一个概念证明)。

现在我生成了子进程,使用 fork() 很容易为 子任务 设置输入参数(子进程 在这种情况下),但是我必须将结果返回到主进程。有时这些结果是10 GB 大。我想到的所有 IPC 机制是:

  • PIPEs/Sockets(然后 epoll 相当于以单线程方式等待结果)
  • Hybrid PIPEs/Shared Memory(epoll相当于参照Shared Memory等待结果,然后将数据从Shared Memory复制到父进程,销毁Shared Memory)

我还能用什么?除了明显的“多线程”之外,我真的想利用 CoW 和单线程多进程架构来实现这个概念验证时间>。有什么想法吗?

谢谢

【问题讨论】:

    标签: linux fork ipc pipe shared-memory


    【解决方案1】:

    经过一些实验,我得到的结论如下:

    1. 当子进程必须与父进程通信时,在生成此类子进程之前,我会创建一段共享内存(即 16 MB)
    2. 如果需要协调,则会在 sh mem 段中创建信号量
    3. 然后在分叉时,我 pipe2 使用 nonblocking 套接字,以便孩子可以在某些数据可用时通知父母
    4. 管道fd 然后用于epoll
    5. epoll 用作Level Triggered,因此如果子进程真的发送数据速度很快,我可以交错请求
    6. 如果结构为pod,则共享内存段用于直接通信数据,如果不是,则使用简单的template<...> 二进制读/写函数

    我相信这是一个很好的解决方案。
    干杯

    【讨论】:

      【解决方案2】:

      您也可以使用常规文件。

      父进程可以等待子进程(分析内存中的数据,然后将其结果写入文件)退出,一旦它退出,您必须能够从文件中读取数据。正如您所提到的,输入参数不是问题,您可以在其中一个输入参数中指定要写入的文件名。这样,不需要锁定,或者除了子进程退出状态的 wait() 之外。

      我想知道您的每个子进程是否返回 10s 的大数据,这样使用常规文件会更好,因为您将有足够的时间来处理每个子进程的结果。但是这 10GB 的数据是跨子进程共享的吗?如果是这样的话,你会更喜欢使用锁,所以我认为不是。

      【讨论】:

      • 我在子进程和父进程之间使用共享内存(以二进制形式序列化/反序列化),并且是最快的 IPC。我可以在短时间内传输大量数据,到目前为止工作正常。我认为使用文件系统只会减慢速度并可能依赖磁盘。也解决不了读取文件时阻塞父进程太久的问题。
      • 你说得对,共享内存是最快的。并且文件 r/w 很慢。但除此之外,您可以像使用共享内存一样使用文件。不需要阻止父进程,我不确定您如何通知父进程的数据可用性,即使使用共享内存也是如此。无论如何,我猜你已经找到了解决方案。
      猜你喜欢
      • 1970-01-01
      • 2016-06-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2011-01-15
      相关资源
      最近更新 更多