多个子进程的执行顺序是什么

时间:2019-10-29 14:29:07

标签: c linux-kernel fork scheduling cfs

使用以下代码分叉四个智利流程

#define _GNU_SOURCE
#include  <stdio.h>
#include  <unistd.h>
#include  <sys/wait.h>
#include  <stdlib.h>

pid_t pid;
int child(int id);

int main(void)
{
    int cpus = 0; 
    cpus = sysconf(_SC_NPROCESSORS_CONF);
    printf("cpu number %ld\n",cpus);

    if ((pid = fork())==0)
        child(1);  
    if ((pid = fork())==0)
        child(2);
    if ((pid = fork())==0)
        child(3);
    if ((pid = fork())==0)
        child(4);

    printf("fork over\n");
    int i,status;  
    for (i=0;i<4;i++)
    { 
    pid = wait(&status);
    }
    exit(0);
}

int child(int id)
{
    printf("child %d is running!pid :%d\n",id,getpid());
    exit(id);
}

我在vmware中运行该代码,并将cpu num设置为1。
预期的输出是第一个孩子是第一个孩子。 但是实际输出恰恰相反。

输出: 叉子
孩子4正在运行!pid:4258
孩子3正在运行!pid:4257
子2正在运行!pid:4256
子1正在运行!pid:4255

它们是正常过程,因此调度算法为CFS。
具有最小vruntime的进程应首先运行。
显然,子级1的vruntime小于其他项。
因此获得这样的输出真是令人困惑。 我希望有人能帮助我找出答案。

Linux发行版是Ubuntu 16.04
内核版本为4.4

0 个答案:

没有答案