叉和IPC机制

我正在写一个单线程内存的概念应用程序的重要certificate 。 这个应用程序本身并不处理太多的数据,主要是加载GB的数据,然后做一些数据分析。

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

现在我产生了subprocess,用fork()很容易为子任务设置input参数(在这种情况下是subprocess ),但是我必须把结果返回到主进程。 有时这些结果是十亿分之十GB大 。 我想到的所有IPC机制是:

  • PIPEs / Sockets(然后epoll相当于以单线程方式等待结果)
  • 混合PIPEs /共享内存epoll相当于参考共享内存等待结果,然后将共享内存中的数据复制到父进程中,销毁共享内存)

我还能用什么? 除了显而易见的“走multithreading”,我真的想利用CoW和单线程多进程架构来进行这个概念validation 。 有任何想法吗?

谢谢

经过一番尝试,我得出的结论如下:

  1. 当一个子进程必须与父进程通信时,在产生这样的子进程之前,我创建了一段共享内存(即16 MB)
  2. 如果需要协调,则在sh mem段中创建一个信号量
  3. 然后分叉,我pipe2 非阻塞的插座,所以当有一些数据可用时,孩子可以通知家长
  4. fd然后用于epoll
  5. epoll被用作Level Triggered所以如果子进程在发送数据时真的很快,我可以交错请求
  6. 如果结构是pod或具有简单的template<...>二进制读/写功能(如果这些功能不是

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

你也可以使用一个普通的文件。

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

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