Linux调度程序是否更喜欢在fork()
之后运行子进程到父进程?
通常,分叉进程将执行某种类型的exec
,因此,最好让子进程在父进程之前运行(以防止写入时复制)。
我假设孩子在创建后将执行exec
作为第一个操作。
我的假设(调度程序更喜欢子进程)是否正确。如果没有,为什么?如果是的话,是否有更多的理由让孩子先行?
答案 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
暂停父级,直到孩子调用_exit
或exec
*。但是,一旦它调用exec
,如果必须从磁盘加载代码,则子项将被暂停。在这种情况下,父母很有可能在孩子出生之前继续。