【问题标题】:Are my fork processes running parallel or executing one after another?我的 fork 进程是并行运行还是一个接一个地执行?
【发布时间】:2020-10-21 16:04:11
【问题描述】:

我只是要发布伪代码, 但我的问题是我有这样的循环

for(i<n){
   createfork();
   if(child)
       /*
         Exit so I can control exact amount of forks 
         without children creating more children
        */
       exit
}


void createfork(){
 fork
 //execute other methods
}

我的 fork 是否创建了一个进程做它应该做的事情并退出然后创建另一个进程并重复?如果是这样,有什么方法可以解决这个问题,让进程同时运行?

【问题讨论】:

  • 一旦分叉,进程既可以独立运行也可以并发运行。
  • 视情况而定。如果您有多个内核,那么它​​们将并行运行。多任务操作系统的全部意义在于它提供了进程在单个处理器上并行运行的错觉,因此从您应该关心的唯一角度来看,它们是并行运行的。
  • @williampursell 是的,我完全理解这一点,老实说,我更喜欢多线程方法而不是多处理,但应用程序需要多个进程,我需要将其分解为至少 6 个它在技术上所做的部分。尽管如果可能的话,我会尝试让它们同时运行。
  • 2 个进程并行运行。父母和孩子。一旦“执行其他方法”返回,子进程被终止,父进程再次分叉。然后 OP 问道:“好吧,这是有道理的,这就是我认为正在发生的事情,那么在其他方法中使用 fork 是让它们全部并行运行的唯一方法吗?在给定循环的情况下,没有办法做到这一点吗?”跨度>

标签: c linux unix fork


【解决方案1】:

您的伪代码是正确的,不需要修改。

这些进程已经在并行执行,所有六个或你产生的多少。正如所写的,父进程在产生更多子进程之前不会等待子进程完成。它调用fork(),检查if (child)(被跳过),然后立即进行下一个for循环迭代并再次分叉。

值得注意的是,没有wait() 电话。如果父母要调用wait()waitpid() 来等待每个孩子完成,那么这将引入您试图避免的序列化。但是没有这样的电话,所以你很好。

【讨论】:

  • 谢谢,我发现效果很好的是为孩子们提供的休息声明。在我看来,这也使代码更清晰易读。而不是用方法加载方法。
【解决方案2】:

当一个进程成功执行 POSIX fork() 时,该进程和新的子进程最初都可以运行。从这个意义上说,它们将同时运行,直到一个或另一个块。是否会有任何时间段两者都执行机器指令(在不同的处理单元上)至少取决于硬件能力、操作系统调度、每个进程正在执行的工作以及系统中还有哪些其他进程以及什么他们在做。

通常情况下,父母当然不会在孩子继续自己的工作之前自动等待孩子终止(有一系列函数可以它在你想要的时候等待),子进程也不会自动等待来自父进程的任何信号。如果父母接下来要做的是派生另一个孩子,那么在许多情况下,这将导致父母与两个(所有)孩子同时运行,在上面描述的意义上。

我无法详细说明您的伪代码的行为,因为它是伪代码。

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2021-06-29
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多