【Linux】再谈进程地址空间

目录

一、引入

二、物理内存和外设空间的交互

三、解决页表过大问题


一、引入

我们在往期的博客中有讲解过进程地址空间:【Linux】进程地址空间

但是在上述博客中我们只是对进程地址空间的左边部分详细进行了讲解,下面我们就来谈谈右边的部分:

我们以32位平台为例:虚拟地址空间中的每一个地址依次为 [ 0 , 2^32 − 1 ]即 0x00000000 - 0xFFFFFFFF,每一个单位地址有1字节的空间,总共也就是我们常说的4GB虚拟内存空间

但是我们来思考一个问题假如极端情况下:每个单位虚拟地址空间都对应着物理内存中的一个空间,那页表中岂不是有2^32个对应映射?假设页表中每个虚拟地址单位都会至少占有4字节的映射关系,那页表的大小岂不是成了12GB?这显然是不合理的

下面我们来一步步深入,看看是如何解决这个问题的:

二、物理内存和外设空间的交互

数据要从磁盘中进入到CPU中就必须意味着物理内存要和外设空间的数据进行交互(我们将这个过程成为IO),具体交互的设计我们在之前的博客中说到过:【Linux】文件系统,这里不再赘述 

既然在磁盘中是以4KB(可以就行调整)为单位存储的,所以在Linux下为了提高IO效率,每次内存和外设交互都以块为交互单位,所以不管我们具体需要多少大小的数据,都是以4KB为大小进行交换的

这就注定了物理内存中是要对应每次IO的大小为单位来存储数据的;即便物理内存中寻址是以字节为单位,但并不代表按一个个字节为单位来存储;我们将内存中存储数据一个个单位叫做页框,将磁盘中存储数据一个个单位叫做页帧:

OS为了管理这些物理内存中的页,会构建一个结构体数组,该数组内中的每个结构体中属性非常少,主要是为了记录该页是否有被使用:

struct page
{int status;//属性非常少
};struct page mem[1048576];//使用数组来管理(1048576是一块4GB内存所需的数组大小)

那我们会难免有一个疑问:为什么要每次都要以4KB块大小来加载数据,仅仅是因为文件系统的存在吗?

💡并不是仅仅由文件系统所决定的,其中真正在于局部性原理,当系统一次将4KB的空间加载到内存中,即便我们要使用的资源没有这么多,但是在代码向下运行时,要访问的数据很可能在上次访问数据空间的附近,如此一来该空间很可能已经被OS加载到内存中了,这时就不需要再IO,提高了系统的运行效率

所以一次多加载进来的数据被称为:数据的预加载

三、解决页表过大问题

为了解决页面会占据很大空间的问题,设计者在设计页表时并不是将进程地址空间的32位的数据直接映射到页表上面的,而是将32位比特位的数据从前往后划分为10/10/12位来建立映射的:

先用进程地址空间的前10位比特位找到页目录中对于映射的二级页表位置,再在对应的二级页表中找到进程地址空间的11-20位比特位对应的物理空间地址(该物理地址一定指向某一个物理页框的起始地址),最后将对应的物理地址加上进程地址空间的最后12位比特位就可以找到指定的字节位置进行访问了(基地址+偏移量):

现在我们来计算一下即便所有的虚拟地址都有对应的映射地址,页表最多会占据多少空间呢?

💡前20位比特位最多生成2^20种组合,假设每个页表会占据4字节的空间,最多也就是2^20*4=4MB的空间,而且在进程运行时并不会加载所有的数据到内存中,而是加载所需要的数据,如此一来页表占据的总空间大小要比4MB小很多

下面来解释一下页框的大小为什么是4KB:

我们可以看到进程地址空间最后12位比特位是用来表示偏移量的,也就是最多可以指向起始位置后2^12字节的空间,也就是4KB的大小,所以无论是OS对于进程地址空间的设计、还是文件系统的设计都是有精密的联系的,我们并不能将其拆开看~

四、缺页中断

缺页中断(Page Fault)指的是一个进程试图访问的页面(页)在当前的物理内存中不存在,需要从磁盘或其他外部存储器中加载到内存中的操作。这种情况通常发生在虚拟内存系统中,当一个进程需要访问的页面不在主存中时,就会发生缺页中断

