Linux基础——进程地址空间

1. 地址空间的验证

之前我们在学习语言时,曾知道有下面这张图

对于这个图我们可以用下面的代码验证

运行后我们可以发现

其对应关系如下

我们使用fork函数,来分别对父子进程中的g_val进行修改,即

运行后我们可以发现

在子进程修改了g_val后,父子指向同一地址时,但是读取到了不同的内容,我们可以知道如果变量的地址是物理地址,那么上面的情况不可能发生,因此这里的地址绝对不是物理地址,我们将其称为线性地址(或虚拟地址)。

2. 地址空间

对每一个task_struct,Linux都会为其单独创建一个进程地址空间与页表,页表中存放着虚拟地址与物理地址的映射关系,当fork创建一个子进程后,子进程会将父进程的进程地址空间和页表给自己拷贝一份,然后在修改g_val时,他会通过虚拟地址找到物理地址请求向这个物理地址进行写入,操作系统在发现这块物理地址是共享的之后,会开辟一份新空间并放入50,然后修改子进程中页表的映射关系。在这里,g_val修改后由操作系统自动完成写时拷贝,而在重新开辟新空间这个过程中,页表左侧的虚拟地址是0感知,即不会影响它。而在打印的时候,打印出来的虚拟地址相同而映射关系不同,因此访问出来的空间(结果)不同。这也侧面解释了之前讲解fork时,为什么id既可以>0又可以=0。

3. 进程地址空间的细节

①什么叫做地址空间?

首先我们要知道,在32位计算机中,有32位的地址的数据总线,内存与CPU之间为系统总线,内存与外设之间为I/O总线,

由于每一根总线为0/1,一共32根总线,因此一共有2^32种情况,每种情况为1byte计算下来便是4GB,对于每一根总线来说为0或者为1在硬件的体现上就是充放电,如果最后每一根组合出来的为1111 .... 1111,那么它的意思就是要访问地址为1111 ,,,, 1111的那一块空间。所有的总线排列组合形成的地址范围就是地址空间,范围为[0, 2^32]。

那么地址空间为何要对不同的区域作出划分呢?

在这里我们举一例子来帮助我们理解,在小时候我们都曾有过划三八线的经历,而划出来的三八线的本质就是进行区域划分,对于一个100cm的桌子我们规定属于自己(mine)的范围为[0, 50],属于同桌(mate)的范围为[51, 100]。即我们可以设计一个struct结构体来描述它,即

在定义对象并初始化后,对于我来说我可以访问[0, 50]的任意位置,那么对于空间区域调整(即变大变小),我们又该如何理解呢?非常简单,我们只需要修改mine的end和mate的begin即可解决。

说了这么多,那到底什么是地址空间呢?

地址空间本质是描述一个进程可视范围的大小,地址空间内一定会存在各种区域的划分,对线性地址进行start与end标记即可,它是内核的一个数据结构对象,类似于PCB,地址空间也是需要被操作系统管理的。

其结构大致如下

那么在知道了地址空间的存在后,我们如何判断数据或者指针是否越界呢?——判断其是否落在对应区间内。

②什么叫进程地址空间?为什么需要它的存在?

在这里我们先举一个例子来方便我们理解,有一个富人拥有100亿的财富,他有3个私生子(互相不知道彼此存在)并且它对每一个儿子说我为你留了100亿的遗产,此时对于每一个私生子来说都认为自己会拥有100亿的财富。而在操作系统中,这个富人就是操作系统,这100亿的财富就是进程地址空间,每个私生子就是一个一个的进程。在进程被创建时,会先创建其内核数据,再加载对应的可执行程序。

那么为什么需要进程地址空间的存在呢?

1. 首先,有了进程地址空间中的页表,可以让所有进程以统一的视角看待内存;

2. 增加进程虚拟地址空间可以让我们在访问内存时,增加一个转换的过程,在这个转化的过程中,操作系统可以对我们的寻址请求进行审查,一旦访问异常就会直接拦截,该请求不会到达物理内存进而可以保护物理内存;

3. 由于有地址空间和页表的存在,可以将进程管理模块和内存管理模块。

此外,我们就能更加具体地解释之前的一些问题了,如我们知道代码和字符常量区是只读的,那么它是如何做到的呢?——在页表中有第三栏的选项,在代码和字符常量区所匹配的页表中,将其对应权限设置为"r"(只读)即可。还有,我们知道进程可以被挂起,那么我们如何知道代码和数据在不在内存呢?——在页表中有第四栏的选项,这一栏能判断对应的代码和数据是否已经加载到内存。

