fork()vfork() 都是系统调用,它们创建一个类似于称为 fork()vfork() 的进程的新进程。 fork() 的使用允许同时执行两个进程。 另一方面,vfork() 系统调用暂停父进程的执行,直到子进程完成其执行过程。

在本文中,将了解 fork()vfork() 函数之间的区别。 但在讨论差异之前,必须了解 fork()vfork() 函数。

fork()是什么?

fork()系统调用主要用于创建一个新进程。 子进程是fork()系统调用生成的新进程,父进程是fork()系统调用触发的进程。 子进程代码与其父进程的代码类似。 当一个子进程形成时,父进程和子进程都从fork()之后的下一条语句开始执行,并且两个进程同时执行。

父进程和子进程有不同的地址空间。 因此,每当其中一个进程更改代码中的语句或变量时,另一个进程的代码将不会反映这一点。 例如,如果子进程更改代码,则不会影响父进程。

某些子进程在创建后可能会立即调用 exec() 函数。 系统函数 exec() 将当前进程替换为其参数中定义的程序。 之后,子进程的不同地址空间就没用了,包含了copy-on-write功能。 写时复制功能使父进程和子进程都可以传输相同的地址空间。 如果每个进程都写入地址空间的页面,则会创建地址空间的副本以使两个进程能够独立运行。

vfork()是什么?

vfork() 是另一个用于创建新进程的系统调用。子进程是由 vfork() 系统调用形成的新进程,而父进程是使用 vfork() 系统调用的进程。子进程的代码与其父进程的代码相当。因为子进程和父进程共享相同的地址空间,所以子进程会暂停父进程的执行,直到子进程完成其执行。

子进程和父进程都传输相同的地址空间。如果其中一个进程更改了代码,则另一个进程传输相同的页面是可见的。假设父进程修改代码;它将反映在子进程代码中。

vfork() 系统调用不会为父进程和子进程创建单独的地址空间。因此,它应该应用于子进程在创建后立即应用 exec() 函数的地方。因此,不会浪费任何地址空间,这是创建进程的最有效方法。 vfork() 系统调用不支持写时复制。

fork() 和 vfork() 的区别

fork()vfork()之间存在各种关键区别。fork()vfork()之间的一些主要区别如下:

fork()形成的子进程的内存空间与父进程不同。相比之下,由 vfork()系统调用形成的子进程使用与其父进程相同的地址空间。
由于父进程和子进程的内存空间是独立的,因此其中一个进程所做的任何修改都不会影响其他进程的页面。由于父进程和子进程共享相同的内存地址,因此任何进程所做的任何更改都会反映在地址空间中。
当子进程修改地址空间中的页面时,由于地址空间不同,父进程看不到该页面。相比之下,当子进程更改地址空间中的页面时,父进程是可见的,因为它们使用相同的地址空间。
fork() 系统调用创建的子进程与父进程同时运行。相比之下,由vfork()系统调用形成的子进程会暂停父进程的执行,直到它完成。
作为替代方案,fork()系统调用采用写时复制,允许子和父共享相同的地址空间,直到其中一个更新页面。相比之下,vfork()系统调用不使用写时复制。
fork()系统调用中,子进程不会暂停父进程的执行。相比之下, vfork()系统调用会暂停父进程的执行。
fork()系统调用中存在地址空间浪费。相比之下,在 vfork()系统调用中没有地址空间浪费。
fork()系统调用在进程中被高度使用。相比之下,vfork()系统调用使用较少。

fork()vfork()系统调用之间的比较区别

在这里,将了解 fork()vfork()系统调用之间的头对头比较。fork()vfork()系统调用之间的一些主要区别如下:

特征 fork() vfork()
基本 fork()系统调用中,两个进程都有独立的地址空间。 vfork()系统调用中,子进程和父进程都使用相同的地址空间。
执行 fork()中,子进程和父进程同时执行。 vfork()中,父进程保持暂停,直到子进程完成其执行。
Copy-on-write 作为一种替代方法,fork()系统调用采用了copy-on-write,允许子和父共享相同的地址空间,直到其中一个更新页面。 vfork()系统调用不使用写时复制。
修改 当子进程更改地址空间中的页面时,由于地址空间不同,父进程看不到它。 当子进程更改地址空间中的页面时,父进程是可视的,因为它们使用相同的地址空间。
浪费 fork()系统调用中存在地址空间浪费。 vfork()系统调用中没有地址空间浪费。
已使用 fork()系统调用在进程中被高度使用。 vfork()使用较少。
挂起 fork()系统调用中,子进程不会挂起父进程的执行。 vfork()系统调用停止父进程执行。
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:fork()和vfork()的区别
本文链接:https://www.vsdiffer.com/vs/fork-vs-vfork.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。