进程(4)——进程地址空间【linux】

进程(4)——进程地址空间【linux】

  • 一.什么是进程地址空间
  • 二.进程地址空间不是真实地址?
  • 三.物理地址与进程地址空间的关系(整体部分)
  • 四. 细节
    • 4.1 进程地址空间的本质:
    • 4.2 为什么要有进程地址空间?
      • i. 具体应用
      • ii. 宏观好处
    • 4.3 页表
      • i. 权限位
      • ii. 标志位


一.什么是进程地址空间

地址空间按照我们的现有的理解来说。

可以说成这样
在这里插入图片描述

这里可以算是我们的现有的对地址空间的认识
内存分区,不同的变量存储在进不同的区中

但是今天要告诉大家这个进程地址空间不是真正的地址空间

接下来就开始进行验证

二.进程地址空间不是真实地址?

子进程和父进程的值进行全局变量修改后
值不一样,但是全局变量地址却是一样的

这说明了打印出来的变量的地址不是真正的物理地址

#include<stdio.h>
#include<unistd.h>
int i=0;
//定义全局变量 i
int main(){size_t i=fork();if(i>0){//分别让子进程和父进程打印地址i的值和地址//并且全都让i重新赋值i=10;while(1){sleep(1);printf("i am father,val=%d ptr=%p\n",i,&i);}}else{i=100;while(1){sleep(1);printf("i am child,val=%d ptr=%p\n",i,&i);}}}

接下来就用这个代码践行测试一下

在这里插入图片描述

这里能惊奇的发现
父进程和子进程中的变量i值全都不同,但是它们的地址全都一样

这个结果就证明了,地址空间指向的肯定不是真实物理内存。

如果是地址指向真实的物理内存,那这样的情况肯定是不存在的,内存中的一个空间内,不可能存在一个变量有两个值的情况。

那真实的情况是什么样的?

记下来就带来物理地址和地址空间之间的大致关系

三.物理地址与进程地址空间的关系(整体部分)

这里我们就用一幅图来代表这其中的大致关系
(这里只是大致表示它的逻辑关系,其中细节没有补足)

在这里插入图片描述

这里是地址空间都是虚拟地址
真实地址是真实的存储区域
页表则是记录了虚拟地址对应的真实物理地址
充当了地址空间和真实内存中间的媒介。

现在我们就可以来思考一下

在这里插入图片描述

上面这个代码为什么运行结果是这样

因为地址一样并不指的是真实物理内存的地址
而是地址空间的虚拟地址

上面这个问题就是写实拷贝。

在这里插入图片描述

在这里插入图片描述

大致过程就是这样了
实际物理内存这两个是不同的
但是虚拟地址是一样的。

大致过程是这样了,但是接下来我们就来补充一些细节

四. 细节

4.1 进程地址空间的本质:

这里有个细节,我们以前都叫做内存地址空间
但是现在改成了进程地址空间
这说明了现在这个地址空间是属于进程的

什么叫属于进程?
在我们之前讲解进程的时候
提到了进程是由
进程=task_struct+代码和数据 组成的

这里提到:进程地址空间同样属于进程

所以我们这里需要更正一下我们对进程的理解了
进程=内核数据结构(task_struct && mm_struct && 页表结构)+代码和数据

这个mm_struct就是进程地址空间
在这里插入图片描述

那这里也就能确定:
进程地址空间是用来进行内存可视化的数据结构,同样也能被系统进行管理,同样符合和进程PCB一样的先描述再组织

所以每个进程pcb创建时,同样也要创建属于他们的虚拟内存——mm_struct

4.2 为什么要有进程地址空间?

我们这里讲完了进程地址空间是啥玩意后
接下来就要来讲讲为什么要有它

i. 具体应用

这里我们来举一个小例子
我们在前面讲过:进程有独立性
每个进程不知道别的进程的存在,它们只管自己的进程申请和使用

每个进程有了进程地址空间后
就能记录下每个进程的空间范围,用来方便申请内存
同时不妨碍
在这里插入图片描述
只要每个类中有一个起始和结束的地址
这样就不会互相冲突,更好维护进程的独立性

这里只是个具体的实际应用

接下来就讲宏观上的整体作用

ii. 宏观好处

1.
进程地址空间相当于进程和物理地址间加了个媒介
可以让进程在进行寻址请求或者申请时进行审查,所以一旦访问异常,直接拦截
使关于进程的内存操作简单方便了很多。

2.
因为有地址空间和页表的存在,将进程管理模板和内存管理模板进行解耦合

这里通俗的讲就是:

当我们用户进行进程的创建和使用的时候。
不再需要关心内存的申请和创建,操作系统自己就会去调用
让使用计算机的门槛和难度降低了很多

4.3 页表

这里提个小细节
还记得之前提过在切换进程的时候,cpu中存储的是进程的上下文

页表就存在寄存器中,算是进程的上下文的一部分

i. 权限位

mm_struct中进行了分区。
分为了常量区和代码区。
其中的代码都是不能进行更改的
这里我们能猜到其实这个:
不能进行更改肯定不是真实的物理内存进行的权限划分
而是进程地址空间实施的。

因为如果真实物理地址进行权限划分的话
那在常量区数据最开始怎么进行写入?
所以权限的划分是体现在进程地址空间中的

那代码是如何知道什么权限有没有被划分的?

这里就要牵扯到页表了
在这里插入图片描述

页表中有一个专门的权限位
用来表示地址指向的空间是否具有对应的权限

ii. 标志位

还记得我们讲进程的时候提到过进程挂起的这个概念

当进程长时间未使用或者资源没有准备时
系统会将该进程的代码和数据从内存中去掉,让其他进程使用内存资源

那如何知道进程有没有被挂起?(本质是问系统如何知道代码和数据是否在内存中读取)
这里我们就要提一下
系统为了防止空间和时间的浪费,所以页表中使用的是惰性加载
就是说会将进程的代码和数据先读取在进程内存地址空间,而不去使用实际内存的空间
就是说会在地址空间处先占个位置,在实际内存中不会先去开辟空间

所以为了让系统知道什么地址被成功加载到了物理内存中
页表又加了一个标志位:
在这里插入图片描述

用来专门标识数据和代码是否被加载到了内存空间当中
这样就可以做到进程的挂起和惰性加载了。

如果当操作系统发现进程的代码和数据没有被加载到实际内存中时,会触发缺页中断,将进程暂停,重新将进程的代码和数据从磁盘加载到内存中,然后再继续执行。
前面我们提到的写实拷贝同样也是缺页中断的功能实现。

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

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

相关文章

Mac 搭建本地服务器

文章目录 1 启动服务器2 服务器目录3 手机访问服务器3.1 手机和电脑连上同一个局域网( 或WIFI)3.2 找到电脑的ip地址 如下图所示3.3 手机打开 http://192.168.10.5/1.txt 4 关闭服务器5 参考文章 1 启动服务器 sudo apachectl start启动后访问 http://localhost/ 如下图所示即…

JavaWeb后端数据库MySQL的使用

JavaWeb MySQLSQL数据库设计 多表设计1对多1对1多对多 多表查询连接查询内连接外连接左外连接右外连接 子查询事务索引 MySQL MySQL数据模型 关系型数据库&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 SQL SQL&#xff1a;操作关系型数…

系列二十一、Spring中bean的创建顺序

一、概述 我们知道启动IOC容器时&#xff0c;Spring会为我们创建各种各样的bean&#xff0c;那么思考一个问题&#xff0c;bean的创建顺序是由什么决定的呢&#xff1f;答&#xff1a;bean的创建顺序是由BeanDefinition的注册信息决定的&#xff0c;这个其实很好理解&#xff0…

创建SpringBoot Helloword 程序详细步骤

本文档实现SpringBoot hello word 程序&#xff0c;翻译于Spring | Quickstart 目录 一、项目创建步骤1.1 创建项目1.2 添加代码1.3 运行 参考教程 一、项目创建步骤 1.1 创建项目 在官网Spring Initializr上创建项目 1.2 添加代码 在IDE中打开项目并在src/main/java/com/zo…

pinpoint链路跟踪运用及日志logback配置

本文将讲述pinpoint的安装&#xff0c;使用及与java logback 日志的集成。 介绍 是什么 是一款 APM监控工具(Application Performance Management/应用性能管理)基于java编写用于 大规模分布式系统 的监控&#xff0c;是 分析 大规模分布式系统 的平台基于google Dapper开发&…

Android Bitmap 模糊效果实现 (二)

文章目录 Android Bitmap 模糊效果实现 (二)使用 Vukan 模糊使用 RenderEffect 模糊使用 GLSL 模糊RS、Vukan、RenderEffect、GLSL 效率对比 Android Bitmap 模糊效果实现 (二) 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134656140 最新更新地址 https:/…

2021年03月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共15题,每题2分,共30分) 第1题 运行如下图所示的程序后,以下描述正确的是? A:角色停留在(0,0)的位置,不会移动。 B:角色会在舞台上沿水平方向不停地左右往返移动,碰到边缘就反弹。 C:角色会向右沿水平方向…

【MVP矩阵】裁剪空间、NDC空间、屏幕空间

裁剪空间概述 裁剪空间是一个顶点乘以MVP矩阵之后所在的空间&#xff0c;Vertex Shader的输出就是在裁剪空间上&#xff08;划重点&#xff09; NDC空间概述 接上面&#xff0c;由GPU自己做透视除法将顶点转到NDC空间 两者的转换 透视除法将Clip Space顶点的4个分量都除以…

C语言SO EASY(ZZULIOJ1220: SO EASY)

题目描述 Superbin最近在研究初等数论&#xff0c;初等数论 是研究数的规律&#xff0c;特别是整数性质的数学分支。它是数论的一个最古老的分支。它以算术方法为主要研究方法&#xff0c;主要内容有整数的整除理论、同余理论、连分数理论和某些特殊不定方程。 是定义在正整数…

linux设置主机名

查看主机名&#xff1a;hostname 临时修改主机名&#xff1a;hostname 新主机名 [rootlocalhost ~]#hostname centos [rootlocalhost ~]#hostname centos 永久修改主机名&#xff1a; [rootlocalhost ~]#cat /etc/hostname localhost.localdomain

C#Backgroundworker与Thread的区别

前言 当谈到多线程编程时&#xff0c;C#中的BackgroundWorker和Thread是两个常见的选择。它们都可以用于实现并行处理和异步操作&#xff0c;但在某些方面有一些重要的区别。本文将详细解释BackgroundWorker和Thread之间的区别以及它们在不同场景中的使用。 目录 前言1. Backgr…

自动驾驶视觉感知技术

1、视觉感知 2、应用功能 3、视觉感知支持的功能 4、软硬件产品 5、DMS、手势识别、行为检测 6、DMS视觉检测 7、驾驶员离位检测 8、安全带检测 9、双手脱离方向盘检测 10、后排遗留物检测 11、360环视AVM倒车指引线MOD 12、盲区监测

上门预约互联网干洗店洗鞋店小程序开发

很多时候可能大家的衣服鞋子需要干洗&#xff0c;但又不想出门送去店里&#xff0c;大家就可以使用手机线上下单预约取货&#xff0c;会有专门的人上门来取衣服&#xff0c;让你能够轻松的进行洗护。 闪站侠洗衣洗鞋小程序&#xff0c;提供了足不出户就能预约人员上门去 衣送洗…

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过&#xff0c;当两部手机进行备忘录数据传输后&#xff0c;突然发现备忘录不见了&#xff0c;这让人不禁着急上火&#xff0c;我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为&#xff0c;两部手机使用的是不同的云服务&…

中学课程辅导杂志中学课程辅导杂志社中学课程辅导编辑部2023年第10期目录

教育视点 核心素养导向下的初中化学大单元教学研究 陈玉霞; 3-5 核心素养下的英语大单元教学策略 马玲凤; 6-8 盲校初中语文课堂教学特点及教学策略 王瀚文;王彩云; 9-11 新课改背景下高中语文教学语言的运用探讨 王文静; 12-14《中学课程辅导》投稿&#xff1…

第二十章,多线程

创建线程 有两种方式&#xff0c;分别为继承Java.lang.Thread类与实现Java.lang.Runnable接口 继承Thread类 Thread常用的两个构造方法语法 public Thread&#xff08;&#xff09;&#xff1b; public Thread&#xff08;String threadName&#xff09;&#xff1b; 继承…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 5》(9)

《Linux操作系统原理分析之Linux 进程管理 5》&#xff08;9&#xff09; 4 Linux 进程管理4.5 Linux 信号4.5.1 信号的作用和种类1.信号机制2.信号种类 4.5.2 信号的处理4.5.3 信号处理函数1&#xff0e;数据结构2&#xff0e; 处理函数 signal3&#xff0e;程序例 4 Linux 进…

论文阅读:“Appearance Capture and Modeling of Human Teeth”

文章目录 AbstractIntroductionMethod OverviewTeeth Appearance ModelEnamelDentinGingiva and oral cavity Data AcquisitionImage captureGeometry capture ResultsReferences Abstract 如果要为电影&#xff0c;游戏或其他类型的项目创建在虚拟环境中显示的人类角色&#…

【RTP】4: 实例解析:一个SRTP的wireshark抓包:带padding、带扩展

抓取的是视频包。固定的pt是127从头部找到序号,快速找到这个包包大小因为是包括了SRTP的,所以318 个字节,实际RTP包是286个字节。SRTP 包 UDP总共 294个字节,payload部分286 RTP协议 RTP部分: B0 代表有padding、有扩展 从B0开始

Android 如何让路由器或者其他AP设备获取到主机名

问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…