嗨
我正在编写一个服务器的一部分,它应该调度一些其他的子进程。
因为我希望等待一些进程,并在不等待完成的情况下分派其他进程,所以我对第二种进程使用了double fork (从而避免了僵尸进程)。
问题是,我的服务器拥有大量内存,所以fork需要很长时间(甚至Linux中使用的只复制分页表的写入时复制fork)
我想用vfork()替换fork(),而且第二个fork很容易(因为它只在孩子中调用execve() ),但是我找不到任何方法来替换第一个fork。
有人知道我是怎么做到的吗?
谢谢!
服务器是用C++编写的linux (RH5U4)。
发布于 2010-04-12 18:40:52
为什么不简单地让新执行的进程自己做另一个分支呢?这样一来,只有一个很小的简单进程会复制它的页表?
编辑:
当然,父进程必须执行一个短时间的wait()来清除那个僵尸,但是孙子进程可以运行它想运行的时间。
发布于 2010-04-11 22:21:20
vfork()只能用于派生,然后调用exec或exit。此外,vfork()将阻塞父进程,直到子进程调用_exit或exec,这几乎肯定不是您想要的行为。
这样做的原因是vfork()不会为新进程制作任何数据的副本,包括堆栈。因此,所有东西都是共享的,很容易意外地更改父进程无法处理的内容。由于数据是在没有副本的情况下共享的,因此父进程不能继续与子进程同时运行,因此它必须等待子进程执行_exit或调用exec,以便在父进程开始修改数据时不再使用该数据。
发布于 2010-04-13 00:38:25
我认为您真正想要做的是利用SIGCHLD并维护一个子进程列表。然后,您可以通过当子进程更改状态时(主要是在它们死亡时)通知您的主进程,并基于此对它们执行一些操作,从而消除double fork。您还可以跟踪任意子进程完成所需的时间(因为您将它们的创建时间存储在列表中),并在它们疯狂且永远不会完成时采取行动。
https://stackoverflow.com/questions/2617289
复制相似问题