Linux fork && vfork

1. 地址空间各段拷贝:

     fork: 内核为子进程生成新的地址空间结构,拷贝父进程的代码段,数据空间,堆,栈到自身的地址空间,但注意:子进程的代码段并不会分配物理空间,而是指向父进程的代码段物理空间,保持共享;子进程的数据空间,堆,栈都会对应分配物理空间;

     写时复制(COW):内核为子进程生成新的地址空间结构,拷贝父进程代码段,数据空间,堆,栈道自身的地址空间,但是相应段都指向了父进程的对应段的物理空间,并且权限是只读的,如果父子进程任一个视图修改这些区域,则内核为修改区域的内存做一个副本;

 

     vfork: 内核不为子进程生成新的地址空间结构,直接共享父进程的虚拟地址空间,当然其对应的物理空间也是共享的;

 

2. 执行顺序:

  fork:父、子进程的执行顺序不确定;

  vfork:保证子进程先运行,在子进程调用了exec或者exit之后父进程才可能被调用运行,如果在调用这两个函数之前,子进程依赖父进程的进一步动作,将会导致死锁;

从内核进程调度的方面来讲,当子进程通过vfork创建之后,会比较其与父进程的虚拟运行时间,将较小的虚拟运行时间交换给子进程;因为调度使用红黑树,越小的虚拟运行时间将会越先被调度,从而保证了子进程先调度;

即使保证了子进程先执行,仍然无法保证子进程的任务能够在父进程调度之前完全的执行,如果需要保证顺序,则需要进行父子进程的同步;

本文链接:Linux fork && vfork

转载声明:转载请注明来源:Linux TCP/IP Stack,谢谢!


发表评论

电子邮件地址不会被公开。 必填项已用*标注