2012-04-04 31 views
4

在多核计算机上,如果多个进程都在同一个内核上,为什么CPU不自动将进程移动到新内核上名额已满?多个fork之后多个进程卡在同一个cpu上(Linux/C)

这里是一个再现我看到了问题的一个范例程序:

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

void RunClient(int i) { 
    printf("Starting client %d\n", i); 
    while (true) { 
    } 
} 


int main(int argc, char** argv) { 
    for (int i = 0; i < 4; ++i) { 
    pid_t p_id = fork(); 
    sleep(3); 
    if (p_id == -1) { 
     perror("fork"); 
    } else if (p_id == 0) { 
     RunClient(i); 
     exit(0); 
    } 
    } 

    return 0; 
} 

可正常工作(当我检查顶部,我看到所有4个进程都运行在100%)。但是,如果我删除了“睡眠(3)”行,则有时多个进程会设置为相同的CPU,因此无法以满负荷运行(例如,一个进程可能为100%,而另一个进程可能为100%均为33%)。怎么回事,我该如何解决?

我知道我可以手动设置CPU亲和力,但这似乎是一个脆弱的解决方案?

回答

2

这不是你的代码的问题,这是你的OS调度器的问题。它按预期工作,我(的Ubuntu 11.10)既没有在sleep(3)

但+1张贴的SSCCE

相关问题