gpt4 book ai didi

c -/proc/sys/kernel/sched_child_runs_first 工作吗?

转载 作者:IT王子 更新时间:2023-10-29 01:13:47 25 4
gpt4 key购买 nike

我了解到在 /proc/sys/kernel/sched_child_runs_first 中设置一个非零值将强制子进程在父进程之前运行。但是,我认为它似乎没有用。这是我的代码:

#include <stdio.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
pid_t child_pid;

switch(child_pid = fork())
{
case 0:
printf("In Child\n");
exit(0);

case -1:
printf("Could not fork()\n");

default:
printf("In parent\n");

}
return 0;
}

我得到的输出总是:

In parent
In Child

我这里是不是有什么问题?

PS:我只是在试验看看它是否有效,所以请不要提出其他同步机制或为什么这是个坏主意等。

最佳答案

据我所知,实现 sched_child_runs_first 功能的地方是在 task_fork_fair 函数中,您可以查看其源代码 here .

该函数的关键部分如下所示:

if (curr)
se->vruntime = curr->vruntime;
place_entity(cfs_rq, se, 1);

if (sysctl_sched_child_runs_first && curr && entity_before(curr, se)) {
swap(curr->vruntime, se->vruntime);
resched_task(rq->curr);
}

se 是新的调度实体,curr 是当前任务的调度实体。

请注意,新实体的 vruntime 首先使用与当前任务相同的值进行初始化。这很重要,因为 entity_before 调用正在检查 currvruntime 是否小于 vruntime < em>se.

因此,条件成功的唯一方法是 place_entity 调用将 sevruntime 设置为更大的值。那么让我们看看source为了那个原因。关键位是:

u64 vruntime = cfs_rq->min_vruntime;

if (initial && sched_feat(START_DEBIT))
vruntime += sched_vslice(cfs_rq, se);

se->vruntime = max_vruntime(se->vruntime, vruntime);

因此,假设设置了 START_DEBIT 功能(seems to be the case),则 vruntime 将设置为运行队列的 min_vruntime 加上无论 sched_vslice 调用返回什么。如果它大于当前的 vruntime,那么我们就设置好了 - 如果不是,我们将保留我们的初始 vruntime 值并且条件不会成功。

我不太了解 Linux 调度,无法肯定地说,但我猜测 min_vruntime 加上 sched_vslice 大多数时候都不够大.

我说大部分时间是因为,当我进行测试时,至少在某些时候我能够让子进程先运行。所以 sched_child_runs_first 参数可能确实有所作为 - 它只是不能保证任何事情。

另一种可能是代码中的错误,他们在计算初始值时应该从当前任务的vruntime开始而不是运行队列的min_vruntimeplace_entity 函数中。那将保证条件会成功。但我怀疑按照他们的方式做事是有原因的,我就是不明白。

关于c -/proc/sys/kernel/sched_child_runs_first 工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17391201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com