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

news2024/10/1 5:27:47

进程(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.coloradmin.cn/o/1261401.html

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

相关文章

机器学习——多元线性回归升维

机器学习升维 升维使用sklearn库实现特征升维实现天猫年度销量预测实现中国人寿保险预测 升维 定义&#xff1a;将原始的数据表示从低维空间映射到高维空间。在线性回归中&#xff0c;升维通常是通过引入额外的特征来实现的&#xff0c;目的是为了更好地捕捉数据的复杂性&#…

MacOS 系统 Flutter开发Android 环境配置

上节我们已经把 开发工具准备齐全&#xff0c;并可以进行Flutter的web开发&#xff0c;本节将做安卓开发环境进行详细说明 接上节这里先说下&#xff0c;系统环境 MacOS14 &#xff08;Sonoma&#xff09; 芯片 Apple M3 执行命令&#xff1a;flutter doctor 提示如下&#…

Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)一

第三部分&#xff1a;Shell高级&#xff08;一&#xff09; 这一章讲解 Shell 脚本编程的进阶内容&#xff0c;主要涉及重定向、文件描述符、管道和过滤器、子 Shell、信号等。 本章会使用到一些底层的编程知识&#xff0c;有C语言和 C 编程经验的程序员阅读起来将会更加轻松。…

《微信小程序开发从入门到实战》学习三十三

第四章 云开发 本章云开发技术的功能与使用&#xff0c;包括以下几点&#xff1a; 1.学习使用云开发控制台 2.学习云开发JSON数据库功能 3.学习云开文件存储功能 4.学习云函数功能 5.使用云开发技术实现投票小程序的服务端功能 投票小程序大部分已经实现。需要实现&#…

人工智能-优化算法之凸集

凸性 凸性&#xff08;convexity&#xff09;在优化算法的设计中起到至关重要的作用&#xff0c; 这主要是由于在这种情况下对算法进行分析和测试要容易。 换言之&#xff0c;如果算法在凸性条件设定下的效果很差&#xff0c; 那通常我们很难在其他条件下看到好的结果。 此外&…

二叉堆与优先队列

二叉堆与优先队列 1、什么是二叉堆 1.1、初识二叉堆 什么是二叉堆&#xff1f; 二叉堆本质上是一种完全二叉树&#xff0c;它分为两个类型。 最大堆&#xff08;也叫大顶堆&#xff09;&#xff1a;任意节点的值都大于或等于它的左右孩子节点的值&#xff0c;并且最大的值位…

SHAP(一):具有 Shapley 值的可解释 AI 简介

SHAP&#xff08;一&#xff09;&#xff1a;具有 Shapley 值的可解释 AI 简介 这是用 Shapley 值解释机器学习模型的介绍。 沙普利值是合作博弈论中广泛使用的方法&#xff0c;具有理想的特性。 本教程旨在帮助您深入了解如何计算和解释基于 Shapley 的机器学习模型解释。 我…

NX二次开发UF_CURVE_create_arc_point_tangent_radius 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_tangent_radius Defined in: uf_curve.h int UF_CURVE_create_arc_point_tangent_radius(tag_t point, tag_t tangent_object, double radius, UF_CURVE_…

初识前后端数据交互(新手篇)

一个软件项目的开发必然是离不开前端和后端的协作&#xff0c;对于刚入行的新手前端或者新手后端来说&#xff0c;很有必要了解一下对方是在做什么&#xff0c;以及提供给自己什么样的帮助&#xff0c;为什么需要对方共同协作才能完成整个软件项目的开发呢&#xff1f;希望这篇…

Scrapy框架内置管道之图片视频和文件(一篇文章齐全)

1、Scrapy框架初识&#xff08;点击前往查阅&#xff09; 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道 4、Scrapy框架中间件&#xff08;点击前往查阅&#xff09; Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来&#xff0c;我国 GDP 持续快速增长&#xff0c;但经济增长模式相对传统落后&#xff0c;对生态平衡和自然环境造成一定的破坏&#xff0c;空气污染的弊病日益突出&#xff0c;特别是日益加重的雾霾天气已经干扰…

从0开始学习JavaScript--JavaScript对象继承深度解析

JavaScript中的对象继承是构建灵活、可维护代码的关键部分。本文将深入讨论JavaScript中不同的继承方式&#xff0c;包括原型链继承、构造函数继承、组合继承等&#xff0c;并通过丰富的示例代码展示它们的应用和差异。通过详细解释&#xff0c;大家可以更全面地了解如何在Java…

Shopee如何入驻?如何防封?

Shopee作为东南亚领航电商平台&#xff0c;面向东南亚蓝海市场&#xff0c;近年来随着东南亚市场蒸蒸日上&#xff0c;虾皮也吸引了大批量的跨境商家入驻。那么接下来就给想要入驻的虾皮小白一个详细的安全入驻教程。 一、商家如何入驻 虾皮与LAZADA最大的区别就是商家即卖家&…

RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

15、矩阵键盘密码锁

矩阵键盘密码锁 main.c #include <REGX52.H> #include "Delay.h" #include "LCD1602.h" #include "MatrixKey.h"//初始化变量 unsigned char KeyNum; unsigned int Password,Count;void main() {//LCD屏幕初始化显示Password:LCD_Init();…

kafka的详细安装部署

简介&#xff1a; Kafka是一个分布式流处理平台&#xff0c;主要用于处理高吞吐量的实时数据流。Kafka最初由LinkedIn公司开发&#xff0c;现在由Apache Software Foundation维护和开发。 Kafka的核心是一个分布式发布-订阅消息系统&#xff0c;它可以处理大量的消息流&#…

matplotlib,DLL load failed: 找不到指定的模块

问题&#xff1a;import matplotlib mportError: DLL load failed: 找不到指定的模块 &#xff08;2023年11月28日&#xff09; 解决方法&#xff1a;具体是matplotlib版本不匹配&#xff0c;而且在线pip install numpy时因为在线下载numpy库中缺少DLL。 应该下载带有mkl的num…

利用ogr2ogr从PostGIS中导出/导入Tab/Dxf/Geojson等格式数据

ogr2ogr Demo Command 先查看下当前gdal支持的全部格式&#xff0c;部分gdal版本可能不支持PostGIS。 如出现PostgreSQL表名支持。 #全部支持的格式 ogrinfo --formats | sort #AVCBin -vector- (rov): Arc/Info Binary Coverage #AVCE00 -vector- (rov): Arc/Info E00 (ASC…

居家适老化设计第三十三条---卫生间之暖风

居家适老化是指为了满足老年人居住需求而进行的住房改造&#xff0c;以提供更加安全、舒适、便利的居住环境。在居家适老化中&#xff0c;暖风系统是一个重要的考虑因素。暖风系统可以提供温暖舒适的室内温度&#xff0c;对老年人来说尤为重要。老年人常常身体机能下降&#xf…

PHPExcel 导出Excel报错:PHPExcel_IOFactory::load()

背景 近期在做 excel文件数据导出时&#xff0c;遇到如下报错&#xff1a; iconv(): Detected an illegal character in input string场景&#xff1a;计划任务后台&#xff0c;分步导出 大数据 excel文件发现在加载文件时&#xff0c;会有报错 报错信息 如下&#xff1a; {&q…