Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple processes stuck on same cpu after multiple 'fork's (Linux/C)

On a multi-core machine, why doesn't the CPU automatically move a process to a new core if there are multiple processes all on the same core at full capacity?

Here is a sample program which reproduces the problem I'm seeing:

#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;
}

This works as expected (when I check top, I see all 4 processes are running at 100%).

However, if I remove the "sleep(3)" line, then sometimes multiple processes are set to the same CPU and thus not running at full capacity (for example, one process might be at 100% while the other 3 are each at 33%). What's going on and how do I fix it?

I know I can manually set the CPU affinity, but that seems like a fragile solution?

like image 500
Switch Avatar asked Nov 04 '22 02:11

Switch


1 Answers

This isn't an issue with your code, it's an issue with your OS scheduler. It works as expected for me (ubuntu 11.10) both with and without the sleep(3)

But +1 for posting an SSCCE

like image 78
je4d Avatar answered Nov 07 '22 20:11

je4d