当前位置: 技术问答>linux和unix
fork创建进程后,代码空间是不是会减少?
来源: 互联网 发布时间:2016-06-21
本文导语: 使用fork创建子进程后,子进程将会复制父进程的代码,那么也就是说父进程的代码将会占用子进程代码的一部分代码空间,那是不是说子进程的代码空间要比父进程要小了一点呢? | 不是的...
使用fork创建子进程后,子进程将会复制父进程的代码,那么也就是说父进程的代码将会占用子进程代码的一部分代码空间,那是不是说子进程的代码空间要比父进程要小了一点呢?
|
不是的,“理论”上讲就是复制一份,一模一样的。
当然,在实际实现中,可能还有更复杂的问题,比如LINUX中,对内存页面可能采用copy-on-write技术,所实现的效果就跟原来的vfork有点像。
但不管怎么说,那只是“复制”背后的故事,你可以不关心。至于说“子进程的代码空间要比父进程要小了一点”,没有这回事的。
还有,你说“子进程将会复制父进程的代码,那么也就是说父进程的代码将会占用子进程代码的一部分代码空间”,没看懂你这个因果关系是怎么推出来的。既然是“复制”,当然是一样,怎么会有大小之分呢?如果有大小之分,那还叫“复制”么?就像你用复印机复印一份文件,复印出来的跟原件不都一样的么?
当然,在实际实现中,可能还有更复杂的问题,比如LINUX中,对内存页面可能采用copy-on-write技术,所实现的效果就跟原来的vfork有点像。
但不管怎么说,那只是“复制”背后的故事,你可以不关心。至于说“子进程的代码空间要比父进程要小了一点”,没有这回事的。
还有,你说“子进程将会复制父进程的代码,那么也就是说父进程的代码将会占用子进程代码的一部分代码空间”,没看懂你这个因果关系是怎么推出来的。既然是“复制”,当然是一样,怎么会有大小之分呢?如果有大小之分,那还叫“复制”么?就像你用复印机复印一份文件,复印出来的跟原件不都一样的么?
|
fork。内核为父进程创建副本,即子进程。传统情况下,该子进程将获得父进程完整复制,包括数据段(初始化和bss 段)和堆栈段。但是,由于 fork 之后经常跟着就是 execve 系统调用,因此现在的 *nix 会使用 COW(写时复制) 方式来 fork 子进程,也就是这些区域暂时不复制,并由内核将它们只读,当父/子进程对他们修改时,就将修改的部分保存在本次修改操作的进程地址空间中,通常单位是一页。内核为了提高性能,如果父子进程在同一颗 CPU 上的话呢(同 CPU 进程队列),会在 TASK_RUNNING 进程链中将子进程放在放在父进程的前边,这样可减少不必要的 COW 开销。此外还有一些其它属性也将由子进程继承,如实际、有效用户/组 ID,会话 ID,工作目录,环境,连接的共享存储段,资源限制等等。
|
不会,基本上是完全复制的,除了文件锁等是共享之外。
不过要注意fork为了提高效率是写时复制,就是说,在没有对内存写操作前,子进程的本质上是跟父进程共享堆栈。
http://kenchou.spaces.live.com/blog/cns!f0d48c03fcd214ce!374.entry
fork()子进程和父进程共享的资源
子进程和父进程共享很多资源,除了打开文件之外,很多父进程的其他性质也由子进程继承:
实际用户ID、实际组ID、有效用户ID、有效组ID。
添加组ID。
进程组ID。
对话期ID。
控制终端。
设置-用户-ID标志和设置-组-ID标志。
当前工作目录。
根目录。
文件方式创建屏蔽字。
信号屏蔽和排列。
对任一打开文件描述符的在执行时关闭标志。
环境。
连接的共享存储段。
资源限制。
父、子进程之间的区别是:
fork的返回值。
进程ID。
不同的父进程ID。
子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime设置为0。
父进程设置的锁,子进程不继承。
子进程的未决告警被清除。
子进程的未决信号集设置为空集
不过要注意fork为了提高效率是写时复制,就是说,在没有对内存写操作前,子进程的本质上是跟父进程共享堆栈。
http://kenchou.spaces.live.com/blog/cns!f0d48c03fcd214ce!374.entry
fork()子进程和父进程共享的资源
子进程和父进程共享很多资源,除了打开文件之外,很多父进程的其他性质也由子进程继承:
实际用户ID、实际组ID、有效用户ID、有效组ID。
添加组ID。
进程组ID。
对话期ID。
控制终端。
设置-用户-ID标志和设置-组-ID标志。
当前工作目录。
根目录。
文件方式创建屏蔽字。
信号屏蔽和排列。
对任一打开文件描述符的在执行时关闭标志。
环境。
连接的共享存储段。
资源限制。
父、子进程之间的区别是:
fork的返回值。
进程ID。
不同的父进程ID。
子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime设置为0。
父进程设置的锁,子进程不继承。
子进程的未决告警被清除。
子进程的未决信号集设置为空集