【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. 重启进程:一旦所需页面已加载到内存中,操作系统会重新执行被中断的指令。

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

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

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

相关文章

支付功能设计及实现思路

支付功能设计 主要包括:订单表,订单日志表,订单队列,定时任务。 主要考虑:事务性、幂等性、安全性。 表结构设计 订单表: 订单表,最主要的就是订单号、支付状态。 CREATE TABLE t_order (…

十大基础排序算法

排序算法分类 排序:将一组对象按照某种逻辑顺序重新排列的过程。 按照待排序数据的规模分为: 内部排序:数据量不大,全部存在内存中;外部排序:数据量很大,无法一次性全部存在内存中,…

Backtrader 文档学习- 整体架构功能分析理解

Backtrader 文档学习- 架构功能分析理解 1. 概述 backtrader是一个用于开发和执行交易策略的Python框架。它提供了一套完整的工具和功能,使得用户可以方便地进行策略回测、实盘交易以及数据分析。 backtrader的入口为Cerebro类,该类将所有输入(Data F…

基于Jenkins实现的CI/CD方案

基于Jenkins实现的CI/CD方案 前言 最近基于Jenkins的基座,搭建了一套适用于我们项目小组的持续集成环境。现在把流程整理分享出来,希望可以给大家提供一些帮助和思路。 使用到的组件和版本 组件名称组件版本作用Harbor2.7.3镜像仓库Jenkins2.319.2持…

C++ Primer 笔记(总结,摘要,概括)——第5章 语句

目录 5.1 简单语句 5.2 语句作用域 5.3 条件语句 5.3.1 if语句 5.3.2 switch语句 5.4 迭代语句 5.4.1 while语句 5.4.2 传统的for语句 5.4.3 范围for语句 5.4.4 do while语句 5.5 跳转语句 5.5.1 break语句 5.5.2 continue语句 5.5.3 goto语句 5.6 try语句块和异常处理 5…

http和https的区别(简述)

HTTP(HyperText Transfer Protocol)和HTTPS(HTTP Secure)都是用于在客户端和服务器之间传输数据的协议,但它们在安全性方面有重要的区别。 1.HTTP: 概述: HTTP是一种用于传输超文本的协议(超文…

前端基础自学整理|DOM树

DOM,文档对象模型(Document Object Model),简单的说,DOM是一种理念,一种思想,一个与系统平台和编程语言无关的接口,一种方法, 使 Web开发人员可以访问HTML元素!不是具体方…

D6208——双向马达驱动电路芯片,噪声低 内设马达驱动功率晶体管,工作电源电压范围宽用 TTL 逻辑信号直接控制

D6208 是一块单片双向马达驱动电路,它使用TTL电平的逻辑信号就能控制卡式录音机和其它电子设备中的双向马达。该电路由一个逻辑部分和一个功率输出部分组成。逻辑部分控制马达正、反转向及制动,功率输出部分根据逻辑控制能提供100mA(典型值&a…

【python】 脚本检查文本里是否包含特殊字符

【python】 脚本检查文本里是否包含特殊字符 完整代码: # 代码片段功能: 检查文本里是否包含特殊字符 # 将utf-8格式文本,先转为16进制格式 # 检查完成,再将16进制格式转为utf-8格式。 import re# 包含特殊字符的字符串 sample "I arg…

当别人在用AI一分钟画几十张图,你还在埋头苦苦设计?AI时代一定要学会和AI共存!

AI绘画即指人工智能绘画,是一种计算机生成绘画的方式。是AIGC应用领域内的一大分支。 AI绘画主要分为两个部分,一个是对图像的分析与判断,即“学习”,一个是对图像的处理和还原,即“输出”。 人工智能通过对数以万计…

数据分析(二)自动生成分析报告

1. 报告生成思路概述 怎么快速一份简单的数据分析报告,注意这个报告的特点: --网页版,可以支持在线观看或者分享HTML文件 --标题,动图,原始数据应有尽有 --支持交互,比如plotly交互画面,数据…

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

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

net反射

1.1 查找dll文件 Load需要把dll放到程序当前路径加载,也可以读取字符串形式。LoadFrom需要写全路径,如果test1.dll引用了test2.dll,同时也会加载test2.dll进来。LoadFile不会加载test2.dll。 Assembly assembly1 Assembly.Load("DllTe…

互联网加竞赛 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据疫…

Open AI — Sora 如何发挥其魔力 — 近距离观察该技术

OpenAI 的大模型 Sora 可以制作一整分钟的高质量视频。他们的工作成果表明,使视频生成模型更大是为现实世界创建多功能模拟器的好方法。Sora 是一种灵活的可视化数据模型。它可以创建不同长度、形状和大小的视频和图片,甚至可以创建长达一分钟的高清视频。我阅读了 OpenAI 的…

[C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强

【算法介绍】 提升夜间雾霾图像可见度的技术研究:引导APSF与梯度自适应卷积的应用 随着城市化的快速发展,雾霾现象日益严重,尤其是在夜间,雾霾对图像的可见度造成了极大的影响。因此,提升夜间雾霾图像的可见度成为了…

ElasticSearch聚合操作

目录 ElasticSearch聚合操作 基本语法 聚合的分类 后续示例数据 Metric Aggregation Bucket Aggregation ES聚合分析不精准原因分析 提高聚合精确度 ElasticSearch聚合操作 Elasticsearch除搜索以外,提供了针对ES 数据进行统计分析的功能。聚合(aggregation…

一文彻底搞懂JVM垃圾回收算法

文章目录 1. 标记-清除算法(Mark and Sweep)2. 复制算法(Copying)3. 标记-整理算法(Mark and Compact)4. 分代算法(Generational)4.1 执行流程 1. 标记-清除算法(Mark an…

《雾锁王国》超简单0成本自建个人专属16人联机服务器教程

阿里云雾锁王国服务器搭建教程是基于计算巢服务,3分钟即可成功创建Enshrouded游戏服务器,阿里云8核32G雾锁王国专用游戏服务器90元1个月、271元3个月,阿里云服务器网aliyunfuwuqi.com亲自整理雾锁王国服务器详细搭建教程: 一、前…

「实战应用」如何使用图表控件LightningChart创建数据采集系统?(一)

LightningChart.NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科学…