fork和IPC机制

时间:2013-06-22 22:58:06

标签: linux fork ipc pipe shared-memory

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

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

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

  • PIPEs /套接字(然后 epoll 相当于以单线程方式等待结果)
  • 混合PIPE /共享内存( epoll 等同于参考共享内存等待结果,然后将数据从共享内存复制到父进程,破坏共享内存)

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

由于

2 个答案:

答案 0 :(得分:1)

经过一些实验后得出的结论如下:

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

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

答案 1 :(得分:0)

您也可以使用常规文件。

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

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