创建进程与进程地址空间

news2025/1/12 3:42:39

目录

创建进程

进程地址空间

为什么要用虚拟地址呢?

什么是进程地址空间? 

为什么要写时拷贝呢?


创建进程

前面提到使用fork可以创建子进程,现在介绍fork创建子进程的细节。

fork创建子进程的时候,子进程的内核数据结构和代码都会继承自父进程,而数据以写时拷贝的方式共享或独立,这里共享或独立指的是 当父子进程没有人修改全局数据的时候,父子进程共享该数据,一旦父进程或者子进程修改数据的时候,就会发生写时拷贝,数据就被拷贝出了一份,于是父子进程的数据就独立了。

比如如下代码:

编译运行发现结果如下:

 可以看见fork之前的代码子进程没有执行,难道子进程只是继承了父进程的部分代码吗?

答案是子进程继承了父进程所有的代码,子进程只能在fork之后开始执行是因为子进程也继承了程序计数器EIP寄存器中的内容,这个寄存器保存了当前CPU执行到的指令的下一条指令,于是子进程便从EIP存储的指令对应的代码开始执行。

于是有fork的用法:

创建子进程和父进程执行不同的代码块

一个进程要执行一个不同的程序,可以创建子进程,然后对子进程进行程序替换

fork也会失败,失败原因主要是系统中进程数量太多或者用户创建的进程数超过限制 。

前面提到写时拷贝,这是由OS的内存管理模块完成的,那么写时拷贝是什么?回答之前,得知道在哪里进行的拷贝,这与进程地址空间有关。

进程地址空间

首先回顾C程序的地址空间是这样的:

数据段即数据区,数据区又分为已初始化全局数据区,未初始化全局数据区

 但是这个程序地址空间并不是物理地址,而是虚拟地址 。

为什么要用虚拟地址呢?

首先硬件不能阻拦你访问,只能被动读取和写入,一旦你失误写入数据,就可能会影响到系统的其他进程,所以实现OS时,不应该让用户直接访问物理地址,而是使用虚拟地址,让OS将物理地址保护起来,让环境稳定运行。如何保护内存呢?在访问地址时,OS发现页表没有映射关系,非法访问就会被OS拦截,OS就会向进程发送信号,从而终止进程。

使用虚拟地址还有其他好处,OS将进程管理和内存管理通过地址空间,进行功能模块的解耦,当需要使用内存空间的时候,OS才进行在内存管理模块执行申请内存的代码,然后在页表建立映射关系,而OS在调度进程时不用马上执行内存管理的代码,也即两种管理各种独立了。

而且使用同一套虚拟地址,可以让进程、程序以统一的视角看待内存,方便编译和加载程序,简化进程设计和实现。

注意:当程序未被加载到内存称为进程的时候,程序内部就有地址了,比如程序的链接阶段,不同目标文件全局变量,函数等需要确定地址,这个地址就是虚拟的地址。

什么是进程地址空间? 

当每个进程在启动时,都会让OS给他创建一个地址空间叫做进程地址空间,OS用内核数据结构struct mm_struct描述进程地址空间,因为是使用同一套虚拟地址,所以每个进程都认为自己独占了系统的内存资源,进程怎么和进程地址空间关联起来呢,描述进程的PCB结构体task_struct中有有成员指针指向struct mm_struct(描述进程地址空间的结构体),而 OS为进程构建页表,这个进程地址空间通过页表与物理内存建立映射关系。

查看源码如下:

查看mm_struct 的定义:

mm_struct中的mmap(节点指针)是一个链表,链表连接者节点,节点的结构体vm_area_struct 中有vm_start 和vm_end用来划分进程地址空间的区域,还有vm_page_prot表示访问权限等成员。

 最后画草图总结一下是这样:

现在就可以理解写时拷贝了,首先父进程创建子进程的时候,子进程继承了父进程的内核数据结构,包括描述进程结构体task_struct ,进程地址空间mm_struct,页表等等,子进程和父进程的代码和数据都是共享的,在内存上它们都是只有一份都是一样的。

如图:

 当父进程或者子进程需要修改数据时,谁先修改,谁就先发生写时拷贝,比如子进程修改了全局数据,OS就将在物理内存上把该存储的数据拷贝一份,并在页表建立新的映射到子进程的进程地址空间,于是父进程和子进程这一份数据就不再共享,而是各自独立了,如图:

为什么要写时拷贝呢?

为什么不直接在物理内存上分别存储父子进程的两份数据呢?

1.原因在于父进程的数据,对于子进程来说可能不需要,或者子进程只是读取数据,不会对数据做修改,那么采用写时拷贝就可以节省空间。

2.理想的拷贝是父进程或子进程要写入的数据进行拷贝,不写入的数据不拷贝,但是如何判断数据是否会被写入呢?这种理想化技术难以实现。

3.倘若将父进程的数据全部拷贝给子进程,这样的话这些工作都是在调用fork函数完成的,直接增加了fork函数执行的时间,增加了调用fork函数的成本。

4.这种延迟拷贝策略,可以提高内存的使用率,倘若父子进程的这份共享数据未被写入时,那么就不会被拷贝,物理内存的未使用空间就更多,就可以腾出空间给其他进程使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何给公司内网搭建一个专用的DNS服务器?

如何给公司内网搭建一个专用的DNS服务器? 引言 平时做域名解析,一般直接修改的/etc/hosts文件。对于服务器数量小的情况完全可以,但是如果服务器数量较多,每个都修改比较麻烦。 DNS是作为域名解析。在实际的生产过程中&#xff…

