【问题标题】:Some part of fork() mechanismfork() 机制的一部分
【发布时间】:2012-08-15 05:11:23
【问题描述】:

在阅读“Linux 内核开发”后,我看到了下一条语句:

传统上,在fork() 上,父级拥有的所有资源都是重复的,并且 复制给孩子。这种方法幼稚且效率低下,因为它复制了很多 否则可能会被共享的数据。更糟糕的是,如果新进程要立即 执行一个新图像,所有的复制都会浪费

为什么fork() 需要复制所有父母的资源?为什么我们不能简单地为新进程所需的所有资源分配新的空间块?为什么需要抄袭?最后一个查询 - 如果新进程要立即执行新图像,为什么复制会浪费?

【问题讨论】:

  • 一段时间以来,fork() 的一个变体称为 vfork(),pubs.opengroup.org/onlinepubs/7908799/xsh/vfork.html,它不会复制资源。它旨在用于表单后跟 exec() 的情况。问题是,如果 exec() 调用失败怎么办?子进程没有自己的资源(内存、文件描述符)来进行错误报告或错误处理。

标签: linux linux-kernel fork


【解决方案1】:

如果我们没有像使用管道那样执行新图像,那么复制所有父资源非常重要。当他们实现 fork() 时,无论程序员如何使用它都应该是通用的。所以复制父资源是有意义的。

【讨论】:

    【解决方案2】:

    嗯,这种低效率并不是那么低效率。 AFAIK,fork() 执行 copy-on-write。这种机制使内存只有在子进程尝试写入时才被复制。因此,x 如果子进程不写入,则不会被复制,但它可以访问该变量以进行读取。写入尝试通常由称为“内存管理单元”的硬件检测。

    另一方面,在某些应用程序中,从子进程继承状态变量非常有用,因此在这种情况下“清理”内存空间将没有用处。

    【讨论】:

      【解决方案3】:

      为什么我们不能简单地为所有资源分配新的空间 新进程需要

      forks(2) 的语义表明,当您执行此操作时,另一个进程开始从该点执行。所以如果它开始执行,它自然会对声明的变量、它们的值等有一些期望。您需要复制父母有权访问的所有内容*。

      int x = 42;
      fork();
      if (parent)
          /* x == 42. */
      else
          /* I can haz x ? */
      

      如果新进程要立即执行新映像,为什么要复制? 浪费

      如果新的过程证明不需要从那一点继续,那么这个复制是完全没有用的。例如,如果新进程只是想开始执行一个新程序,它就不需要上面提到的任何变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-22
        • 2020-12-30
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        相关资源
        最近更新 更多