2012-04-04 32 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

相關問題