【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.mzph.cn/news/695513.shtml

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

相关文章

第3.6章:StarRocks数据导入——DataX StarRocksWriter

一、Datax 1.1 DataX 3.0概述 DataX3.0是一个异构数据源离线同步工具,可以方便的对各种异构数据源进行高效的数据同步。 其github地址为: https://github.com/alibaba/DataX/blob/master/introduction.mdhttps://github.com/alibaba/DataX/blob/mast…

盘点那些世界名校计算机专业采用的教材

清华、北大、MIT、CMU、斯坦福的学霸们在新学期里要学什么?今天我们来盘点一下那些世界名校计算机专业采用的教材。 书单目录 1.《深入理解计算机系统》(原书第3版)2. 《算法导论》(原书第3版)3. 《计算机程序的构造和…

el-table增加/编辑打开el-dialog内嵌套el-form,解决编辑重置表单不成功等问题

需求:在做表格的增删改查,其中新增和编辑弹窗都是同一个弹窗,之后有个重置按钮,需要用户输入的时候可以重置清空等。本文章解决如下问题 1.就是在编辑数据回填后点击重置表单没有清空也没有报错 2.解决清空表单和表格数据相互影响…

C-MAPSS涡扇发动机仿真数据(PHM2008)

数据集介绍 在开始介绍数据集之前,先帮大家理清一下涡扇发动机的数据(NASA提供,本文中称为数据集A)和PHM2008竞赛数据(本文称为数据集B)的关系。之所以将数据集A和数据集B放在一篇文章中,是因为…

【论文解读】transformer小目标检测综述

目录 一、简要介绍 二、研究背景 三、用于小目标检测的transformer 3.1 Object Representation 3.2 Fast Attention for High-Resolution or Multi-Scale Feature Maps 3.3 Fully Transformer-Based Detectors 3.4 Architecture and Block Modifications 3.6 Improved …

MT8788|MTK8788安卓核心板参数_4G联发科MTK模块

MT8788核心板是一款功能强大的4G全网通安卓智能模块。该模块采用了联发科AIOT芯片平台,具有长达8年的生命周期。MT8788模块内置了12nm制程的八核处理器,包括4个Cortex A73和4个Coretex A53,主频最高可达2.0GHZ。标配内存为4GB64GB&#xff0c…

01 Linux简介

Linux背景 发展史 linux从哪来的?怎么发展的?得从UNIX说起 1968年,一些来自通用电气公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念1969-1970年&am…

智能运维服务指的是哪些?智能运维阶段有哪些

智能运维服务通常包含哪些关键组成部分?它们在IT管理中的作用和重要性?智能运维的发展可以分为哪些主要阶段?每个阶段的核心技术或实践有哪些,它们是如何推动运维工作向更高水平的自动化和智能化发展的? 智能运维服务…

Linux离线安装插件

当公司Linux环境无外网情况下,需要先下载好离线安装包,然后上传到服务器,进行安装。 这里介绍一个下载插件安装包的网站,可以搜索到lrzsz、lsof、telnet、unzip、zip等安装包 搜索到想要的插件安装包后,下载并上传到服…

Ubuntu20.04安装Carla0.9.15

文章目录 环境要求下载Carla解压Carla运行Carla测试官方用例创建python环境安装依赖包案例:生成车辆案例:测试自动驾驶 参考链接 环境要求 系统配置要求: 至少3G显存的GPU,推荐3060及以上的显卡进行Carla拟真。预留足够的硬盘空…

Tomcat线程池原理(上篇:初始化原理)

文章目录 前言正文一、从启动脚本开始分析二、ProtocolHandler 的启动原理三、AbstractEndPoint 的启动原理四、创建默认线程池五、参数配置原理5.1 常规的参数配置5.2 自定义线程池5.3 测试自定义线程 前言 在Java Web的开发过程中,Tomcat常用的web容器。SpringBo…

C#知识点-13(进程、多线程、使用Socket实现服务器与客户端通信)

进程 定义:每一个正在运行的应用程序,都是一个进程 进程不等于正在运行的应用程序。而是为应用程序的运行构建一个运行环境 Process[] pros Process.GetProcesses();//获取电脑中所有正在运行的进程//通过进程,直接打开文件//告诉进程&…

cmd命令开启windows桌面远程控制并设置防火墙允许远程

cmd命令开启桌面远程控制 1、开启之前: 2、使用管理员身份运行cmd 3、执行cmd命令 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlset\Control\Terminal server" /v fDenyTSConnections /t REG_DWORD /d 0 /f4、如果这台电脑的防火墙打开&#xff…

Android14 InputManager-InputManagerService环境的构造

IMS分为Java层与Native层两个部分,其启动过程是从Java部分的初始化开始,进而完成Native部分的初始化。 □创建新的IMS对象。 □调用IMS对象的start()函数完成启动 同其他系统服务一样,IMS在SystemServer中的ServerT…

股票K线认知从形态到逻辑,仓位管理与交易体系实战

一、教程描述 本套教程内容分为三个部分,1、基础篇:讲的都是干货基础,有些是书本上没有的,通过对基础知识的掌握,对技术形态会有更深的理解,比如集合竞价、K线指标、盘中看盘技巧等等。2、交易篇&#xff…

CentOS升级python

1、下载python39 https://mirrors.huaweicloud.com/python/3.9.0/Python-3.9.0.tgz2、拷贝到Linux环境(当然也可以直接在Linux环境使用wget直接下载) 先安装一下依赖,不然编译会有问题 sudo yum -y install zlib-devel bzip2-devel openssl…

【day02】每天三道 java后端面试题:Java、C++和Go的区别 | Redis的特点和应用场景 | 计算机网络七层模型

文章目录 1. Java、C和 Go 语言的区别,各自的优缺点?2. 什么是Redis?Redis 有哪些特点? Redis有哪些常见的应用场景?3. 简述计算机网络七层模型和各自的作用? 1. Java、C和 Go 语言的区别,各自的…

C#算法(12)—对图像像素做X/Y方向的偏移

我们在上位机开发领域有时候需要对获取的图像的像素做整体的偏移,比如所有像素在X方向上偏移几个像素,或者所有像素在Y方向上偏移几个像素,本文就是开发了像素整体偏移算法来解决这个问题。 比如有一个图像大小为3*3,像素值如下图1,如果我想实现将这个幅图像的像素整体往右…

Neon简介

欢迎关注“安全有理”微信公众号。 概述 本文介绍了 Arm Neon 技术,一种⾼级 SIMD(Single Instruction Multiple Data,一条指令操作多个数据)架构扩展,Armv8‑A 和 Armv8-R 架构支持了 Neon 技术扩展。 Neon 技术是指…

探索海洋世界,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建海洋场景下海洋生物检测识别分析系统

前面的博文中,开发实践过海底相关生物检测识别的项目,对于海洋场景下的海洋生物检测则很少有所涉及,这里本文的主要目的就是想要开发构建基于YOLOv7不同系列参数模型的海洋场景下的海洋生物检测识别系统。 前文已有相关实践,感兴…