当前位置:  技术问答>linux和unix

fork创建进程后,代码空间是不是会减少?

    来源: 互联网  发布时间:2016-06-21

    本文导语:  使用fork创建子进程后,子进程将会复制父进程的代码,那么也就是说父进程的代码将会占用子进程代码的一部分代码空间,那是不是说子进程的代码空间要比父进程要小了一点呢? | 不是的...

使用fork创建子进程后,子进程将会复制父进程的代码,那么也就是说父进程的代码将会占用子进程代码的一部分代码空间,那是不是说子进程的代码空间要比父进程要小了一点呢?

|
不是的,“理论”上讲就是复制一份,一模一样的。
当然,在实际实现中,可能还有更复杂的问题,比如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子进程时就停住了,似乎根本不能fork子进程啊?
  • 程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存
  • 主进程有两个线程,fork子进程后复制主进程两个线程的内存么?
  • 父进程发包,fork子进程收回传的包,sock_filter后,子进程收不到包
  • fork 一个字进程 将子进程的输出作为主进程的输入
  • fork出来的子进程能通知主进程自己的进度吗
  • 用fork产生一个进程,但是在子进程里无法监视父进程变量的变动。
  • 如果一个server进程要fork许多子进程,但不等待子进程终止,也不希望子进程结束后处于僵进程状态直到父进程终止。请问可采用什么方法实现
  • 调用fork操作后,子进程有返回,父进程挂死,什么原因?
  • fork一个子进程后在打开一个文件,如何在子进程中使用这个打开的文件描述符号
  • 问。fork()出来的子进程如果遇到brokenPIPE的错误,会影响父进程的关闭吗?
  • fork() 父子进程执行顺序问题
  • 怎样编写一段程序,要求调用fork并在子进程中建立一个新的对话期。验证子进程变成了进程组长而且不再有控制终端。
  • 请问fork子进程后,怎么修改子进程的所属用户。
  • fork出来的进程不能完全继承父进程的属性吗?
  • 创建进程的系统调用clone()和fork()
  • 在一个进程中我定义了几个全局变量,然后我又fork了几个子进程,子进程中是否可以各自对全局变量进行修改,如果各子进程都对其进行修改,
  • 关于fork创建进程的一个问题
  • 如何向由fork出来的进程家族发送信号?
  • fork()复制进程的问题2
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 执行一个main函数程序时,unix操作系统调用什么创建进程?fork?newproc?
  • 连续fork两次创建几个进程
  • fork()首次调用新创建进程时,其入口在哪里?在线等等
  • 关于fork创建进程的问题,请各位指点!多谢!
  • 请问用fork()创建进程有分方式的嘛?
  • 使用fork()创建进程
  • 用fork创建新进程碰到的问题。。。
  • Linux系统中C语言编程创建函数fork()执行解析
  • 老师留的一道关于使用fork()创建child来并行处理的作业题,请各位大侠给点灵感,跪谢!!!!
  • fork、execl创建多进程,出现一个僵死进程
  • fork 创建进程,共享内存,文件描述符问题
  • unix中的fork2与fork有设么区别?
  • 还是有关fork的问题,fork在一个函数中调用,我被搞胡涂了
  • fork()函数入门级问题:fork()与进程数
  • 一个fork的问题
  • 新手的问题关于fork?
  • 如何理解fork函数返回2次啊?
  • 急于明白Fork的用法.请提供中文解释.谢谢.
  • 关于fork的不解
  • 弱弱的问:fork和exec的区别是什么?
  • 关于fork的讨论
  • 关于fork的疑问?
  • fork之后的输出
  • exit和fork是什么关系?他们是怎么配合使用的?
  • fork函数,在线等待,马上结贴。谢谢!!!!!!!!!!!!
  • fork的问题
  • 请教 linux的fork从什么版本开始支持COW?
  • c++ 和 fork
  • 请教一个关于fork的问题。
  • "fork(2)" 中这个2表示什么意思
  • fork函数的源代码在哪呢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3