4

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

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

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

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

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

谢谢

4

2 回答 2

2

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

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

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

于 2013-08-25T11:54:33.307 回答
0

您也可以使用常规文件。

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

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

于 2013-08-09T02:35:35.907 回答