【问题标题】:Does /proc/sys/kernel/sched_child_runs_first work?/proc/sys/kernel/sched_child_runs_first 工作吗?
【发布时间】:2013-06-27 18:58:53
【问题描述】:

我了解到在/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:我只是在尝试看看它是否有效,所以请不要建议其他同步机制或为什么这是一个坏主意等。

【问题讨论】:

  • @AmanDeepGautam 感谢您的链接。是的,我也读过 Michael Kerrisk 书中的大部分内容。但他建议在上面的文件“保证”中设置孩子将首先运行的值,或者可能是我读错了。
  • 但是链接说他们正在从内核版本 2.6 中删除对此的支持,我找不到他们说再次添加支持的更新帖子。所以可能通过这种方式是不可能的,但我不是这件事的权威..:)
  • @AmanDeepGautam 也许,除非有人能确认,否则我需要深入挖掘。还是谢谢。
  • 在带有 Raspbian 的 Raspberry Pi Zero 上使用以下命令: $ sudo echo "1" > /proc/sys/kernel/sched_child_runs_first $ ./fork_whos_on_first 10000 > fork.txt $ ./fork_whos_on_first。 count.awk fork.txt 我得到以下数字(相对于 100%,“0”为 100%): child 21 0.21% parent 9979 99.79%

标签: c linux linux-kernel


【解决方案1】:

据我所知,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 是否小于 se 的 vruntime em>。

因此,条件成功的唯一方法是 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 参数可能会产生影响 - 它不能保证任何事情。

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

【讨论】:

  • 感谢您的回答。我需要一些时间来完成它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2020-12-23
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多