fork()和vfork()的区别
fork()
fork()
是用于创建新进程的系统调用。通过 fork()
系统调用创建的新进程被称为子进程,调用 fork()
系统调用的进程被称为父进程。子进程的代码与父进程的代码相同。一旦子进程被创建,父进程和子进程都从 fork()
之后的下一条语句开始执行,两个进程同时执行。
vfork()
vfork()
也是一个系统调用,用于创建新的进程。通过 vfork()
系统调用创建的新进程被称为子进程,调用vfork()系统调用的进程被称为父进程。子进程的代码和其父进程的代码相同。子进程暂停父进程的执行,直到子进程完成其执行,因为两个进程共享同一个地址空间。
fork()
和 vfork()
的区别 :
编号 | fork() |
vfork() |
---|---|---|
1 | 在 fork() 系统调用中,子进程和父进程有独立的内存空间。 |
在 vfork() 系统调用中,子进程和父进程共享同一个地址空间。 |
2 | 子进程和父进程同时被执行。 | 一旦子进程被执行,父进程就开始执行。 |
3 | fork() 系统调用使用写时拷贝作为替代。 |
vfork() 系统调用不使用写时复制。 |
4 | 在 fork() 系统调用中,子进程不会暂停父进程的执行。 |
子进程在 vfork() 系统调用中暂停父进程的执行。 |
5 | 一个进程的页面不受其他进程的页面影响。 | 一个进程的页面被另一个进程的页面所影响。 |
6 | fork() 系统调用使用得多 |
vfork() 系统调用使用得少。 |
7 | 存在地址空间的浪费。 | 没有浪费地址空间。 |
8 | 如果子进程改变了地址空间中的页面,父进程是看不到的。 | 如果子进程改变了地址空间中的页面,那么它对父进程是可见的。 |