Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建新的精简进程、分支还是线程?_C_Linux_Multithreading_Pthreads_Fork - Fatal编程技术网

C 创建新的精简进程、分支还是线程?

C 创建新的精简进程、分支还是线程?,c,linux,multithreading,pthreads,fork,C,Linux,Multithreading,Pthreads,Fork,我正在做一个小项目,我正在寻求建议 基本上,我有一个主进程,它是一个具有各种动态增长的数据结构和一些套接字的服务器 在某些情况下,我需要创建尽可能长时间运行小循环的进程(它们不需要主服务器的任何数据结构、fd或套接字)。 一个重要的要求是:快速、轻便和耐用(即使主服务器被杀死) fork:随着时间的推移,我得到了持久性,但是复制主服务器意味着复制它的所有数据结构、fd等,这将不必要地拖累新进程 线程:轻快但不持久,最重要的是非常不稳定(如果一个线程由于某种原因产生错误,可能会阻塞一切) 理想的情

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

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

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

fork:随着时间的推移,我得到了持久性,但是复制主服务器意味着复制它的所有数据结构、fd等,这将不必要地拖累新进程

线程:轻快但不持久,最重要的是非常不稳定(如果一个线程由于某种原因产生错误,可能会阻塞一切)

理想的情况是一个神奇的系统调用,它执行一个以函数作为入口点的全新流程,但我认为没有这样的

你对我有什么建议吗

fork:随着时间的推移,我得到了持久性,但是复制主服务器意味着 复制它的所有数据结构、fd等,这将拖累新的 不必要地处理

没有你想象的那么多。Linux
fork()
长期以来都是通过写页复制实现的。子进程将拥有与父进程相同的地址空间,但它不会拥有任何进程都不会修改的页面的副本。此外,复制修改过的页面的成本将随时间摊销。最初的
fork()
非常便宜

线程:轻,快速,但不耐用,最重要的是非常不稳定(如果 由于某种原因,线程会生成错误(可能会阻止一切)

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

理想的情况是一个神奇的系统调用,它执行一个全新的 有一个函数作为入口点的过程,但我认为有 不是那样的

既然你的目标是Linux,你考虑过吗?它完全符合您所描述的,尽管我怀疑您所说的是否完全符合您为此类功能所设想的语义


或者,您考虑过fork+exec吗?这可能需要一些重构,但通过执行exec,子进程将在(廉价的)初始fork之后尽可能地摆脱与其父进程共享的上下文。

既然您说过“他们不需要任何数据结构、主服务器的fd或socket”,那么派生新进程就不会太昂贵。当你使用fork时,它不会复制所有内容,它会@TianjiaoHuang:父内存在写入时也会被标记为copy,因此
fork
可能并不那么便宜。
fork
是“持久”的唯一选择。是否可以选择保持一些从进程运行,并通过IPC向它们发出命令?(管道、插座、共享内存…)看看你的设计图纸。内部通讯。如果您的设计依赖于大数据项的频繁信令,那么线程将更加高效,因为您可以向指针发送信号,而不是复制批量数据。但是,如果存在相当程度的数据隔离,那么线程对进程的好处就不大了。或者你可以采取务实的方法来设计你的系统,这样你就可以轻松地尝试这两种方法,然后只进行testmeasure.clone:这可能是一个解决方案,但是使用哪种标志来尽可能少地继承?据我所知,clone的行为类似于fork,它通过选择共享其执行上下文的哪一部分来复制流程。在我看来,Fork+exec解决方案似乎是最好的,但我希望避免生成单独的可执行文件。正如我所说的,@alesiovolpe,我怀疑您所写的内容是否完全符合您心目中的语义。克隆的行为与fork类似。如果您通读标志列表,您将看到几乎所有的标志都要求与原始进程进行更多的共享,因此不指定标志会使共享尽可能少。但不共享意味着复制(在适用的情况下使用写下复制,如fork)。但是您将指定的函数作为入口点,并从中返回终止子函数。