创建一个新的精简流程,fork还是线程?

时间:2018-05-09 20:15:02

标签: c linux multithreading pthreads fork

我正在做一个小项目,我正在寻求建议。

基本上,我有一个主进程,它是一个服务器,具有各种动态增长的数据结构和一些套接字。

在某些情况下,我需要创建只要有必要运行小循环的进程(它们不需要主服务器的任何数据结构,fd或套接字)。 一个重要的要求是它们应该是:快速,轻便和耐用(即使主服务器被杀死)。

fork:随着时间的推移,我会获得持久性,但复制主服务器意味着复制所有数据结构,fd等,这会不必要地压低新进程。

线程:轻快但不耐用,最重要的是非常不稳定(如果由于某种原因线程产生错误可能会阻塞所有内容)。

理想的事情是魔术系统调用,它执行一个具有函数作为入口点的ex novo进程,但我认为没有类似的东西。

你对我有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

fork:随着时间的推移,我会获得持久性,但复制主服务器意味着   复制它的所有数据结构,fd等会压低新的数据   不必要的过程。

没有你想象的那么多。 Linux fork()早已通过写时复制页面实现。子进程将具有与父进程相同的地址空间,但它不会拥有自己的进程修改的任何页面的副本。此外,复制页面的复制成本会随着时间的推移而摊销。最初的fork()相当便宜。

  

线程:轻快但不耐用,最重要的是非常不稳定(如果   一个线程由于某种原因产生错误可能会阻止所有事情。)

鉴于这种分析,线程毕竟不是一个真正的选择。耐用性和稳定性是功能要求。最小重量在某种程度上甚至是速度都是效率问题。以前的类别每次都胜过后者。

  

理想的事情是魔术系统调用,从头开始执行   有一个功能作为切入点的过程,但我认为有   不是那样的。

由于您的目标是Linux,您是否考虑过clone()?它完全符合您的描述,但我怀疑您所说的内容完全捕获了您想象的这种特征的语义。

或者,你考虑过fork + exec吗?这可能需要一些重构,但是通过执行一个exec,孩子会在(廉价的)初始分支之后尽可能多地摆脱与父母共享的上下文。