5

マルチコアマシンで、同じコア上にフルキャパシティーで複数のプロセスがある場合、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アフィニティを手動で設定できることは知っていますが、それは壊れやすい解決策のように思えますか?

4

1 に答える 1

2

これはコードの問題ではなく、OSスケジューラの問題です。それは私(ubuntu 11.10)の有無にかかわらず期待どおりに機能しますsleep(3)

ただし、 SSCCEを投稿する場合は+1

于 2012-04-04T21:04:10.047 に答える