使用以下代码分叉四个智利流程
#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