日期:2014-05-16  浏览次数:20688 次

关于 写时复制 技术的问题
 直奔主题吧:
   我一开始创建子进程的时候使用的fork,没有用exec函数,那么应该是说所有的数据段、堆栈段完全复制一份副本给子进程吧。那么
    1、如果只想用父进程里面的个别变量的时候是不是就应该使用fork+exec了?
    2、fork+exec是不是就是用的写时复制技术呢?
    3、这几个变量子进程直接用就可以 还是说要通过exec函数的参数传递?
   
   
------解决方案--------------------
不明白,你是想父子进程间通信吗?

一个变量在父进程中的变化同步到子进程?

若是的话,通道,共享内存,文件
------解决方案--------------------
楼主没理解什么叫写时复制.
fork后,子进程和父进程的代码段,数据段等都是一样的.并且些时他们的虚拟线性地址都使用同一块物理内存.只有当其中一个改变内存值时,他们的这块线性地址映射到的物理内存才会发生变化.
这样就能将fork的开锁降到最低.

exec就是替换此进程的内存映像.此进程就真正的改头换面了.以前的内存中的值和现在没关系了.
exec函数族中,会传递环境变量,参数给新的程序.
------解决方案--------------------
exec后的新程序,最多会继承文件描述符.shell中的管道就是因为继承文件描述符0,1,2
------解决方案--------------------
fork自己就叫写时复制了,redis借助这个特性实现数据快照备份。
------解决方案--------------------
exec是执行一个完整的程序。。请问这个完整的程序里面的各种变量命名,地址等都是独立的,他会有自己的初始化,如何使用。他如何与替换的那个进程镜像的变量共享???
要给exec传递变量,只能通过exec的参数,传进去成命令行参数.
引用:
那我明白了         但具体到这个问题上面,exec是没有办法传递具体的变量的吧?

------解决方案--------------------
引用:
另外,还有个问题不确定:在fork之后,父子进程共享所有页面,如果其中一个进程要写某一个页,那么内核只复制这一个页还是复制原来进程所有的页?

写时复制,那当时是只复制要改变的这一页了。要是全复制了,那写时复制也没多大意思了。