当发生缺页中断时,操作系统会进行一系列的处理:

  1. 中断处理程序:操作系统会捕获缺页中断,并调用特定的中断处理程序。

  2. 页面调度:操作系统会根据特定的算法决定从磁盘或其他外部存储器中选择哪些页面加载到内存中。

  3. I/O操作:如果所需页面在磁盘或其他外部存储器上,操作系统会发起相应的I/O操作,将页面加载到主存中。

  4. 页面映射:加载完成后,操作系统会更新页表,将页面映射到合适的虚拟地址空间。

  5. 重启进程:一旦所需页面已加载到内存中,操作系统会重新执行被中断的指令。

缺页中断是虚拟内存系统中的一种常见情况,通过将主存和辅存(如磁盘)结合使用,可以扩展可用的地址空间和提高系统性能

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

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

相关文章

【Effective Objective - C】—— 系统框架

【Effective Objective - C】—— 系统框架 47.熟悉系统框架CoreFoundation框架其他框架要点 48. 多用块枚举,少用for循环for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式要点 49.对自定义其内存管理语义的collection使用无缝桥接要点 50.构…

【数据结构】_队列

目录 1.概念 2.队列的使用 3.队列模拟实现 4.循环队列 5.双端队列 6.栈与队列的互相实现 6.1 用队列实现栈 6.2 用栈实现队列 1.概念 (1)队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表; &am…

Javascript中var和let之间的区别

文章目录 一.变量提升(声)二.let和var的区别 区别: 1、var有变量提升,而let没有; 2、let不允许在相同的作用域下重复声明,而var允许; 3、let没有暂时性死区问题; 4、let创建的全局变量没有给window设置对应…

uniapp微信小程序-项目实战修改密码

图标是使用uview里面的图标&#xff0c;icfont也可以 以下是所有代码 <template><view><!-- 密码三个 --><view class"password" v-for"(item,index) in userList"><view class"contentuser"><view class&qu…

U盘出现问题的解决回顾-包括重要数据保留-格式化-取消写保护?

你好&#xff0c;这是一个老u盘的修复过程记录&#xff0c;如果有帮助就最好了。 问题 老u盘几周前还用过&#xff0c;但是昨天一插突然就坏了。 问题截图如下&#xff1a; 开始定位错误 好吧其实第一反应是拔掉u盘重新插&#xff0c;不行&#xff0c;然后重启电脑试试&#…

jmeter下载base64加密版pdf文件

一、何为base64加密版pdf文件 如下图所示&#xff0c;接口jmeter执行后&#xff0c;返回一串包含大小写英文字母、数字、、/、的长字符串&#xff0c;直接另存为pdf文件后&#xff0c;文件有大小&#xff0c;但是打不开&#xff1b;另存为doc文件后&#xff0c;打开可以看到和…

【Java从入门到精通】Java条件语句

Java 条件语句 if...else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法如下&#xff1a; if(布尔表达式) {//如果布尔表达式为true将执行的语句 } 如果布尔表达式的值为 true&…

【虚拟仿真】Unity3D中实现3DUI,并且实现Button、InputField、Toggle等事件绑定

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近在项目中需要用到3DUI的展示,之前一般会用TextMeshPro进行展示: 但是,后面又需要添加按钮、Toggle等…

el-table同时固定左列和右列时,出现错误情况

最近遇到一个问题,就是需求是要求表格同时固定序号列和操作列,我们用的是饿了么组件库的el-table,如下图,出现了错误情况: 解决方法就是使用doLayout方法: 如果使用了keep-alive,可以在activated里执行doLayout方法: activated() {this.$nextTick(() => {this.$ref…

小程序端学习

P2 创建Uni-app 分离窗口 一样的Ctrl S P3 细节知识点 创建新的小程序页面

计算机网络Day03--物理层

信道复用技术 频分复用 时分复用 统计时分复用 频分复用&#xff08;FDM&#xff09; 最基本 将整个宽带分为多份&#xff0c;用户在分配到一定的频带后&#xff0c;在通信过程中自始至终都使用这个频带 所有的用户在同一时间占用不同的带宽资源&#xff0c;以并行的方式工…

掌握BeautifulSoup4:爬虫解析器的基础与实战【第91篇—BeautifulSoup4】

掌握BeautifulSoup4&#xff1a;爬虫解析器的基础与实战 网络上的信息浩如烟海&#xff0c;而爬虫技术正是帮助我们从中获取有用信息的重要工具。在爬虫过程中&#xff0c;解析HTML页面是一个关键步骤&#xff0c;而BeautifulSoup4正是一款功能强大的解析器&#xff0c;能够轻…