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.mzph.cn/news/601600.shtml

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

相关文章

矩阵的乘法

首先矩阵的乘法定义如下&#xff1a; #include <stdio.h> int main() { int i 0; int j 0; int arr[20][20] { 0 }; int str[20][20] { 0 }; int s[20][20] { 0 }; int n1 0; int n2 0; int m2 0; int z 0; int m1 0;…

LeetCode 每日一题 Day 3334(hard)35 ||二进制枚举/单调栈/链表遍历

2397. 被列覆盖的最多行数 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 都被你选中的列所覆盖&#xff0c;则认为这一行被 覆盖 了。 形式…

认识jmeter接口测试工具!

jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 下载 下载地址&#xff1a;​​​​​​Apache JMeter - Download Apache JMeter 安装 由于Jmeter…

学会视频剪辑方法:从视频中提取封面,增加视频观看量

在数字媒体时代&#xff0c;视频已经成为信息传递的主要方式之一。那如何让视频在众多内容中脱颖而出&#xff0c;吸引更多的观众呢&#xff1f;除了内容本身的质量外&#xff0c;视频的封面也是吸引的关键因素之一。下面一起看云炫AI智剪如何通过视频剪辑方法从视频中提取封面…

Docker的一个简单例子(二)

文章目录 环境示例持久化数据bind mount多容器应用Docker Compose 参考 环境 RHEL 9.3Docker Community 24.0.7 示例 持久化数据 默认情况下&#xff0c;各个容器之间的文件系统是相互独立的。即使两个容器来自同一个image&#xff0c;对其中一个容器的修改&#xff0c;对另…

leetcode算法题之递归--综合练习(二)

本章目录 1.N皇后2.有效的数独3.解数独4.单词搜索5.黄金矿工6.不同路径III 1.N皇后 N皇后 class Solution {vector<vector<string>> ret;vector<string> path;int n;bool checkCol[10],checkDig1[20],checkDig2[20]; public:vector<vector<string&g…

Android 13.0 SystemUI状态栏居中显示时间和修改时间显示样式

1.概述 在13.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 2.SystemUI状态栏居中显…

conda安装transformers、wordcloud库

conda安装transformers库 使用 conda 自 Transformers 4.0.0 版始&#xff0c;我们有了一个 conda 频道&#xff1a; huggingface。 &#x1f917; Transformers 可以通过 conda 依此安装&#xff1a; conda install -c huggingface transformers安装起来就很通畅 conda查看…

NGINX 配置本地HTTPS(免费证书)

生成秘钥key,运行: $ openssl genrsa -des3 -out server.key 2048 会有两次要求输入密码,输入同一个即可。输入密码然后你就获得了一个server.key文件。 以后使用此文件(通过openssl提供的命令或API)可能经常回要求输入密码,如果想去除输入密码的步骤可以使用以下命令: $ op…

【JVM】一篇通关JMM内存模型

JMM内存模型 1. 原子性1-1. 问题分析1-2. 问题解决 2. 可见性2-1. 问题分析2-2. 问题解决 3. 有序性3-1. 问题分析3-2. 问题解决 4. CAS与原子性5. synchronized 优化 1. 原子性 很多人将【java 内存结构】与【java 内存模型】傻傻分不清&#xff0c;【java 内存模型】是 Java…

C++ queue

目录 一、介绍 二、queue使用 三、模拟实现 四、优先级队列 五、priority_queue使用 OJ题&#xff1a;215. 数组中的第K个最大元素 快速排序 优先级队列 TOPK 六、模拟实现priority_queue 1、仿函数 2、优先级队列类 3、测试函数 一、介绍 1、队列是一种容器适配器…

【React系列】高阶组件

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 高阶组件 1.1. 认识高阶组件 什么是高阶组件呢&#xff1f;相信很多同学都听说过&#xff0c;也用过 高阶函数&…

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…

Vue页面传值:Props属性与$emit事件的应用介绍

一、vue页面传值 在Vue页面中传值有多种方式&#xff0c;简单介绍以下两种 通过props属性传递值&#xff1a;父组件在子组件上定义props属性&#xff0c;子组件通过props接收父组件传递的值。通过$emit触发事件传递值&#xff1a;子组件通过$emit方法触发一个自定义事件&#…

20.扫雷

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();int[][] f new int[n][m];for(int i0;i<n;i) {for(int j0;j<m;j) {f[i][j] sc.nextInt()…

TS学习笔记一:认识TS及环境准备

本次学习笔记是具有一定js基础的情况下从头开始学习ts相关内容。 视频信息 TS学习笔记一&#xff1a;认识TS及环境准备 B站视频 TS学习笔记一&#xff1a;认识TS及环境准备 西瓜视频 https://www.ixigua.com/7320049274006274560 1.1.目的 通过本次学习&#xff0c;学习并…

养乐多公司确认 95 G 用户私密数据被泄露

一名自称为DragonForce的组织声称已经公开泄露了澳大利亚养乐多公司&#xff08;Yakult Australia&#xff09;的95.19 GB数据。Yakult Australia证实了这次网络攻击的真实性&#xff0c;并表示公司在澳大利亚和新西兰的IT系统都受到了影响。 该公司在一份声明中表示&#xff…

21.串的处理

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String str sc.nextLine();char[] c str.toCharArray();int n c.length;StringBuilder st new StringBuilder();int i 0;while(i<n)…

C++学习笔记 ——this指针+对象数组

目录 一、Cthis指针 二、this指针的一个案列 三、对象数组 四、对象数组代码案列详解 一、Cthis指针 C中的this指针是一个特殊的指针&#xff0c;它指向当前对象的地址。在类中的成员函数中&#xff0c;this指针可以用来访问当前对象的成员变量和成员函数。 当我们调用一…

轻松玩转书生·浦语大模型趣味Demo

轻松玩转书生浦语大模型趣味Demo 大模型及InternLM模型介绍InternLM模型全链路开源 InternLM-Chat-7B智能对话Demo模型介绍模型部署webDemo运行 Lagent智能体工具调用DemoLagent介绍 浦语灵笔图文创作理解Demo通用环境配置模型下载 大模型及InternLM模型介绍 人工智能领域中 参…