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
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。