Linux调度程序是否更喜欢在fork()之后运行子进程?

时间:2014-05-16 13:11:44

标签: linux fork scheduling

Linux调度程序是否更喜欢在fork()之后运行子进程到父进程?

通常,分叉进程将执行某种类型的exec,因此,最好让子进程在父进程之前运行(以防止写入时复制)。

我假设孩子在创建后将执行exec作为第一个操作。

我的假设(调度程序更喜欢子进程)是否正确。如果没有,为什么?如果是的话,是否有更多的理由让孩子先行?

2 个答案:

答案 0 :(得分:6)

引用The Linux Programming Interface (pg. 525)作为一般答案:

  

fork()之后,不确定哪个进程 - 父进程或子进程 - 接下来可以访问CPU。 (在多处理器系统上,它们可以同时访问CPU。)

本书继续讨论内核版本的差异,并提到了CFS / Linux 2.6.32:

  

[...]自Linux 2.6.32以来,它再次成为父级,默认情况下,在fork()之后首先运行。可以通过为特定于Linux的/proc/sys/kernel/sched_child_runs_first文件指定非零值来更改此默认值。

This behaviour is still present with CFS虽然此功能的未来有some concerns。查看CFS实现,它seems to schedule孩子之前的父母。

您的方法是将/proc/sys/kernel/sched_child_runs_first设置为非零值。

修改: This answer分析默认行为并将其与sched_child_runs_first进行比较。

答案 1 :(得分:3)

对于孩子在第一时间调用exec的情况,您可以使用vfork而不是fork。 vfork暂停父级,直到孩子调用_exitexec *。但是,一旦它调用exec,如果必须从磁盘加载代码,则子项将被暂停。在这种情况下,父母很有可能在孩子出生之前继续。