forking()和CreateProcess()

Sun*_*nny 7 fork createprocess

对于Linux和WinXP,forking()和CreateProcess(带有所有必需的参数)分别是同一回事吗?

如果它们不同,那么有人可以用两种情况下的不同来解释这种差异吗?

谢谢

mer*_*hoo 8

CreateProcess 执行以下步骤:

\n\n
    \n
  • 在内核中创建并初始化进程控制块 (PCB)。
  • \n
  • 创建并初始化新的地址空间。
  • \n
  • 将程序 prog 加载到地址空间中。
  • \n
  • 将参数 args 复制到地址空间中的内存中。
  • \n
  • 初始化硬件上下文以在 \xe2\x80\x9cstart\xe2\x80\x9d 处开始执行。
  • \n
  • 通知调度程序新进程已准备好运行。
  • \n
\n\n

Unix 的 fork 采取以下步骤:

\n\n
    \n
  • 在内核中创建并初始化进程控制块(PCB)
  • \n
  • 创建新的地址空间
  • \n
  • 使用父地址空间的全部内容的副本\n初始化地址空间
  • \n
  • 继承父级的执行上下文(例如,任何打开的文件)
  • \n
  • 通知调度程序新进程已准备好运行
  • \n
\n\n

它创建父进程的完整副本,并且父进程不会为子进程设置运行时环境,因为父进程信任其自己的设置。子进程是父进程的完整副本,除了其进程 ID(fork 返回的内容)之外。分叉进程继续运行与其父进程相同的程序,直到它执行显式 exec。当子进程调用execwhich时,新的可执行映像进入内存并运行。

\n\n

制作完整副本的效率如何?写时复制。它实际上只复制虚拟内存映射。段表中的所有段都是只读的。如果父级或子级编辑段中的数据,则会引发异常,并且内核会创建该异常的完整内存副本。这个答案很好地解释了这一点

\n\n

父级和子级之间共享资源有几个好处:\n - 直观上,资源管理:维护进程状态所需的内存更少\n - 共享缓存资源意味着在数据不被覆盖时数据具有更大的时间局部性,这可以提高性能,因为从较大的缓存/磁盘中检索数据非常耗时。

\n\n

共享资源的缺点:\n - 当写入很常见时,它会将数据置于对其他进程无效的状态,这会导致一致性缺失,如果子进程在单独的核心上运行,则代价高昂,因为更改将必须传播到 L3 缓存。

\n\n

但一般来说,程序读取的次数比写入多得多,通常子程序/父程序只需要对其堆栈进行写入,而这只是其程序块的一小部分。

\n\n

另外,Unix fork 是不同的,因为它返回两次,一次在父进程中(其子进程的进程 ID),一次在子进程中(0,恭喜你是一个新的婴儿进程),这就是我们在代码中区分的方式:我们是孩子或父母。

\n\n

Unix Exec 执行以下操作:

\n\n
    \n
  • 将程序 prog 加载到当前地址空间。
  • \n
  • 将参数 args 复制到地址空间中的内存中。
  • \n
  • 初始化硬件上下文以在 \xe2\x80\x9cstart.\xe2\x80\x9d 处开始执行
  • \n
\n\n

家长可以选择等待孩子完成。当子进程完成时,当调用 exit 时,即通知父进程的等待。

\n


Som*_*ude 5

他们在不同的系统上做不同的事情。CreateProcess是仅Windows功能,而fork仅在POSIX(例如Linux和Mac OSX)系统上。

fork系统调用创建一个新的进程,并继续在父,并从其中的节骨眼儿两个执行fork函数被调用。CreateProcess创建一个新进程并从磁盘加载程序。唯一的相似之处是最终结果是创建了一个新过程。

欲了解更多信息,请阅读各手册页CreateProcessfork