我正在做一个小项目,我正在寻求建议。
基本上,我有一个主进程,它是一个服务器,具有各种动态增长的数据结构和一些套接字。
在某些情况下,我需要创建只要有必要运行小循环的进程(它们不需要主服务器的任何数据结构,fd或套接字)。 一个重要的要求是它们应该是:快速,轻便和耐用(即使主服务器被杀死)。
fork:随着时间的推移,我会获得持久性,但复制主服务器意味着复制所有数据结构,fd等,这会不必要地压低新进程。
线程:轻快但不耐用,最重要的是非常不稳定(如果由于某种原因线程产生错误可能会阻塞所有内容)。
理想的事情是魔术系统调用,它执行一个具有函数作为入口点的ex novo进程,但我认为没有类似的东西。
你对我有什么建议吗?
答案 0 :(得分:2)
fork:随着时间的推移,我会获得持久性,但复制主服务器意味着 复制它的所有数据结构,fd等会压低新的数据 不必要的过程。
没有你想象的那么多。 Linux fork()
早已通过写时复制页面实现。子进程将具有与父进程相同的地址空间,但它不会拥有自己的进程修改的任何页面的副本。此外,复制页面的复制成本会随着时间的推移而摊销。最初的fork()
相当便宜。
线程:轻快但不耐用,最重要的是非常不稳定(如果 一个线程由于某种原因产生错误可能会阻止所有事情。)
鉴于这种分析,线程毕竟不是一个真正的选择。耐用性和稳定性是功能要求。最小重量在某种程度上甚至是速度都是效率问题。以前的类别每次都胜过后者。
理想的事情是魔术系统调用,从头开始执行 有一个功能作为切入点的过程,但我认为有 不是那样的。
由于您的目标是Linux,您是否考虑过clone()
?它完全符合您的描述,但我怀疑您所说的内容完全捕获了您想象的这种特征的语义。
或者,你考虑过fork + exec吗?这可能需要一些重构,但是通过执行一个exec,孩子会在(廉价的)初始分支之后尽可能多地摆脱与父母共享的上下文。