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親和力,但這似乎是一個脆弱的解決方案?