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,其次每个进程的页表中的映射关系不同,而页表存在意义就是将物理内存中的无序变为进程地址空间中的有序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

凸优化 3:最优化方法

凸优化 3:最优化方法 最优化方法适用场景对比费马引理一阶优化算法梯度下降最速下降 二阶优化算法牛顿法Hessian矩阵Hessian矩阵的逆Hessian矩阵和梯度的区别牛顿法和梯度下降法的区别 拟牛顿法DFP、BFGS/L-BFGS 数值优化算法坐标下降法SMO算法 基于导数的函数优化解…

计算机视觉技术-区域卷积神经网络(R-CNN)

区域卷积神经网络(region-based CNN或regions with CNN features,R-CNN) (Girshick et al., 2014)也是将深度模型应用于目标检测的开创性工作之一。 本节将介绍R-CNN及其一系列改进方法:快速的R-CNN(Fast R-CNN&#x…

安全与认证Week3 Tutorial+历年题补充

目录 1) 什么是重放攻击? 2)什么是Kerberos系统?它提供什么安全服务? 3)服务器验证客户端身份的一种简单方法是要求提供密码。在Kerberos中不使用这种身份验证,为什么?Kerberos如何对服务器和客户机进行身份验证? 4) Kerberos的四个要求是什么?Kerberos系…

软件测试|docker ps命令 管理和监视容器的利器

简介 Docker是一种流行的容器化平台,用于构建、分发和运行应用程序。Docker提供了许多命令行工具,其中之一是docker ps命令。本文将深入介绍docker ps命令,解释其用途、参数和功能,以及如何使用该命令来管理和监视运行中的Docker…

netcore html to pdf

一、新建项目&#xff1a;QuestPDFDemo <PackageReference Include"NReco.PdfGenerator" Version"1.2.1" /> 二、上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging;using QuestPDFDemo.Models; using System; using Sys…

力扣刷题记录(25)LeetCode:583、72、647

583. 两个字符串的删除操作 题目说可以删除任意一个字符串中的字符&#xff0c;实际上就是在求两个字符串的公共子序列。求得公共子序列后与字符串长度做个减法即可得需要的步数。 class Solution { public://求最长子数组int minDistance(string word1, string word2) {vecto…

C++ 数组详解,很全,很详细

数组 (C) 数组是相同类型的对象序列&#xff0c;它们占据一块连续的内存区。 传统的 C 样式数组是许多 bug 的根源&#xff0c;但至今仍很常用&#xff0c;尤其是在较旧的代码库中。 在新式 C 中&#xff0c;我们强烈建议使用 std::vector 或 std::array&#xff0c;而不是本部…

PPT插件-大珩助手-文字整理功能介绍

删空白行 删除文本中的所有空白行 清理编号 删除文本中的段落编号 清理格式 删除文本中的换行、空格符号 清理艺术 删除文本的艺术字效果 清理边距 删除文本框与文字之间的间隙 软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实…

1.5 Unity中的数据存储 PlayerPrefs、XML、JSON

Unity中的三种数据存储&#xff1a;数据存储也称为数据持久化 一、PlayerPrefs PlayerPrefs是Unity引擎自身提供的一个用于本地持久化保存与读取的类&#xff0c;以键值对的形式将数据保存在文件中&#xff0c;然后程序可以根据关键字提取数值。 PlayerPrefs类支持3种数据类…

网络信息安全十大隐患,如何做好防范,实践方法

随着互联网的普及和信息技术的飞速发展&#xff0c;网络安全问题日益凸显。网络攻击、网络诈骗、网络病毒等问题时刻威胁着人们的隐私和财产安全。针对这些隐患&#xff0c;广大网友该如何防范呢&#xff1f; 一&#xff1a;黑客攻击 黑客攻击是网络信息安全面临的最大威胁之一…

Beauty algorithm(四)眼影

一、skills 前瞻 略 二、目标区域定位 1、 眼影区域 1、眼部关键点 左侧:36,37,38,39,40,41 右侧:42,43,44,45,46,47 2、计算roi区域的w,h,center 目的调整mask的比列。 FaceRegion left_es, right_es; left_es.w = landmarks.at(39).x - landmarks.at(36).x; left_es.…

Qt重载事件

重载event 事件类型 (EventType) 事件类型是 QEvent 类的一个枚举 &#xff0c;包含了 Qt 能够处理的所有不同类型的事件。这个枚举包括但不限于以下常见类型&#xff1a; QEvent::MouseButtonPress: 鼠标按钮按下事件。QEvent::MouseButtonRelease: 鼠标按钮释放事件。Q…

spring Security源码讲解-WebSecurityConfigurerAdapter

使用security我们最常见的代码&#xff1a; Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().permitAll();http.authorizeRequests().antMatcher…

音量控制软件sound control mac功能亮点

sound control mac可以帮助用户控制某个独立应用程序的音量&#xff0c;通过每应用音量&#xff0c;均衡器&#xff0c;平衡和音频路由独立控制每个应用的音频&#xff0c;还有整个系统的音量。 sound control mac功能亮点 每个应用程序的音量控制 独立控制应用的数量。 键盘音…

fastadmin学习02-修改后台管理员账号密码

问题 如果是别人部署好的fastadmin网站不知道后台登录地址和账号密码怎么办 后台登录地址 public目录下有一个很奇怪的php就是后台登录地址啦 忘记账号密码 找到fa_admin&#xff0c;fa_是前缀&#xff0c;肯能每个项目不太一样 UPDATE fa_admin set password1d020dee8ec…

(三)其他的输入输出

文章目录 getchar();单个字符输入使用&#xff1a; putchar();单个字符输出(自带换行)使用 puts();字符串输出与printf区别使用 gets();后面补充 代码现象 getchar(); 单个字符输入 使用&#xff1a; 变量 getchar(); 例&#xff1a;char a&#xff1b; a getchar(); put…

WEB 3D技术 three.js 顶点缩放

本文 我们来说 顶点缩放 我们官网搜索 BufferGeometry 下面有一个 scale 函数 例如 我们先将代码写成这样 上面图片和资源文件 大家需要自己去加一下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/j…

软件测试|Docker exec命令详细使用指南

简介 Docker exec命令是Docker提供的一个强大工具&#xff0c;用于在正在运行的容器中执行命令。本文将详细介绍Docker exec命令的用法和示例&#xff0c;帮助大家更好地理解和使用这个命令。 Docker是一种流行的容器化平台&#xff0c;允许我们在容器中运行应用程序。有时候…

Linux 服务器磁盘满了怎么办?详细清理大文件指南

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

作业三详解

作业3&#xff1a; 在作业1的基础上&#xff0c;整合修改、删除功能&#xff0c;可实现如下功能 1.进入新增页面&#xff0c;页面填入新增数据&#xff0c;提交表单&#xff0c;然后跳转到查询列表页面&#xff0c;列表页面显示所有记录&#xff08;多一条新增的数据&#xff…