review——Linux:进程地址空间

news2024/9/23 19:18:23

目录

前言

一、页表

1.回顾一下fork接口

2..先看一个有意思的现象

3.地址映射与页表

二、进程地址空间 

1.进程地址空间是什么

 2.进程地址空间与页表起到了什么作用

3.进程地址空间有什么作用

4.缺页中断与写时拷贝

5.写时拷贝的相关问题

6.关于内存空间申请的讨


前言

不知道大家在学习C语言的时候有没有见过这样一幅图,在学习C语言的时候,你也许经常听到有人说:某某变量开辟在堆区,某某变量开辟在栈区,等等。可是进程的地址空间到底是如何进行分布的,为什么要这样分布,进程与进程之间的地址空间又有什么关系这些也许我们还不甚清楚……

图1        进程地址空间分布图

一、页表

1.回顾一下fork接口

fork是Linux平台提供给我们的一个接口,这个接口可以基于所处的进程信息帮我们创建一个子进程,子进程会继承父进程的数据。fork会返回一个pid_t类型的值(其实就是int类型),这个值在fork被成功调用的情况下返回0,否则返回一个小于0的值。如果你还想了解更多,可以阅读博主的另一篇文章【点我】

2..先看一个有意思的现象

从图2中我们不难发现一些有意思的事情:

我们不难发现父子进程中的count变量的值不同,但是二者的地址居然是相同的。

(注意:这个现象在Windows平台下不会出现,因为Linux平台与Windows平台对该部分的处理不同)

图2        Linux平台上一个有趣的现象

3.地址映射与页表

我们根据上述现象其实不难进行推论,上述代码中显示的地址一定不是真实的物理内存地址,因为我们刻骨铭心的知道,一段地址中指向的一定是一份数据。既然现在一段地址中指向的不是同一份数据,那么这个地址就一定不是物理内存地址,这个地址一定是虚拟的,但是它却可以让我们访问到真真切切的数据,所以它一定跟我们的物理内存地址有联系。

图3        关于图2中现象的推断

 实际上,这个联系我们就成为地址映射,而维护这个映射关系的结构就是我们的页表,每个进程都有一个属于自己的页表,页表中的地址都是一对一的,所以一个进程可以通过其自身的页表来实现虚拟地址到物理地址的转化。

图4        页表在地址转换中的示意图

 那么图2中的现象和页表又有什么关系呢?

当子进程创建的时候,会继承父进程的数据,而有关父进程的数据的映射关系都会被存于一个表中,这个表就叫做页表,如果进程想要访问数据就必须使用页表的映射关系来找到数据,而后才可以对数据进行操作,子进程在继承父进程的数据的时候也会浅拷贝式的继承父进程的页表关系,当子进程对从父进程继承来的数据进程修改的时候会引发写时拷贝,此时子进程的页表映射关系发生改变,页表的键值不变,但是映射对象发生变化。

图5        子进程修改数据时页表变化示意图

其实到这里,我们就可以解释就可以解释图2中所展示现象的原因了。

二、进程地址空间 

1.进程地址空间是什么

在第一部分中的讨论中,其实我们不难发现,我们在Linux平台中使用的地址都是虚拟的地址,这个管理虚拟的地址的结构我们叫做进程的地址空间,进程的地址空间存储着大量的地址相关的信息,进程地址空间将这些地址信息进行区域划分,每一块地址空间都有它的作用。这些不同的小块组成了我们图1所示的进程地址空间分布图,那么,进程是如何对地址进行划分的呢我们可以浏览一下kenel内核的源码

在kenel2.6.32版本下,进程地址空间这一结构存储在mm_struct中,图中红线框选的就是区域划分相关信息:

图6        kenel内核中的进程地址空间区域划分

简单叙述一下划分的方式:我们想要对一块区域进程划分的时候只需要指明这段区域的起始地址与结束地址即可,比如在数学上我们如何划定一份区域,假设我们想要指定一个变量属于0-5这个区间我们可以这样表示,x∈[0,5],在计算机中也一样我们只需要指明开始地址与结束地址,并将这两个地址分别存入两个变量即可,这样一段区域就被划分好了。

那么我们如何实现对不同区域的属性进行规定呢,这就又要提到我们的页表了,页表这一结构不仅存储了地址的映射关系,还存储了,当前映射关系所持有的权限。当然,这并不是页表的全部字段,页表还有数据是否加载到内存,数据是否使用等判别字段。由于与本文关系不大,这里就不过多解释了。

图7        页表中权限限制示意图

 2.进程地址空间与页表起到了什么作用

①可以让内存管理与进程管理进行解耦

②可以让内存由无序变得有序,方便操作系统进行统一管理