其实,在虚拟地址试图访问物理地址时,检测到物理地址为0时,此时会发生缺页中断,操作系统就会从磁盘中向物理内存申请一块空间,并将其地址填到对应的页表中,这样在访问虚拟地址时,就能够访问到对应内容了。从本质上来说,写实拷贝也会触发缺页中断。

此时,我们对于进程具有独立性是如何做到的便有了一个新的理解,首先是每一个进程都有其独特的PCB,其次每个进程的页表中的映射关系不同,而页表存在意义就是将物理内存中的无序变为进程地址空间中的有序。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的课程作业管理系统

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1背景及意义 随…

LLM之RAG实战(十三)| 利用MongoDB矢量搜索实现RAG高级检索

想象一下,你是一名侦探,身处庞大的信息世界,试图在堆积如山的数据中找到隐藏的一条重要线索,这就是检索增强生成(RAG)发挥作用的地方,它就像你在人工智能和语言模型世界中的可靠助手。但即使是最…

[C#]使用OpenCvSharp实现二维码图像增强超分辨率

【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 借助于opencv自带sr.prototxt和sr.caffemodel实现对二维码图像增强 【效果展示】 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin…

[MySQL]视图索引以及连接查询案列

目录 1.视图 1.1视图是什么 1.2视图的作用 1.3操作 1.3.1创建视图 1.3.2视图的修改 1.3.3删除视图 1.3.4查看视图 2.索引 2.1什么是索引 2.2为什么要使用索引 2.3索引的优缺点 2.3.1优点 2.3.2缺点 2.4索引的分类 3.连接查询案列 4.思维导图 1.视图 1.1视图是什么 视图…

基于华为云解析服务实现网站区域封禁

前言 中国大陆以外的网络攻击不断,个人博客时常遭受不明个人或组织的攻击,给网站的安全运行带来了巨大的风险,同时DDoS、CC攻击等还会消耗服务器的资源,站长可能需要因此支付高昂的服务器、CDN的流量费用。 因此,如果…

GPT商店要来了,手把手教你制作一个GPT

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 OpenAI 刚刚宣布下周将推出 GPT 商店,这对早期采用者来说是一个巨大的机会。 这里有一个简单的四步教程,教你如何现在就制作一个 GPT。 第…

MySQL之视图案例

目录 一.视图1.1 含义1.2 操作 二.案例三.思维导图 一.视图 1.1 含义 虚拟表,和普通表一样使用 1.2 操作 1.创建视图 create view 视图名 as 查询语句; 2.视图的修改 方式一: create or replace view 视图名 as 查询语句 方式二&#x…

uniapp 【专题详解 -- 时间】云数据库时间类型设计,时间生成、时间格式化渲染(uni-dateformat 组件的使用)

云数据表的时间类型设计 推荐使用时间戳 timestamp "createTime": {"bsonType": "timestamp","label": "创建时间:" }时间生成 获取当前时间 Date.now() .add({createTime: Date.now() })时间格式化渲染 下载安…

电脑出现msvcp140.dll丢失怎么办,分钟四种msvcp140.dll丢失的解决办法

如果你的电脑出现了关于msvcp140.dll丢失的情况那么大家一定要及时去解决msvcp140.dll丢失的问题,msvcp140.dll丢失可能会导致电脑出现各类的问题,今天就教大家四种关于msvcp140.dll丢失的解决办法,有效的解决msvcp140.dll丢失。 一.针对msvc…

【H3C】Console口密码配置

配置方法 console口密码主要配置 line con0 //进入con0用户线视图 #line aux0 //S5024X-EI使用该命令进入用户视图 authentication-mode password //认证模式为密码模式,其他还有无密码和…

启动IDEA报错,web servcer failed to start.port 8080 was already in use.

启动IDEA报错,web servcer failed to start.port 8080 was already in use. 问题现状 启动IDEA失败,端口被占用。 解决办法: 使用netstat -ano指令,查看端口占用情况 因为我是win11的系统,使用指令时出现如下提示。…

数字孪生在增强现实(AR)中的应用

数字孪生在增强现实(Augmented Reality,AR)中的应用可以提供更丰富、交互性更强的现实世界增强体验。以下是数字孪生在AR中的一些应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司&#xff…