vfork()函数

来源:互联网 发布:杨辉三角c语言讲解 编辑:程序博客网 时间:2024/05/12 22:22

Linux通过系统调用和fork()的功能相同,除了不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。子进程不能向地址空间写入。在过去的3BSD时期,这个优化是很有意义的,那时并未使用写时拷贝也来实现fork()。现在由于在执行fork()是引入了写时拷贝页表项了。如果Linux将来fork()有了写拷贝页表项,那么vfork()就彻底没用了。另外由于vfork语意非常微妙( 试想,如果exec()调用失败会发生什么?),所以最好让他逐渐淡出。完全可以把vfork()实现成一个普普通通的fork()-----实际上,Linux2.2以前都是这么做的。

vfork()系统调用的实现是通过向clone()系统调用传递一个特殊标志来进行的。

  • 在调用copy_process()时,task_struct的vfork_done成员被设置为NULL。
  • 在执行do_fork()时,如果给定特别标志,则vfork_done会指向一个特殊地址。
  • 子进程开始执行后,父进程不是马上恢复执行,而是一直等待,直到子进程通过vfork_done指针指向它发送信号。
  • 在调用mm_release()时,该函数用于进程退出内存地址空间,并且检查vfork_done是否为空,如果不为空,则会向父进程发送信号。
  • 回到do_fork(),父进程醒来并返回。
         如果一切执行顺利,子进程在新的地址空间里运行而父进程也恢复了在原地址空间的运行。这样的实现,开销确实降低了,不过他的设计并不是优良的。

0 0