运维开发网

在Linux中fork和IPC机制

运维开发网 https://www.qedev.com 2020-06-17 08:18 出处:网络
我正在编写单线程内存重型概念验证应用程序. 该应用程序本身不会处理太多数据,主要是加载GB数据​​,然后对其进行一些数据分析.
我正在编写单线程内存重型概念验证应用程序.

该应用程序本身不会处理太多数据,主要是加载GB数据​​,然后对其进行一些数据分析.

我不想通过MT实现管理并发,不想实现锁(即互斥锁,自旋锁,……)所以我决定这次使用亲爱的旧fork().

在内存为CoW的Linux上,我应该能够有效地分析相同的数据集,而不必使用简单的并行单线程逻辑来复制它们(同样,这是一个概念证明).

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

> PIPEs /套接字(然后epoll相当于以单线程方式等待结果)

>混合PIPE /共享内存(epoll等效于参考共享内存等待结果,然后将数据从共享内存复制到父进程,破坏共享内存)

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

谢谢

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

>当子进程必须与父进程通信时,在生成这样的子进程之前,我创建了一段共享内存(即16 MB)

>如果需要协调,则在sh mem段中创建信号量

>然后在分叉时,我使用非阻塞套接字管道2,以便子项可以在某些数据可用时通知父项

>然后将管道fd用于epoll

> epoll用作级别触发,因此如果子进程在发送数据方面非常快,我可以交错请求

>如果结构是pod或使用简单模板< ...>,则共享存储器段用于直接传送数据.二进制读/写函数,如果不是

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

0

精彩评论

暂无评论...
验证码 换一张
取 消