3.进程地址空间有什么作用

进程地址空间是面对用户的,一方面为的是更方便操作系统对进程的管理,另一方面,当用户执行程序时,会先对虚拟地址空间进行权限测试,当此处测试成功之后,操作系统才会移入到物理内存中进行对数据的使用,进而保护了物理内存也保护了操作系统。比如,如果对只读数据区进行写等操作,这时,操作系统会对数据进行检测,此时,权限不足,则操作系统不允许执行。

4.缺页中断与写时拷贝

实际上,当我们的子进程继承来自父进程的页表后,此时的页表权限都会被置成只读属性,当我们对数据进行修改发生写时拷贝的时候,由于没有相应的写权限,这样的操作是不合法的,也是页表中未定义的,这样的设计就是想让强制操作系统来判别这段空间中是否可以执行某一过程,操作系统协调页表中没有的权限并判别该操作是否可以进行的过程叫做缺页终端,操作系统判别成功后会清除要修改区域的权限的只读属性,而后开放写属性,数据写入,子进程重新建立映射关系。具体操作参考图5。

图8        缺页中断与写时拷贝

5.写时拷贝的相关问题

问:为什么操作系统只在子进程想要发生合理性写操作的时候会对合理数据进行拷贝,而不在子进程创建的时候就把数据拷贝给子进程。

答:操作系统要对计算机的效率和资源负责,如果子进程不需要对数据进行修改,那么操作系统的拷贝操作将会是对时间和空间毫无意义的浪费。

6.关于内存空间申请的讨论

当malloc/new申请堆空间的时候,申请出来的空间,我们不一定会立即对资源进行使用,所以操作系统也会如处理何时拷贝数据那样,当你的程序需要使用开辟的空间时,操作系统才会为用户开辟空间,这样做的好处有两个:

①防止资源出现空转

②提升malloc/new的运行速度

第一点比较好理解,如果操作系统在程序申请空间时,立即为程序开辟空间,假如,程序没有立即使用,那么该程序就会保持对资源的占有而不利用,造成资源空转。

第二点,操作系统会将mallo/new的开辟过程分为两个阶段,第一个阶段是在虚拟地址空间上,为malloc/new开辟空间,当进程要对该地址进行写入时,此时由于操作系统还没有为进程开辟物理内存空间,所以页表映射不完全,发生页表中断,此时操作系统会立即为进程分配物理内存空间,并建立好页表的映射关系。而这一过程是无论如何都需要进行的,操作系统将这整个过程分为两个阶段就可以提升new/mallo开辟空间的效率

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

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

相关文章

SpringCloud-02 Consul服务注册与发现

Consul是一种用于服务发现、配置和分布式协调的开源工具。Consul提供了以下主要功能: 1.服务发现:Consul允许开发人员在微服务架构中注册和发现服务。它可以自动检测新添加的服务并为它们分配唯一的网络地址。 2.健康检查:Consul可以定期检查…

Linux学习-虚拟化平台安装和使用

注:系统使用Rock8.6 下载链接 通过百度网盘分享的文件:cirros.qcow2,node_base.xml等2个文件 链接:https://pan.baidu.com/s/1hupGQsMjrXMgngCy3lQLhw?pwdhlr6 提取码:hlr6[rootharbor ~]# cat /etc/redhat-releas…

Origin画图——柱状图与点线图结合优化

1.如何将下列不好看的柱状图进行优化呢。 2.首先双击坐标轴,将轴的参数进行修改,包含朝向大小,粗细。修改后如下所示。 3.然后我们来修改柱状图,双击柱状图,依次修改内容。 4.选取颜色,按照修改后&#…

网络层 VI(路由算法与路由协议)【★★★★★★】

(★★)代表非常重要的知识点,(★)代表重要的知识点。 一、路由算法 路由算法的目的很简单:给定一组路由器及连接路由器的链路,路由算法要找到一条从源路由器到目的路由器的“最佳”路径。通常&a…

跑步戴的耳机哪个品牌的好?五大高口碑骨传导耳机推荐!

跑步,作为一项简单而高效的运动方式,越来越受到人们的青睐。在跑步的过程中,音乐往往能够成为我们最好的伴侣,它不仅能够激发我们的热情,还能帮助我们保持节奏,让跑步变得更加轻松愉快。然而,选…

两个月冲刺软考——判断是否为阻塞节点,是否可化简,化简顺序是什么?存储器的分层结构;可屏蔽中断与不可屏蔽中断

1.判断是否为阻塞节点,是否可化简,化简顺序是什么? 首先要理解什么是阻塞节点?所谓阻塞节点就是从这个进程开始执行,会让程序陷入死锁,执行不了。解题关键就在于选择入口:挨个去尝试先执行P1、…

