マルチコアマシンで、同じコア上にフルキャパシティーで複数のプロセスがある場合、CPUがプロセスを新しいコアに自動的に移動しないのはなぜですか?
これが私が見ている問題を再現するサンプルプログラムです:
#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;
}
これは期待どおりに機能します(topを確認すると、4つのプロセスすべてが100%で実行されていることがわかります)。
ただし、「sleep(3)」行を削除すると、複数のプロセスが同じCPUに設定され、フルキャパシティーで実行されない場合があります(たとえば、1つのプロセスが100%で、他の3つがそれぞれ33である場合があります)。 %)。何が起こっているのですか、どうすれば修正できますか?
CPUアフィニティを手動で設定できることは知っていますが、それは壊れやすい解決策のように思えますか?