免费网站建设培训学校,wordpress4.2.2下载,建一个信息网站多少钱,东莞市永铭装饰有限公司目录一、fork函数二、vfork函数1.函数的原理2.函数的隐患3.解决函数隐患的方法在Linux的进程学习中#xff0c;常使用fork函数来创建子进程#xff0c;但其实还有一个vfork函数也可以创建子进程。但是这两个函数的实现机制不同#xff0c;fork函数使用了写实拷贝技术#x…
目录一、fork函数二、vfork函数1.函数的原理2.函数的隐患3.解决函数隐患的方法在Linux的进程学习中常使用fork函数来创建子进程但其实还有一个vfork函数也可以创建子进程。但是这两个函数的实现机制不同fork函数使用了写实拷贝技术而vfork函数不是这样。 在看本文前需要对虚拟内存有一定的了解因为创建子进程离不开虚拟内存。
一、fork函数 pid_t fork(void); fork函数运用的是写实拷贝技术子进程不但会复制父进程的pcb的信息也会复制父进程的虚拟空间和页表。 所以在刚创建子进程后子进程和父进程映射的是同一块物理内存因此实现了父子进程代码共享。 但是如果子进程需要修改数据比如程序中有一个变量a子进程想要修改a的数据那么系统就会给子进程在物理内存重新开辟一块空间存储a的数据子进程要修改就修改自己的a不要去修改父进程的a。这样就保证了父子进程的数据独有。
二、vfork函数 pid_t vfork(void); 1.函数的原理 vfork与fork相比vfork创建的子进程只复制了父进程的pcb并没有复制虚拟空间和页表。父子进程使用的是同一块虚拟空间和页表因此父子进程映射的是同一块物理内存。 2.函数的隐患
1由于vfrok创建的子进程和父进程共用虚拟空间和页表因此访问的是同一个内存空间那么一旦子进程改变了某个数据父进程的数据同样会随之改变。
2更严重的问题是会导致调用栈混乱。 当程序运行一个函数时就要先将函数压入函数调用栈当运行完毕才会将函数出栈。vfork创建的父子进程共用调用栈当父进程运行A函数时需要把A函数压入函数调用栈如果在A函数还没运行完的时候时间片就用完了就需要切换到子进程。子进程运行的是B函数子进程还没运行完B函数的时候时间片就用完了因此切换到父进程运行。父进程在这个时间片把函数A运行完了因此函数A需要出栈但此时函数调用栈的栈顶是B函数就会将B函数出栈从而造成调用栈混乱。 结合下图来理解 3.解决函数隐患的方法 既然vfork函数如上所述的缺点那么自然要有相应的解决方法。 如果用vfrok函数创建子进程当子进程运行时父进程会被阻塞。父进程被阻塞到什么时候一直到子进程退出或者是子进程进行了程序替换后。这样就可以解决上面的缺点。