首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个父进程在变得不可行之前可以生成多少个子进程?

一个父进程在变得不可行之前可以生成多少个子进程?
EN

Stack Overflow用户
提问于 2017-02-24 18:00:16
回答 2查看 1.3K关注 0票数 2

我是一个C程序员,第一次学习fork()exec()wait()。我也在白板一个标准C程序,它将运行在Linux上,并且可能需要很多子进程。我无法估量的是..。有多少子进程是太多的父母之一产生,然后等待?

假设我的代码如下所示:

代码语言:javascript
复制
pid_t status[ LARGENUMBER ];
status[0] = fork();
if( status[0] == 0 )
{
    // I am the child
    exec("./newCode01.c");
}
status[1] = fork();
if( status[1] == 0 )
{
    // child
    exec("./newCode02.c");
}
...etc...
wait(status[0]);
wait(status[1]);
...and so on....

显然,LARGENUMBER越大,当子节点分段、出错或变成僵尸之类的时候,父级仍然是叉()的可能性就越大。

因此,这个实现在我看来是有问题的。据我所知,父母只能一次为一个孩子等待()()?如果LARGENUMBER是巨大的,并且运行status =();和之间的时间差很大,那么怎么办?如果孩子已经跑了,变成了僵尸,并在那个时候被操作系统终止了呢?那么父母会永远wait(status)吗?

在上面的示例中,必须有一些关于LARGENUMBER可以有多大的标准或指南。还是我的方法都错了?

代码语言:javascript
复制
#define LARGENUMBER 1
#define LARGENUMBER 10
#define LARGENUMBER 100
#define LARGENUMBER 1000
#define LARGENUMBER ???

我想玩这个游戏,但我的本能是在我把开发时间投资到一个可能不可行的项目之前征求意见。如有任何建议或经验,敬请见谅。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-24 22:45:48

我会尽力解释的。

首先是一个不好的例子:在fork()一个子进程中,然后等待它完成,然后再分叉另一个子进程。这就扼杀了多进程度,降低了CPU利用率。

代码语言:javascript
复制
pid = fork();
if (pid == -1) { ... } // handle error
else if (pid == 0) {execv(...);} // child
else (pid > 0) {
    wait(NULL);  // parent
    pid = fork();
    if (pid == -1) { ... } // handle error
    else if (pid == 0) {execv(...);} // child
    else (pid > 0) {wait(NULL); } // parent
}

应该怎么做呢?在这种方法中,首先创建两个子进程,然后等待。提高CPU利用率和多处理度。

代码语言:javascript
复制
pid1 = fork();
if (pid1 == -1) { ... } // handle error
if (pid1 == 0) {execv(...);}
pid2 = fork();
if (pid2 == -1) { ... } // handle error
if (pid2 == 0) {execv(...);}
if (pid1 > 0) {wait(NULL); }
if (pid2 > 0) {wait(NULL); }

注:

尽管在执行第二次等待之前,父进程似乎在等待,但子进程仍在运行,而不是等待execv或派生。

在您的示例中,您正在执行第二种方法,首先对所有进程进行分叉,然后保存fork的返回值,然后等待。

家长一次只能等待()一个孩子?

父服务器可以一次只等待它的所有子节点,不管它们已经完成并成为zombie process,还是仍在运行。有关更多解释的细节,请参见这里

一个父进程在变得不可行之前可以生成多少个子进程?

它可能依赖于操作系统,但一种可接受的方法是将进程的运行时间分为2,一半用于子进程,一半用于父进程。这样,进程就不会耗尽系统并通过创建子进程来欺骗,子进程的运行量将超过操作系统最初希望给父进程的权限。

票数 1
EN

Stack Overflow用户

发布于 2017-02-24 18:55:38

如果你读了wait,你就会知道

如果状态信息在调用wait()之前可用,则返回将是立即的。

这意味着,如果孩子已经终止,wait()将立即返回。在您为子进程调用wait1或程序退出之前,操作系统不会从处理表中删除这些信息:

如果父进程终止而不等待其所有子进程终止,则将为剩余的子进程分配一个新的父进程ID,该ID对应于依赖于实现的系统进程。

当然,您仍然不能产生无限数量的子程序,有关该问题的更多细节请参见Linux上的最大子进程数 (就Linux而言,其他操作系统将施加其他限制)。

1:流程

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42445350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档