fork()和vfork()之间的区别

作者: Laura McKinney
创建日期: 2 四月 2021
更新日期: 10 可能 2024
Anonim
os-ch01.26-Linux中process和thread都是task。產生thread呼叫clone,產生process呼叫fork。這二者背後都是do_fork()
视频: os-ch01.26-Linux中process和thread都是task。產生thread呼叫clone,產生process呼叫fork。這二者背後都是do_fork()

内容


叉子()vfork()系统调用 创建一个新进程,该进程与调用fork()或vfork()的进程相同。使用 叉子() 允许同时执行父进程和子进程。另一种方法, vfork() 暂停父进程的执行,直到子进程完成其执行。 fork()和vfork()系统调用之间的主要区别在于,使用fork创建的子进程具有与父进程不同的地址空间。另一方面,使用vfork创建的子进程必须共享其父进程的地址空间。

让我们借助下面显示的比较表找到fork()和vfork()之间的一些区别。

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较表

比较基础叉子()vfork()
基本的子进程和父进程具有单独的地址空间。子进程和父进程共享相同的地址空间。
执行父子进程同时执行。父进程保持暂停状态,直到子进程完成其执行。
修改如果子进程更改了地址空间中的任何页面,则父进程将看不到它,因为地址空间是分开的。如果子进程更改了地址空间中的任何页面,则父进程将共享同一地址空间,因此对父进程可见。
写时复制fork()使用写时复制作为替代方法,其中父级和子级共享相同的页面,直到它们中的任何一个修改共享页面为止。vfork()不使用写时复制。

fork()的定义

叉子() 是系统调用,用于创建 新过程。 fork()调用创建的新进程是调用fork()系统调用的进程的子进程。子进程的代码与其父进程的代码相同。创建子进程后,两个进程(即父进程和子进程)都从fork()之后的下一条语句开始执行,并且两个进程都被执行 同时.


父进程和子进程确实具有 单独的地址空间。因此,当任何进程修改了代码中的任何语句或变量时。它不会反映在其他过程代码中。假设子进程修改了代码不会影响父进程。

创建后的某些子进程立即调用 exec()。 exec()系统调用 替代过程 使用其参数中指定的程序。这样子进程的单独地址空间就没有用了。这里的一种选择是写时复制。

写时复制 让父进程和子进程共享相同的地址空间。如果任何进程在地址空间的页面上写入,则会创建地址空间的副本,以使两个进程都独立工作。

vfork()的定义

fork()的修改版本为vfork()。的 vfork() 系统调用还用于创建新进程。与fork()相似,这里创建的新进程也是调用vfork()的进程的子进程。子过程代码也与父过程代码相同。子进程在这里 暂停执行 父进程直到完成执行为止,因为两个进程共享相同的地址空间以供使用。

由于子进程和父进程共享 相同的地址空间。如果任何一个进程修改了代码,则其他共享相同页面的进程将看到该代码。让我们假设父进程是否更改了代码。它将反映在子进程的代码中。

由于使用vfork()不会为子进程和父进程创建单独的地址空间。因此,必须 已实施 子进程在哪里调用 exec() 创建后立即。因此,不会浪费地址空间,这是 有效率的 创建过程的方式。 vfork不使用 写时复制.

  1. fork和vfork之间的主要区别在于,由 叉子 有个 单独的内存空间 从父进程。但是,由 系统调用共享 相同的地址空间 它的父进程。
  2. 使用fork创建的子进程 同时执行 与父进程。另一方面,使用vfork创建的子进程 暂停 父进程的执行,直到执行完成为止。
  3. 由于父进程和子进程的存储空间是分开的,因此任何进程进行的修改都不会影响其他页面。但是,由于父进程和子进程共享相同的内存地址,因此任何进程所做的修改都会反映在地址空间中。
  4. 系统调用fork()使用 写时复制 作为替代方案,它允许子进程和父进程共享相同的地址空间,直到它们中的任何一个修改页面为止。另一方面,vfork不使用写时复制。

结论:

在使用fork()创建子进程后立即执行子进程调用exec()时,必须实现vfork()系统调用。因为用于子进程和父进程的单独地址空间在这里没有用。