使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

2024-06-20

当子进程数量很大时,我的程序停止运行。我不知道问题是什么,但我猜子进程在运行时以某种方式被阻止。

下面是该程序的主要工作流程:

void function(int process_num){

    int i;

    // initial variables for fork()
    int status = 0;
    pid_t child_pid[process_num], wpid;
    int *fds = malloc(sizeof(int) * process_num * 2);

    // initial pipes 
    for(i=0; i<process_num; i++){
        if(pipe(fds + i*2) <0)
            exit(0);
    }

    // start child processes to write
    for(i=0; i<process_num; i++){
        child_pid[i] =fork();

        if(child_pid[i] == 0){
            close(fds[i*2]);
            // do something ...
            // write(fds[i*2+1], something);
            close(fds[i*2+1]);
            exit(0);
        }else if(child_pid[i] == -1){
            printf("fork error\n");
            exit(0);
        }
    }

    // parent waits child processes and reads
    for(i=0; i<process_num; i++){

      pid_t cpid = waitpid(child_pid[i], &status, 0);
      if (WIFEXITED(status)){
        close(fds[i*2+1]);
        // do something ...
        // read(fds[i*2], something);
       close(fds[i*2]);
      }
    }
    free(fds);
    while((wpid = wait(&status)) > 0);
}

我通过 htop 检查了进程的状态,有几个(例如 8 个,而 process_num 为 110)子进程留下了状态S.

现在我的问题是:如果子进程的数量大于处理器的数量,在使用子进程和当前进程的管道进行通信时,子进程是否会被阻塞(父进程等待所有子进程执行)?多谢!

EDIT:我在使用时打印了fds的Idread() and write(),我发现读取从 4 开始,写入从 5 开始,我不知道为什么会这样,有人知道吗?


处理器的数量在这里没有影响。操作系统是活的,能够运行任何有事可做的进程。 这是一个纯软件问题,所有进程都处于睡眠状态(S),等待某个从未发生的事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞? 的相关文章

随机推荐