gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:07:55 25 4
gpt4 key购买 nike

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

程序的主要工作流程如下:

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 的子进程。

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

编辑: 我在使用 read()write() 时打印了 fds 的 Id,我发现读取开始于4 写在 5,我不知道为什么会这样,有人知道吗?

最佳答案

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

关于c - 如果使用管道时子进程数大于处理器数,进程是否会被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70145745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com