基于ASP.NET C#的服装商城管理系统

摘 要 本毕业设计的内容是设计并且实现一个基于net语言的服装商城管理系统。它是在Windows下,以SQL Server为数据库开发平台,服装商城管理系统的功能已基本实现,主要包括用户、服装信息、通知公告、留言板、订单信息等。 论文主要从系统的分…

飞腾FT-2000/4处理器+复旦微FPGA+国产操作系统解决方案(2)

XM-1104飞腾核心处理主板 ▶体积小、功耗低、高性能。 ▶功能接口多样化,采用高密度连接器,抗震效果好。 ▶成本低,扩展性强,根据用户的需求定制各种底板。 ▶产品灵活,便于维护,生命周期长。 指标 参数 …

SuperMap GIS地质体数据处理QA

作者:hyy 一、地质体数据简介 什么是三维地质建模?百度上给出的解析是:将地质、测井、地球物理资料和各种解释结果或者概念模型综合在一起生成的三维定量随机模型。 已建成的地质模型可以为我们提供很多信息。首先是地质的三维可视化。通过三维可视化&…

量子计算机:一场改变世界的开发竞赛

这样的设备可能会帮助解决气候变化和粮食短缺问题,也可能破坏互联网。在这场竞赛中,美国和中国谁会先到达目标? 神秘的机器 在加利福尼亚州圣巴巴拉的郊区,在果园和大海之间,坐落着一个不起眼的仓库,它的窗…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置

目录 目录 简介 EVM是一个工业工厂 为什么要在 Solidity 中理解 Evm 数据位置? 数据位置 → 概述 存储 内存 Calldata 堆栈(Stack) 代码 数据位置 - 规则 变量的默认位置 参考类型 在函数参数上的规则 在函数体内的规则 内存…

使用 QuTrunk+Amazon ParallelCluster3 进行并行计算

1.丘秉宜;2.邵伟;3.黄文;4.郭梦杰;5.刘利;6.刘波 1.亚马逊云科技 Hero;2.启科开发者生态负责人;3.启科 DEVOPS 工程师;4.启科量子资深研发工程师;5和;6.C高级…

Linux运维之knockd部署

如果你有一台公众可访问的服务器,黑客可以轻松扫描其IP地址,查找服务器上的开放端口(尤其是用于SSH的端口22)。将服务器隐藏起来、不让黑客看见的一种方法是使用knockd。knockd是一种端口试探服务器工具。它侦听以太网或其他可用接口上的所有流量&#x…

以代码绘制圣诞,过快乐圣诞节!

2022年圣诞节 12月25日 星期日 圣诞节的由来 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节,天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期,《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日原是罗马帝国规定的太阳神诞辰。有人…

百度百科怎么创建的?百度百科创建技巧分享

百度百科的创建并没有那么简单,虽然百度百科人人都可以编辑,我们在网上一搜就会出来很多相关的百科创建步骤,但是当你真的按照这些步骤去做的时候,就会出现很多问题,导致根本通不过。 百度百科怎么创建的?实…

ArcGIS基础实验操作100例--实验2平移矢量要素

实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验2 平移矢量要素 目录 一、实验背景 二、实验数据 三、实验步骤 (1)加载【Move】工具 (2)平移矢量要素 一、…

rocketmq搭建启动集成springboot落地并监控

目录 一、rocketmq服务器搭建启动: 二、springboot 集成rocketmq落地: 三、可视化页面集成: rocketmq是最近很流行的消息中间件,有很多的优点,比如多个topic也不会引起性能问题;今天我们开始搭建启动集成…

这5个素材库,新手也能让你做出精美的 PPT。

高质量免费PPT模板,各种PPT素材都有,文案模板直接套用,还有教程学习,对新手特别友好。1、菜鸟图库 https://www.sucai999.com/pptx.html?vNTYwNDUx网站有各种主题的PPT模板,工作总结、教育课件、述职汇报、节日庆典、…

美颜sdk中的人脸美型实现流程详解

在之前的文章中,小编讲了许多美颜sdk的功能实现流程,有一些是热门功能,例如美白、磨皮等,但是有一个功能小编遗漏没有讲到,虽然不常提起,但是它的热度并不低,这个功能就是——“人脸美型”。本篇…

一文解析Linux中断子系统softirq和tasklet

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 概述 中断子系统中有一个重要的设计机制,那就是Top-half和Bottom-half,将紧急的工作放…

电子招标采购系统—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明&#xff0c…

嵌入式Linux内核开发必须了解的三十道题

Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡。 伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也…

C# 基于文本的应用 正则表达式

一 基于文本的应用 1 控制台应用程序 2 Main()函数的参数-命令行参数 ① Main()函数可以带string[]参数; ② Main()函数可以有返回值(int),也可以为void; 二 使用Environment类 CommandLine CommandLineArgs MachineName OSVersion UserDomainName UserName …

Python使用re库处理正则详解

今天继续给大家介绍Python相关知识,本文主要内容是Python使用re库处理正则详解。 一、Python re库简介 re库是Python的标准库(所谓标准库,就是在安装Python后就自动安装了的库)之一,主要用于对指定字符串进行正则匹配…

功率放大器的输入阻抗和输出阻抗的关系

输入阻抗(inputimpedance)主要是电路输入端的等效阻抗。如果我们在输入端加一个电压源U并在输入端测量电流I,则输入阻抗Rin为U/I。输入端可以被认为是一个电阻的两端,这个电阻的阻值就是输入阻抗。 对于相同的输入电压&#xff0c…