linux vfork的子程序与父进程共享内存,那为什么子进程执行exec
说是因为虽然CLONE_VM让do_fork()跳过了复制mm_struct,但do_execve()在bprm_mm_init()时又创建了一个新的mm_struct。...
说是因为虽然CLONE_VM让do_fork()跳过了复制mm_struct,但do_execve()在bprm_mm_init()时又创建了一个新的mm_struct。既然这样那么fork()创建的子进程复制的mm_struct在调用do_execve()又去哪了?linux菜鸟,大神们麻烦多写两个字,知道vfork()没有使用COW。
展开
1个回答
展开全部
回复humjb_1983 谢谢你的回答,你说很精简!自己回复一下,大神们有错快帮我指出来不管vfork 还是fork都需要新的内存页面来保存新进程数据的, vfork创建一个进程空间,但是虽然有空间,但里面什么都没有复制,子进程共享父进程的堆栈和地址空间,就是说新创建的pcb里面关于地址的数据都是父进程的, 是只读共享。其实使用cow的fork也是这样的,pcb里面关于地址的数据都是父进程的。Exec:开始时父子两个指针指向父亲的data addr,子进程克隆了父进程的相关指针以达到数据共享.exec后指针值就变了,指向了新的内存,调用exec后,exec会修改子进程的指针值指向新的内存即exec用新调用程序的数据替换当前进程的对应数据, Vfork改变的是共享部分,要挂起主进程以达到数据不乱的目的,而fork一改变就复制,就不需要挂起主进程Vfork比fork多了一个同步动作,父进程会在子进程后继续执行,但是exec后就不存在这样的限制了,但是父子关系还是存在的。Cow内核的实现:内核的实现很简单。页面在内核的页面相关数据结构中被标识为只读和写入时复制。如果某个进程尝试修改某个页,将产生一个页面错误。然后内核处理页面错误,透明地复制这个页。在这个时候,当前进程的页面的写入时复制属性被清除,从此不再共享。就是说fork的时候凡是修改的部分都同时修改指针指向的地址和地址中的内容,没修改的部分指针指向共享内容。 查看原帖>>
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询