【发布时间】:2018-10-20 01:00:11
【问题描述】:
我正在做一个小项目,正在寻求建议。
基本上,我有一个主进程,它是一个服务器,具有各种动态增长的数据结构和一些套接字。
在某些情况下,我需要创建运行小循环的进程(它们不需要任何数据结构、主服务器的 fd 或套接字)。 一个重要的要求是它们应该:快速、轻便和耐用(即使主服务器被杀)。
fork:我会随着时间的推移获得持久性,但复制主服务器意味着复制其所有数据结构、fd 等,这会不必要地加重新进程的负担。
线程:轻巧快速但不耐用,最重要的是非常不稳定(如果线程由于某种原因产生错误可能会阻塞一切)。
理想的情况是一个神奇的系统调用,它执行一个 ex novo 进程,该进程具有一个作为入口点的函数,但我认为没有这样的东西。
你对我有什么建议吗?
【问题讨论】:
-
既然你说“他们不需要主服务器的任何数据结构,fd或socket”,那么fork一个新进程不会太贵。当你 fork 时它不会复制所有内容,它会 copy on write
-
@TianjiaoHuang:父母的内存也会被标记为copy-on-write,所以
fork可能没那么便宜。 -
fork是“耐用”的唯一选择。是否可以选择保持一些从属进程运行并通过 IPC 向它们发出命令? (管道、套接字、共享内存...) -
看看你的设计。之间的任何通信。如果您的设计依赖于大数据项的频繁信号发送,那么线程将更加高效,因为您可以发送指针信号而不是复制批量数据。但是,如果存在相当程度的数据隔离,那么线程相对于进程几乎没有优势。课程用马。
-
..或者你可以采取务实的方法来设计你的系统,这样你就可以轻松地尝试两者,然后只是测试。
标签: c linux multithreading pthreads fork