fork vfork 父进程和子进程的内存关系_fork一个子进程 父子进程的虚拟内存空间一样吗-程序员宅基地

技术标签: Linux网络编程  

  fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。于是起初我就感到奇怪,子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢?!原来在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。
       在网上看到还有个细节问题就是,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.       写时复制技术:内核只为新生成的子进程创建虚拟空间结构,它们来复制于父进程的虚拟究竟结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。




图2

3.       vfork():这个做法更加火爆,内核连子进程的虚拟地址空间结构也不创建了,直接共享了父进程的虚拟空间,当然了,这种做法就顺水推舟的共享了父进程的物理空间。



图3

通 过以上的分析,相信大家对进程有个深入的认识,它是怎么一层层体现出自己来的,进程是一个主体,那么它就有灵魂与身体,系统必须为实现它创建相应的实体, 灵魂实体与物理实体。这两者在系统中都有相应的数据结构表示,物理实体更是体现了它的物理意义。呵呵,说了这么多,其实系统之所以提供这三个方法,也都是 从实现效率上来考虑的,一般fork后要exec,所以很多父进程的数据对于子进程来说都是不需要的,后两种方法就是大佬L区别于Unix的一个主要特征,也可以说是其高明处之一吧,其创建进程特别的高效,怎么高效,通过以上的比较与分析,相信大家也能明白个五六了吧。

转载至:http://igaozh.iteye.com/blog/1677969

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yh1548503342/article/details/41743603

智能推荐

flacs 安装教程_改良人工晶体安装方法在FLACS中的应用研究-程序员宅基地

文章浏览阅读217次。摘要目的探讨改良人工晶体安装方法在飞秒激光辅助白内障手术(FLACS)中的应用效果。方法将2019年9~11月在陆军军医大学大坪医院行FLACS的80例患者随机分为对照组和观察组,每组40例。植入的人工晶体选用一片式两襻疏水性丙烯酸制成的可折叠、后房型人工晶体,对照组患者按照常规方法安装晶体,观察组患者按照改良后的方法安装晶体。观察并比较2组患者手术时间、晶体展开时间、术中晶体植入囊袋后襻的变化、..._flack晶体怎么解决

SpringCloud第九章Hystrix断路器(服务监控hystrixDashboard)_cloud-consumer-hystrix-dashboard9001-程序员宅基地

文章浏览阅读176次。5、服务监控hystrixDashboard5.1、概述除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化_cloud-consumer-hystrix-dashboard9001

django ajax异步加载 实现局部刷新_django3 ajax局部刷新div-程序员宅基地

文章浏览阅读3.8k次。<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-2.1.0.js"></script><script type="text/javascript"> $(function(){ $("#inp1").blur(function(){ ..._django3 ajax局部刷新div

组成原理:计算机系统概述_机器主频clk和时钟脉冲-程序员宅基地

文章浏览阅读265次。文章目录层次结构功能部件指令执行过程取指周期分析指令执行指令计算机的性能指标层次结构一个完整的计算机系统由硬件系统和软件系统共同组成,如果某一功能既可由硬件实现,又可由软件实现,则称软硬件在逻辑上是等效的(注意不是等价的),一般来说,用硬件实现的效率高,用软件实现的较灵活。冯氏机有六个特点:计算机硬件系统由运算器、存储器、控制器、输入设备和输出设备组成。指令和数据以同等地位存储在存储器中,可按地址访存。指令和数据均采用二进制代码表示。指令由操作码和地址码组成,操作码用于表示操作的性质,地址码_机器主频clk和时钟脉冲

Aliddns插件使用:小白超详细图文教程-程序员宅基地

文章浏览阅读7.8w次,点赞6次,收藏39次。Aliddns插件使用:小白超详细图文教程。Aliddns插件,用阿里的云解析速度是快,天下武功为快不破....作为一个小白的我,看这篇帖子也是一脸懵逼,http://koolshare.cn/thread-64703-1-1.html经过自己不耻下问的精神,总算完全搞明白了...给大家带来完整超详细的教程:首先你宽带要是公网IP,不是公网IP的童鞋,可以到_aliddns

