关于fork的写时复制!
来源:互联网 发布:中华网络一条龙可靠么 编辑:程序博客网 时间:2024/05/24 04:00
在网上看到还有个细节问题就是,fork之后内核会通过将子进程放在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。
详细情况可以看看这位仁兄的文章:十辨十析之辨一――fork()、写时复制、vfork()
最近几本关于L的书,想来通络一下。也干了近几件疯狂的事情,想想都要偷着自娱自乐一番,真是无聊到尽头了,也就是另一番风景。有些你以前一直巴巴的信仰为真的东西,偶乐改变一下,结果发现,原来不是那个理,换个道也没什么比以前差的,丫,这样,也不错。
打算写十辨十析,罗罗一大堆,写些什么呢,想来想去,还是写些基础的东西吧,希望这些基础的东西对朋友们理解其它方面能有个帮助。这个专题的思想:what ? why ? how ? 总之要从根基上讲清楚,重点在原理上了。对了图作的不精,请大家谅解。
这三个方法是大佬L用 于创建子进程的三种方法。其实理解它们,要有一个实现上的意识即:进程->虚拟地址空间->物理地址空间即真实的存储。用户进程能感知的是进程的虚拟地址 空间,而虚拟地址空间->物理地址空间则由底层的内核来帮你实现。一个进程在地址空间上的表现形式就是:正文段,数据段,堆,栈。嗯,主要就是这四个部 分,内核为其分配相应的数据结构来表示它们,其看做是进程在地址空间的实体,也可以想象为灵魂。随后内核会为这四部分分配相应的载体,即真正的物理存储, 就像灵魂要附之于身体一样,那么,这些物理存储就是进程的真正实体的,我们称之为身体。那么这三个方法有什么不同呢?
ok,现在有一个父进程P1,这是一个主体,那么它是有灵魂也就身体的哦。现在在其虚拟地址空间(有相应的数据结构表示)上有:正文段,数据段,堆,栈这四个部分,相应的,内核要为这四个部分分配各自的物理块。即:正文段块,数据段块,堆块,栈块。至于如何分配,这是内核去做的事,在此不详述。
1. 现在P1用fork()函数为进程创建一个子进程P2,内核:(1)复制P1的正文段,数据段,堆,栈这四个部分,注意是其内容相同。(2)为这四个部分分配物理块,P2的:正文段->PI的正文段的物理块,其实就是不为P2分配正文段块,让P2的正文段指向P1的正文段块,数据段->P2自己的数据段块(为其分配对应的块),堆->P2自己的堆块,栈->P2自己的栈块。如下图所示:同左到右大的方向箭头表示复制内容。
图1
图2
3. vfork():这个做法更加火爆,内核连子进程的虚拟地址空间结构也不创建了,直接共享了父进程的虚拟空间,当然了,这种做法就顺水推舟的共享了父进程的物理空间。
图3
通 过以上的分析,相信大家对进程有个深入的认识,它是怎么一层层体现出自己来的,进程是一个主体,那么它就有灵魂与身体,系统必须为实现它创建相应的实体, 灵魂实体与物理实体。这两者在系统中都有相应的数据结构表示,物理实体更是体现了它的物理意义。呵呵,说了这么多,其实系统之所以提供这三个方法,也都是 从实现效率上来考虑的,一般fork后要exec,所以很多父进程的数据对于子进程来说都是不需要的,后两种方法就是大佬L区别于Unix的一个主要特征,也可以说是其高明处之一吧,其创建进程特别的高效,怎么高效,通过以上的比较与分析,相信大家也能明白个五六了吧。
- 关于fork的写时复制!
- 关于linux内核fork后cow(写时复制)的代码分析
- 关于linux内核fork后cow(写时复制)的代码分析
- fork()、写时复制、vfork()
- fork()、写时复制、vfork()
- fork()和写时复制
- 关于Linux下的写时复制
- Linux进程管理——fork()和写时复制
- 关于C++ string类的写时复制
- fork函数的写时拷贝
- fork写时拷贝
- 关于 copy-on-write 写时复制
- Linux中关于fork()复制进程
- linux的写时复制
- PHP的写时复制
- php的写时复制
- 九、Linux系统编程-进程(二)fork系统调用、复制进程映像、写时复制、孤儿进程和僵尸进程
- 关于fork的理解
- Java 内存模型
- 天猫首页多焦点轮换图片
- ASP.NET 给图片动态添加文字水印
- 天外有天——一代棋圣吴清源自传(4)
- 算术移位和逻辑移位
- 关于fork的写时复制!
- 学习笔记—————在Action中访问session,HttpServletReqeust,HttpServletResponse,parameters
- 如何只对QWidget的局部区域的显示内容更新
- DataTable 筛选 Select、统计 Compute
- 天外有天——一代棋圣吴清源自传(5)
- php 获取时间今天明天昨天时间戳
- 怎样阻止超链接跳转
- linux设备驱动程序之简单字符设备驱动
- Mysql大全