vfork() differs from fork() in that the parent is suspended until the child makes a call to execve(2) or _exit(2).
1:内核创建进程的主要开销:生成进程描述符,复制父进程的地址空间给子进程,复制页表。
2:fork工作过程,内核为子进程创建一个新的进程描述符,开始时候子进程共享父进程的进程地址空间,并复制父进程的页表给子进程。当子进程修改页表时候(写操作的时候,这种情形下,页表有中的页具有写保护),此时内核会将父进程的地址空间全部复制给进程的地址空间(COW技术,写时复制技术),并分配物理内存给子进程,更新子进程的页表。写时复制技术的体现,子进程先于父进程执行。
3::vfork工作过程,内核为子进程创建一个新的进程描述符,子进程共享父进程的地址空间,然后子进程执行,父进程阻塞,直到子进程中调用了exit()或者exec系列的函数(vfork创建进程时候,子进程中一般要用exit或者execv,否则会出现异常)。当子进程中调用exec系列函数的时候(内核会重新为子进程分配地址空间,分配物理内存,建立页表),一般用vfork来创建进程,好处是内核无需拷贝父进程的地址空间给子进程。
注释:一些术语及相关知识本人了解的就没有在此描述了,请谅解。