2011-09-25 60 views
0

我听说Unix的fork会复制当前进程。这是否意味着完全相同的程序和状态会在新的子进程中产生?我不明白为什么它以这种方式工作。因为它看起来效率低下。如何在Unix中用不同的程序启动一个新的进程?

  1. 什么的复制?
  2. 它为什么这样工作?
  3. 有没有其他办法产卵新的子进程? (或分离过程)

回答

3

它工作的方式 - 那种。它主要是使用“写入时复制”来实现的,这意味着大多数内存页面在两个进程之间共享,直到孩子尝试写入页面,此时它真的被复制。因此,如果一个孩子被分叉,然后立即加载并执行一个新的二进制映像,那么您担心的低效率不会发生:从父节点开始的内存页副本永远不会实际创建。

是否有其他方法可以使子进程?当然,其他操作系统的做法有所不同。 UNIX方式实际上是一种非常有效的方式,以便子进程可以从其父级继承打开的文件描述符,环境变量和其他系统信息:它实际上导致减少的工作,而不是更多!

2

fork在现代操作系统上非常高效。它仅通过Copy on Write技术或类似方法复制所需的页面。

不同的操作系统有不同的产卵方式。 Linux有一个clone系统调用(并且fork基于此),可以对新进程从其父进程继承的内容进行很多控制。

为什么它的工作原理是这样的,我不知道。它效率高,范围广泛,并且使用和理解起来相当简单(一旦你阅读了手册页并查看了示例)。

1

调用fork()的认为克隆的时候(你有一个的图像,但等待他们是相同的 - 这是第一位的,这是第二次/克隆一个),有成为下一个子线程主线程(父/子)。分叉是一个系统调用,但开销是微妙的,除非你随后调用exec。所以,fork/execing在unix中花费很大。

叉:一个子过程需要在父的属性 - 所以有排序在相同的内存空间两个单独的可运行代码段(一个父,和一个子)。为了通过调用'exec'来分隔两个后续部分,现在子代码部分成为一个分离的可运行进程,并且具有来自其父进程的父代代码。如果你只是使用fork(),那么你必须管理谁是父母的谁是孩子的单独的代码部分。

exec调用是内核开销的开销,而不是fork。

1

这是否意味着完全相同的程序和状态会在新的子进程中产生?

不完全一样的状态。有一个小小的差异:fork返回值会根据父进程或子进程而有所不同。当然,这些pid也会有所不同。

此外,启动新流程不需要用fork完成。当fork证明实现太困难时,posix_spawn已被标准化为替代方案。

http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_spawn.html

0

哦,如果你能解释一下如何“init”的init进程或交换技术在UNIX中创建,那么您了解UNIX进程创建的概念:叉/ EXEC。一件美丽的事!

相关问题