【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://xiahunao.cn/news/2799758.html

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

相关文章

git版本回退在eclipse和命令中的操作

一.背景 老程序员了,熟悉eclipsesvn,git用的不溜。近几年用了git,偶尔修改了某个文件希望放弃本次修改重新恢复到最新版本重新修改。或者回退到某个版本,再修改。记录一下Eclipse中的操作,和命令操作的情况。 二.Ecli…

操作系统导论-课后作业-ch19

1. 本书在第6章中有过介绍,gettimeofday函数最多精确到us,并且大致精确(并不完全精确),需要多迭代几次减少误差,循环次数太多也会导致结束时间小于开始时间(即回滚)的现象&#xff…

每日shell脚本之超级整合程序3.0

每日shell脚本之超级整合程序3.0 本期带来之前的升级版2.0整合脚本程序,学习工作小利器,同时模块化构建方便二次开发。 上图 上源码 #!/usr/bin/bash # *******************************************# # * CDDN : M乔木 # # * qq邮箱 …

社区分享|中华保险基于MeterSphere开展接口自动化测试

中华联合保险集团股份有限公司(以下简称为“中华保险”)始创于1986年,是全国唯一一家以“中华”冠名的国有控股保险公司。截至2022年12月底,中华保险总资产为1006.06亿元,在全国拥有超过2900个营业网点,员工…

06 分频器设计

分频器简介 实现分频一般有两种方法,一种方法是直接使用 PLL 进行分频,比如在 FPGA 或者 ASIC 设计中,都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性,无法得到频率很低的时钟信号,比如输入 …

Windows安装PHP及在VScode中配置插件,使用PHP输出HelloWorld

安装PHP PHP官网下载地址(8.3版本):PHP For Windows:二进制文件和源代码发布 点击下载.zip格式压缩包: 历史版本在Old archives中下载。推荐在Documentation download中下载官方文档,方便学习。 下载完成后在一个顺眼的地方解压压…

Point.java

Point.java 让我们来找茬,(⊙o⊙)看看哪里不一样咯!!! package algorithm_graphics_2;/** Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject t…

Zabbix 6.2.1 安装

目录 1、监控介绍 监控的重要性 网站的可用性 监控范畴 如何监控 2、Zabbix 介绍 zabbix 简介 zabbix 主要功能 zabbix 监控范畴 Zabbix 监控组件 zabbix 常见进程 zabbix agentd 工作模式 zabbix 环境监控中概念 3、搭建LNMP 拓扑规划 安装MySQL 安装 Nginx …

【视频编解码】M-JPEG压缩、H.264压缩 对比

简介 参考这篇文章:https://blog.csdn.net/qq_41248872/article/details/83590337 写的比较好,这里就不赘述了。 我们在视频传输的时候,需要压缩,常见的压缩包括: jpeg 压缩h264 压缩 当然使用最多的还是 264, 毕竟他的压缩比…

【Flink经济】Flink 内存管理

面临的问题 目前, 大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的,例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 语言的好处在于程序员不需要太关注底层内存资源的管理,但同样会面临一个问题&…

【快速搞定Webpack5】修改输出文件目录及自动清理上次打包文件(五)

介绍 默认情况下webpack打包后,我们的图片和js等文件都会被打包到dist目录下,文件多了混淆在一起一方面不利于文件的查找和管理,另外一方面看上去也不美观。 所以今天我们学习的内容就是控制输出后的文件进入不同的目录。 一、配置 新增4…

小米标准模组+MCU 快速上手开发(二)——之模组串口调试

小米标准模组MCU 开发笔记之固件调试 背景技术名词简介● 小米IoT开发者平台● 小米IoT 模组● 固件● OTA● CRC32 固件双串口调试● MHCWB6S-IB 模组资料下载● MHCWB6S-IB 模组管脚图● 上电调试 背景 小米标准模组MCU的开发过程中,由于部分官方资料较为古早&am…

压缩感知常用的重建算法

重建算法的基本概念 在压缩感知(Compressed Sensing, CS)框架中,重建算法是指将从原始信号中以低于奈奎斯特率采集得到的压缩测量值恢复成完整信号的数学和计算过程。由于信号在采集过程中被压缩,因此重建算法的目标是找到最符合…

MATLAB 导出可编辑的eps格式图像

任务描述:部分期刊要求提交可编辑的eps格式图像,方便美工编辑对图像进行美化 我试了直接print或者在figure窗口导出,发现导出的文件放到Adobe AI中并不能编辑,经Google找到解决办法: %EPS exportgraphics(gcf,myVect…

微信小程序 ---- 慕尚花坊 项目初始化

目录 项目介绍 01. 项目概述 02. 项目演示 03. 项目技术栈 04. 接口文档 申请开发权限 项目初始化 01. 创建项目与项目初始化 02. 自定义构建 npm 集成Sass 03. 集成项目页面文件 04. VsCode 开发小程序项目 项目介绍 01. 项目概述 [慕尚花坊] 是一款 同城鲜花订购…

js设计模式:依赖注入模式

作用: 在对象外部完成两个对象的注入绑定等操作 这样可以将代码解耦,方便维护和扩展 vue中使用use注册其他插件就是在外部创建依赖关系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…

【C++初阶】类和对象(中)

目录 一.类的6个默认成员函数 1.知识引入 ​编辑 2.构造函数 (1)概念 (2)语法特性 (3)特征 ①问题引入1 ②问题引入2 (缺少默认构造函数) 3.析构函数 (1)概念 (2)特性 4.拷贝构造函数 (1)概念 (2)特征 ①拷贝构造函数是构造函数的一…

pclpy SOR去除异常值(统计滤波)

pclpy SOR去除异常值-统计滤波 一、算法原理1.背景2.原理 二、代码三、结果1.原点云2.sor处理后的点云(内点)3.sor处理后的点云(外点) 四、相关数据 一、算法原理 1.背景 激光扫描通常会生成不同点密度的点云数据集。此外&#…

【OpenSSH+Jenkins搭建项目自动化部署】

OpenSSHJenkins搭建项目自动化部署 一、Windows安装OpenSSH1.下载2.解压3.安装4.启停服务5.SSH免密登录 二、Jenkins安装1.下载2.安装启动3.登录 三、项目自动化部署1.SSH配置2.项目配置3.权限控制 一、Windows安装OpenSSH 1.下载 https://github.com/PowerShell/Win32-0penS…

常见的排序算法整理

1.冒泡排序 1.1 冒泡排序普通版 每次冒泡过程都是从数列的第一个元素开始,然后依次和剩余的元素进行比较,若小于相邻元素,则交换两者位置,同时将较大元素作为下一个比较的基准元素,继续将该元素与其相邻的元素进行比…