前文中我们已经介绍了父子进程进行fork时的读时共享 写时复制操作( Linux 进程共享(读时共享 写时复制)是什么.)。现在我们进一步介绍一下vfork并且介绍fork与vfork的区别。
1. 引入vfork
在了解过fork的读时共享 写时复制操作后我们知道,复制出的子进程拥有自己的虚拟空间,但是物理空间是与父进程共享的,直到父子进程对数据进行更改时,再为子进程相应的段分配物理空间。
vfork则直接共享了父进程的虚拟空间,当然了,这种做法就顺水推舟的共享了父进程的物理空间。
vfork系统调用不同于fork,用vfork创建的子进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改同样为父进程所见。但是用 vfork创建子进程后,父进程会被阻塞直到子进程调用exec或exit。这样的好处是在子进程被创建后仅仅是为了调用exec执行另一个程序时,因为它就不会对父进程的地址空间有任何引用,所以对地址空间的复制是多余的,通过vfork可以减少不必要的开销。
2. fork()和vfork()的区别
-
fork():子进程拷贝父进程的数据段,代码段
vfork():子进程与父进程共享数据段 -
fork() 父子进程的执行次序不确定
vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
或exit 之后父进程才可能被调度运行。 -
vfork() 保证子进程先运行,在它调用exec()或exit()之后父进程才可能被调度运行。如果在
调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
参考文章:
1. fork与vfork的区别.
2. 浅析fork()和底层实现.