Windows安装MinIO对象存储服务详细版本

一、什么是MinIO? Minio 是一个高性能、开源的对象存储服务器。 Minio 具有以下主要特点和优势: 一、功能特点 1. 多平台支持 - 可以在各种操作系统上运行,包括 Linux、Windows 和 macOS。这使得它可以适应不同的服务器环境和开发需求。 2. 对象存储 - …

【从头写CAD】2 建立项目及角度类

文章目录 一、说明二、操作步骤三、角度单位四、源代码1. mod.rs 内容2. angle.rs 内容3. main.rs 补充调试内容 五、运行1. 运行程序 一、说明 CAD离不开角度数据,目前CAD开源项目多用double类型表示角度。我认为有必要独立出来,让三角函数仅出现该类内…

白酒酿造:传统工艺与现代科技的整合

在千年的历史长河中,白酒酿造技艺如一颗璀璨的明珠,闪烁着中华文明的智慧光芒。如今,随着科技的飞速发展,传统酿造工艺与现代科技在这片古老的土地上交织碰撞,共同书写着白酒酿造的新篇章。豪迈白酒(HOMANL…

828华为云征文|基于华为云Flexus云服务器X搭建FTP服务器

❀目录 ❀概述❀特点❀环境准备❀安装❀配置文件修改❀创建目录、修改权限❀控制台安全组开启21端口❀工具验证❀总结 ❀概述 FTP文件传输协议是一种在网络中进行文件传输的广泛使用的标准协议。作为网络通信中的基础工具,FTP允许用户通过客户端软件与服务器进行交…

栈和队列——用栈实现队列

栈的特点是先进后出,队列的特点是先进先出。根据题中要求,我们应用两个栈实现一个队列。我们可以类比用队列实现栈,我们可以先将元素都插入到栈1中,当我们想要取出元素时,我们可以将栈1中的所有数据依次插入到栈2中&am…

污点、容忍、不可调度、排水、数据卷

目录 污点taint 污点的格式 1. key:effect 键名:污点类型 2. keyvalue:effect 键名数值:污点类型 污点的类型 1. NoSchedule 2. PreferNoSchedule 3. NoExecute(驱逐) 设置污点(主节点操作&#xff09…

STM32:通过旋转计数器的计数控制舵机旋转的角度

声明:本博客为各模块之间结合的自主研究学习。 目录 一、按键操控舵机旋转(单向) 1.1、实物图讲解 1.2、代码讲解 1.2.1、PWM.c 具体步骤: 完整代码: 1.2.2、PWM.h 1.2.3、Servo.c && Servo.h 1.2.4、…

ts 类型分类

目录 01 ts 相关指令 02 类型声明空间与变量声明空间 03 类型注解和类型推断 04 类型分类 , 联合类型与交叉类型 05 never类型 any类型 和unknown类型 01 ts 相关指令 全局安装 typescript 模块 npm i -g typescript 安装完成之后 可以将ts文件转换成js文件 tsc xxx.ts…

为什么越来越多的人选择开放式耳机?平价高品质蓝牙耳机推荐

越来越多的人选择开放式耳机,主要是因为其具有多方面的优势,具体如下: 佩戴舒适度高:开放式耳机不入耳,不堵塞耳道,避免了对耳道的压迫和摩擦,长时间佩戴也不易产生闷热感和不适感。例如&#x…

windows安装git

windows安装git 1.通过git官网下载 官网:https://git-scm.com/downloads 2.安装git (1)找到下载到的文件,进行双击进行安装 (2)安装使用说明点击Next (3)选择自己的安装地址&a…

大屏可视化:阿里 DataV 大屏怎么做自适应的?

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 阿里 DataV 大屏是一款功能强大的数据可视化应用搭建工具,由阿里云提供,旨在帮助用户通过图形化的界面轻松搭建专业水准的可视化应用。 下面我们一起看下 DataV 大屏 是如何做自适应…

【嵌入式】uint32值写入到二进制文件中的存储详情

背景 项目预留100字节用于存储参数文件。现在有些数值一个字节表示不够,需要用4个字节。比如数值1144201745,对应的十六进制0x44332211,那么在二进制中存储是怎么样的呢?做个总结 分析 写了一个sample,把uint32_t u32Value1{0x…

【ThreadLocal源码】深入浅出ThreadLocal

【ThreadLocal源码】深入浅出ThreadLocal-CSDN博客

Linux之Prometheus

认识普罗米修斯 1、prometheus介绍 Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合, 由go语言开发。 适合监控容器平台, 因为kubernetes(俗称k8s)的流行带动了prometheus的发展。 PS:文档使用prometheus监控物理服务器。 prometheus的…