Python Jupyter Notebook 显示行数完美解决_jupyter notebook里代码区域怎么出现了行号-程序员宅基地

文章浏览阅读4.8w次,点赞42次,收藏38次。问题:Jupyter Notebook 默认状态下不会在代码左端显示行号,这就导致我们遇到报错时,无法正常调试。图: 解决方案:点击View--&gt;点击Toggle Line Numbers就完成啦。 真的真的强烈推荐大家使用Jupyter Notebook,真心太好用了。(我在Pycharm上运行的程序不知怎么的,不仅直接导致了Pychar..._jupyter notebook里代码区域怎么出现了行号

随便推点

Elasticsearch6.5.4+Logstash6.5.4的基本应用-程序员宅基地

文章浏览阅读661次。创建mapping在kibana中创建Elastiicsearch的mapping,应用ik分词器对中文字段进行分词。PUT /omega/{ &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;settings&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;: { &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;number_of_sha

解决 MAC 无法打开“***”,因为无法验证开发者_无法打开 因为无法验证开发者-程序员宅基地

文章浏览阅读10w+次,点赞38次,收藏12次。当安装非信任开发者的软件时,系统提示无法打开“***”,因为无法验证开发者。我们可以按照以下方法解决打开方达,在右侧菜单栏选择应用程序找到提示无法验证的应用,右键点击打开第一次会出现以下提示,继续点击打开即可完成以上步骤,你就可以成功使用应用..._无法打开 因为无法验证开发者

c++基本类型与 byte数组互转_c++ byte数组-程序员宅基地

文章浏览阅读1w次,点赞23次,收藏68次。c++ 基本类型与byte 数组互相转换前言 由于根据编译器的不同 有部分基础数据类型字节数不一致 本文档 基础类型位数如下 bool 字节数: 1 char 字节数: 1 short 字节数: 2 int 字节数: 4 long 字节数: 4 long long 字节数: 8 float 字节数: 4 double 字节数: 8 long double 字节数: 12说明传统C方式 位操作: 使用一个unsigned int变量来作为位容器。 强制指针类_c++ byte数组

RecBole小白入门系列博客(四)——Sequential类模型运行流程_recbole 保存模型结果-程序员宅基地

文章浏览阅读7k次,点赞6次,收藏27次。RecBole小白入门系列博客(四)——Sequential类模型运行流程写在前面选定模型设置模型超参数选定数据集数据集基本格式设置数据集参数设置训练参数设置评测参数总结参数设置运行调(lian)参(dan)结束语传送门:RecBole小白入门系列博客(一)——快速安装和简单上手RecBole小白入门系列博客(二)——General类模型运行流程RecBole小白入门系列博客(三)——Context类模型运行流程写在前面这次的内容和General类和Context模型运行流程差不多,我会特别提_recbole 保存模型结果

【数据结构】队列(链队列、循环队列)的存储结构及基本运算(C语言)_用链队列作存储结构,实现队列(元素为整型)的基本运算。链队列的类型定义:-程序员宅基地

文章浏览阅读9.4k次,点赞17次,收藏185次。目录1. 队列基本概念2. 链队列代码+注释运行结果3. 循环队列代码+注释运行结果1. 队列基本概念队列(Queue)是一种限定性线性表,它只允许在表的一端插入元素,而在另一端删除元素,具有先进先出的特点。在队列中,允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)。队列有顺序和链式两种存储表示。2. 链队列链队列采用带头结点的链表结构,并设置一个队头指针 front 和一个队尾指针 rear ,队头指针始终指向头结点,队尾指针指向最后一个元素。空的链队列的队头指针和队尾指_用链队列作存储结构,实现队列(元素为整型)的基本运算。链队列的类型定义:

js 中文英文混排a-z_IBL with Multiple Scattering in Three.js-程序员宅基地

文章浏览阅读158次。IBL with Multiple Scattering implemented in Three.jsOnline demo & source code (Copy the link and open it in Chrome browser):https://codesandbox.io/s/multiple-scattering-ibl-k4990试着写了英文版的,如果有语法错误欢迎..._averagefresnel

推荐文章

热门文章

相关标签