进程(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. 标志位

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

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

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

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

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

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

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

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

相关文章

初识Linux(2).妈妈再也不用担心我Linux找不到门了。

文章目录 前言 1.man指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a; 2.cp指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a;把123.txt复制到a目录中类似window如下操作&#xff1a; 3.mv例如&#xff1a;类似window如下操作&#xff1a; 4.nano例…

LeetCode [简单]118. 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 public class Solution {public IList<IList<int>> Generate(int numRows) {List<IList<int>> res new …

【JavaEE初阶】 HTTP协议和使用Fiddler抓包

文章目录 &#x1f38d;HTTP协议是什么&#xff1f;&#x1f340;应用层协议&#xff08;HTTP&#xff09;存在的意义&#x1f384;HTTP 协议的工作过程&#x1f334;HTTP 协议格式&#x1f333;Fiddler抓包工具的使用&#x1f6a9;如何抓HTTPS的包&#xff1f; &#x1f38b;抓…

使用echars实现数据可视化

生活随笔 展翅飞翔之际 请下定决心不再回头 echars实现数据可视化 在搭建后台页面时&#xff0c;可能会遇到很多的表格&#xff0c;但有时表格所展现的数据并不能直观的体现出当前用户的宏观信息&#xff0c;所以就可以引入一个新的表格插件——echars 快速上手 - Handbook…

Python语言学习笔记之三(字符编码)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 什么是字符编码 计算机从本质上来说只认识二进制中的0和1&#xff0c;字符编码(Character Encoding) 是一种将…

代码随想录算法训练营第35天| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

JAVA代码编写 860.柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必须…

面向对象基础小结

面向对象基础小结 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同&#xff1a; 面向过程&#xff1a;是把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象&#xff1a;会先抽象出对象&#xff0c;然后用对象执行方法的方…

Deepin使用记录-deepin系统开启SSH服务

1、检查安装的deepin系统是否已经开启SSH功能。 $ ps -e | grep ssh $ ps -e | grep ssh 查看是否启动ssh 2、安装openssh-server服务 sudo apt-get install openssh-server 如果出现以上提示&#xff0c;就表示你已经安装了ssh服务&#xff0c;只是还没有启动。 3、安装完…

大模型fine-tune 微调

大模型的 Fine-tune 我们对技术的理解&#xff0c;要比技术本身更加重要。 正如我在《大模型时代的应用创新范式》一文中所说&#xff0c;大模型会成为AI时代的一项基础设施。 作为像水、电一样的基础设施&#xff0c;预训练大模型这样的艰巨任务&#xff0c;只会有少数技术…

关于Linux服务器高并发场景下系统参数优化的诸多奇技淫巧

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容开篇内存优化——马达与燃油磁盘优化——加油与换胎网络参数优化——挂挡与提速进程优化——适度开疆拓土 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Ja…

设二维数组a[1...m,1...n]()含有m*n个整数。写一个算法判断a中所有元素是否互不相同,并输出相关信息(yes/no)

设二维数组a[1…m&#xff0c;1…n]&#xff08;&#xff09;含有m*n个整数。 写一个算法判断a中所有元素是否互不相同&#xff0c;并输出相关信息&#xff08;yes/no) 分析其时间复杂度 代码思路&#xff1a; 这种如果纯暴力做的话时间复杂度非常高。 我这里考虑把题目中的二…

「Linux」git的安装与使用

&#x1f4bb;文章目录 &#x1f4c4;前言安装git的使用配置git初始化 git 仓库提交文件推送到远端使用HTPPS方式&#xff1a;SSH方式 &#x1f4d3;总结 &#x1f4c4;前言 git是一款多平台的版本管理器&#xff0c;用于对代码进行版本控制&#xff0c;如果你还不知如何安装gi…

虚幻学习笔记6—摄像机控制

一、前言 摄像机在虚幻中的应用是最常见的。如通常在游戏或应用中会常常出现需要切换不同视角的情况、摄像机拉近缩小等&#xff0c;这个在虚幻中是怎么实现的呢。 二、实现视点切换 2.1、提前设置场景的视点&#xff1a;如图2.1.1所示添加一个摄像机视点到关卡场景中&#x…

Java数据结构之优先级队列(PriorityQueue)

1、概念 队列&#xff1a;是一种FIFO&#xff08;First-In-First-Out&#xff09;先进先出的数据结构&#xff0c;对应于生活中的排队的场景&#xff0c; 排在前面的人总是先通过&#xff0c;依次进行。 优先队列&#xff1a;是特殊的队列&#xff0c;从“优先”一词&#xff…

计算机网络(超详解!) 第一节计算机网络的性能指标

1.速率 比特&#xff08;bit&#xff09;是计算机中数据量的单位&#xff0c;也是信息论中使用的信息量的单位。 比特&#xff08;bit&#xff09;来源于 binary digit&#xff0c;意思是一个“二进制数字”&#xff0c;因此一个比特就是二进制数字中的一个 1 或 0。 速率是…

游戏软件的设计方法

游戏软件的设计是一个综合性的过程&#xff0c;涉及到多个方面&#xff0c;包括游戏概念、用户体验、技术实现等。以下是一般的游戏软件设计方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 明确游…

第二十章(多线程)

一.线程的简介 Windows操作系统是多任务操作系统&#xff0c;它以进程为单位。一个进程是一个包含有自身地址的程序&#xff0c;每个独立执行的程序都称为进程。也就是说每个正在执行的程序都是一个进程。系统可以分配给每一个进程有一段有限的使用CPU的时间&#xff08;也可以…

解释LED显示屏的裸眼3D特效原理

LED电子大屏幕的3D特效技术正在不断发展&#xff0c;而实现这一技术的原理主要包括分光、分色、分时和光栅等四种方法。这些原理都有各自的特点和应用场景&#xff0c;下面将对它们进行详细介绍。 1. 分光方法 分光方法是一种基于偏振光的3D显示技术。通过使用偏振滤镜或偏振片…

RISC-V_WCH系列微控器软件体系云端快速架构

1 概述 RISC-V内核的微控器MCU&#xff0c;正在以更高的性价比&#xff0c;快速取代传统的各类ARM系列微控制处理器。 针对常用的芯成RISC-V内核的泌恒WCH系列微控器MCU&#xff0c;推出了&#xff1a;RISC-V_WCH系列微控器软件体系快速架构云平台。只要以身份证号码做用户名…