内存管理之虚拟内存

news2025/4/27 8:24:49

本篇遵循内存管理->地址空间->虚拟内存的顺序描述了内存管理、地址空间与虚拟内存见的递进关系,较为详细的介绍了作为在校大学生对于虚拟内存的理解。

内存管理

引入

  • RAM(内存)是计算机中非常重要的资源,由于造价的昂贵,我们家用的计算机一般是8/16G。对于如此紧俏的资源我们当然需要对它好好管理,尽力做到不浪费,高效压榨它的每一分资源。因此,我们需要内存管理。
  • 在计算机中,有着高达几TB的低速、廉价、持久化存储的磁盘,也有着GB单位的速度与价格适中的具有亦失性的内存,还有昂贵的高速缓存,CPU,种种硬件叠加在一起,形成分层存储器体系
  • 在操作系统中,管理分层存储器体系的部分称为存储管理器。接下来我们来介绍存储管理器。

存储管理器的两种抽象

最简单的存储器抽象

  • 最简单就是没有存储器抽象。对于无存储器抽象的情况这里不做过多讨论,一般在嵌入式像门卡这种设备才会出现这种情况,因为门卡这样的设备只需要执行预定好的程序,不会发生冲突,程序要做的事情都是预先确定好的。
  • 我们这里只要清楚一点,即无存储管理器抽象的计算机上,程序都是直接操作物理内存地址的。而暴露物理地址给进程会有如下几个问题:
    • 用户程序可能会破坏操作系统,访问了不该访问的区域,比如无意间修改了系统的数据导致系统出错。
    • 无法同时运行多个程序,一个程序运行可能会覆盖另外一个程序的代码或数据。

地址空间

地址空间的引入
  • 为了解决无存储器抽象带来的两个问题,我们引入地址空间这个存储器抽象的概念,我们的主题虚拟内存就和地址空间有关。
  • 首先,无存储器抽象的两个问题主要就是一个问题,即用户程序随意寻址进行操作!这个问题拆分成子问题就是:解决保护和重定位!
    • 这里引入A、B进程
    • A 进程要想防止 B 进程修改 A 的代码或数据,我们就需要对 A 所用到的内存地址进行保护,防止 B 程序修改 A所用到的地址上的内容。
    • 但同时我们的 B 进程之所以会去修改,是因为 B 进程有指令执行,可能B进程的目的不是修改A的某个用到的地址所填的内容或数据,而只是想要执行CPU指令,如果光光进行保护而不重定向,B这个指令就没法儿执行,所以还需要对 B 指令索引的地址进行重定向到别的位置,来实现 B 进程的指令。
  • 此时我们就可以提出地址空间的概念了:地址空间是一个进程可用于寻址内存的一套地址集合。它保证了每个进程都有自己独立的地址空间。
怎么做到每个进程都有自己独立的地址空间的
  • 答案就是我们今天的主题:虚拟内存

虚拟内存

阅读完前面的内容,对于虚拟内存的由来大致有了一个了解,接下来介绍虚拟内存的原理以及相关周边知识。

页、页表、页表项、页框

首先我们了解一下这四个概念


  • 每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一。每一页有连续的地址范围。一般在32为地址空间中是4KB。
  • 页框
    与虚拟地址相映射的实际的物理地址
  • 页表
    类似一个数组,保存了大量的页表项。用页号作为页表的索引
  • 页表项
    存储着进程所使用到的虚拟地址空间与实际物理地址的映射关系,同时还保存了该地址是否存在,权限是读、写还是执行,修改位等,都是使用比特位的方式进行标识。(为锻炼广大猿友的搜索能力,有兴趣的还请自行搜索了解页表项中的内容)
    在这里插入图片描述

虚拟内存与分页的基本思想

  • 虚拟内存的基本思想是:
    这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令(缺页中断)。
    什么意思呢?举个例子:
    • windows上的游戏3A大作,动辄上百个G的资源文件下下来,那么多的代码和数据资源,我们的电脑也就16G的内存,如果全部加载到内存中,依据我们电脑上显示的实际物理内存,游戏怎么可能跑的起来呢?有了虚拟内存,我们计算机只从磁盘加载部分当前和最近一部分时间会用到的数据到内存中,当需要磁盘中其他部分代码和数据时我们再动态的加载那部分代码和数据。我们打游戏时或处理使用一些大型软件时,电脑会发热,本质也就是因为硬件在不断的进行 IO 操作,摩擦生热。
      下面对提到的页进行一个介绍
  • 分页的基本思想
    • 如果没有虚拟内存,那么操作系统会将CPU会将指令直接传递到内存总线来获取物理地址。
      而使用了虚拟内存管理策略,OS将会把CPU指令所需的内存地址传输给另一个硬件设备(CPU的一部分):内存管理单元(Memory Management Unit->MMU)。MMU会将虚拟地址映射成物理内存地址,最后返还给CPU。
      来自现代操作系统3-8,3-9

具体是怎么做的呢?
- 虚拟地址一共两部分组成,虚拟页号(高位)以及偏移量(低位)。页号作为页表的索引,根据页号在页表中找到对应的页表项,通过页表项中存的页框号拼接到偏移量的高位以替代虚拟页号,MMU拿到该拼接而成的地址后,判断是否满足保护位的要求,即能不能写或读或执行,确认没有问题后将其通过地址总线送往内存,进行寻址找到对应数据进行读写操作。如果在页表项中没有找到对应的映射,则触发缺页中断
下面介绍缺页中断

缺页中断之页面置换

  • 首先,缺页中断指的就是在虚拟地址所对应的页表项中没有找到对应的物理地址映射时,称为缺页。
  • 此时CPU陷入内核态,OS找到一个已经存在映射关系的并且很少使用的页框,将其内容写回磁盘,内存中不再保留该页框存储的数据,随后将触发缺页中断的指令对应要进行的操作读到刚才找到的页框中,那么此时该页框就有了新的数据,该页表项中就写入了刚才找到的页框地址。新的映射关系就这样建立了。
  • 那么,页面置换就是上面讲到的内容,缺页中断中的一个策略,也是动态加载内存的关键。
  • 当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。如果要换出的页面在内存驻留期间已经被修改过,就必须把它写回磁盘以更新该页面在磁盘上的副本,如果该页面没有被修改过,那么它在磁盘上的副本已经是最新的,不需要回写。直接用调入的页面覆盖被淘汰的页面就可以了。

分页系统的两个问题

  1. 虚拟地址到物理地址的映射性能问题
  2. 页表太大的问题
性能问题

想要知道关于性能问题的原理可以自行看现代操作系统内存管理一章,这里只对解决方案进行介绍。

  • 要解决每次访问内存都要从虚拟地址映射的物理地址的速度问题,TLB(转换检测缓冲区/快表)问世。
  • 其实该技术就是基于程序届的二八原则,热点总是少数的,被经常访问的页面总是那么一小撮,绝大部分很少被用到,那么基于该原则,TLB被设计出来。
  • 其工作原理就是开一块儿小空间,加载少量页表项,将虚拟地址送到MMU,MMU先去TLB里找虚拟地址对应的页表项,如果找到了就直接通过内存总线传输物理地址去内存,没找到再去页表里找。
页表太大
  • 在32位的地址空间中,假设1个page=4kb,那么一共就会有2^32/4kb=100万个页,也即100万个页表项。通常一个页表项为4字节,那1个进程就需要1个G的内存来存页表,这有点不可思议,这里指的可是真是的物理内存需要1个G。
    所以,一级页表在现代计算机中是活不下去的。

  • 于是,产生出了多级页表,这里以2级页表为例

    • 32位地址空间,把它分成10位的1级页目录表项,10位页表项和12位偏移量
    • 在这里插入图片描述
  • 我们一级页表一共有1024个表项,对应10位的1级页表,2级页表每个也有1024个表项,对应PT2。

  • 当我们CPU发出指令需要某一块儿地址时,MMU来一级页表寻找,如果一级页表对应的虚拟地址没有映射二级页表,则触发缺页中断,加载对应的2级页表,然后再通过加载的2级页表找到对应的映射,继而执行CPU指令。

  • 所以从这里我们可以看出,多级页表有1个功能叫做动态加载,即我需要你的时候再加载这块空间的页表进来,而不用一次性维护上百万的页表项。

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

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

相关文章

前端对接阿里oss保姆级教程(第二章使用武器)

1.在前端项目下载ali-oss yarn add ali-oss 2.编写上传方法 const OSS require(ali-oss)const client new OSS({// 填写Bucket所在地域。我的杭州的,Region填写为oss-cn-hangzhou。region: oss-cn-hangzhou,//填写组件的密钥accessKeyId: ,accessKeySecret: ,/…

小试GraphQL

之前做的需求,基本都是REST风格,以github提供的api为例,比较二者差异。试用GraphQL,找寻其独到之处 REST REST[1] 一个URI代表一种资源 通过HTTP动词对资源进行操作 以创建一个仓库[2]为例 GET[3], PATCH[4]和 DELETE[5]类似 Gra…

〔023〕Stable Diffusion 之 界面主题 篇

✨ 目录 🎈 系统内置主题🎈 kitchen Theme 主题🎈 Catppuccin Theme 主题🎈 Cozy Nest 主题🎈 系统内置主题 可以通过命令行修改主题,在 webui-user.bat 文件中 set COMMANDLINE_ARGS 参数后面添加 --theme dark 来设置深色主题当然,系统设置里面也自带了很多的主题…

VS2015 设置工程目录不保存 .sdf或.db 文件、 Ipch 文件夹

VS2015 设置工程目录不保存 .sdf或.db 文件、 Ipch 文件夹 sdf或db文件、Ipch文件夹均较大,编译几次就可以达到几十兆。 为了便于工程保持,可以设置这些文件保存于工程之外,但又不影响工程的正常运行。 (PS:这些文件不…

家族小程序开发方案

家族小程序的开发需要考虑到家族成员之间的沟通和互动需求,以及家族文化传承和传承方式等因素。以下是一些开发家族小程序时需要考虑的方面: 家族文化传承:家族小程序需要考虑到家族文化传承的需求,包括家族历史、家族文化、家…

C++真的是 C加加

📝个人主页:夏目浅石. 📌博客专栏:C的故事 🏠学习社区:夏目友人帐. 文章目录 前言Ⅰ. 函数重载0x00 重载规则0x01 函数重载的原理名字修饰 Ⅱ. 引用0x00 引用的概念0x01 引用和指针区分0x03 引用的本质0x04…

【lesson8】冯诺依曼体系的介绍

文章目录 冯诺依曼体系是什么?为什么要有存储器?怎么实现数据传输的? 冯诺依曼体系是什么? 冯诺依曼体系是一种计算机体系结构,是现代计算机的基础被广泛应用。 如图所示: 输入设备:键盘&…

企业直播如何实现多画面多场景切换?

企业直播如何实现多画面多场景切换? 应用场景 主要应用于:企业的会议直播、小型会务直播、异地讲师培训授课,实现较低成本的导播台场景切换效果(阿酷TONY注,比不上硬件导播台,但整体还可以,能…

快手商品详情数据API接口【关键词搜索商品列表数据】APP端商品详情数据

快手商品API接口是快手电商平台为开发者提供的一组接口,允许开发者通过程序代码访问快手电商平台的商品数据,实现商品信息的获取等操作。以下是快手商品API接口的一些常用功能: 获取商品列表:通过该接口可以获取店铺或分类下的商…

安科瑞电流隔离传感器 BA穿孔交流电流变送器-安科瑞黄安南

一.产品原理和功能介绍 BA系列产品应用电磁感应原理,对电网中的交流电流进行实时测量,采用精密恒流技术和线性温度补偿技术,将其隔离变换为标准的直流信号输出 采用24伏或12伏安全电压供电,具有过载能力强、高精度、高隔离、高安…

Linux 手动卸载jdk

Linux 手动卸载jdk 1、先输入java -version 查看是否安装了jdk java -version2、如果安装了,检查下安装的路径 which java(查看JDK的安装路径) which java3、卸载 rm -rf JDK地址(卸载JDK) rm -rf /home/koneom/ja…

为什么现在的LLM都是Decoder only的架构?

LLM 是 “Large Language Model” 的简写,目前一般指百亿参数以上的语言模型, 主要面向文本生成任务。跟小尺度模型(10亿或以内量级)的“百花齐放”不同,目前LLM的一个现状是Decoder-only架构的研究居多,像…

RobotFrameWork环境搭建及使用

RF环境搭建 首先安装python并且配置python环境变量pip install robotframeworkpip install robotframework-ride 生产桌面快捷方式 不行换豆瓣源检查一下pip list RF类库和扩展库 标准库 按F5快捷键查询,可以看到rf自带的库不需要额外安装这些标准库在python的 …

ai智能写作软件哪个好-AI智能写作软件的类型标准

AI智能写作软件能做什么? 节省时间:手动撰写文章和内容可能会非常耗时,而AI智能写作软件可以帮助我们快速生成文字,节省大量时间和精力。 增加生产力:对于内容创作者、营销人员和企业来说,高效地生成文章…

【独家】电视盒子哪个牌子最好?老烧力荐目前性能最强的电视盒子

电视盒子是电视机的最佳拍档,仅需几百元就能让电视机升级换代,身边朋友在挑选电视盒子时不知道电视盒子哪个牌子最好会咨询我的意见,下面我将介绍发烧友们最爱的目前性能最强的电视盒子,如果你近期也想购入电视盒子,记…

sourcetree 配置 gitlab ssh及公钥私钥设置

参考链接:Mac sourcetree 配置 ssh 密钥 - 简书 1.打开sourcetree --新建--从URL克隆,复制你项目的ssh 链接添加进去,如果没有配置就会提示: 这是一个无效的源路径/URL 2.打开sourcetree的设置 3.账户--添加 4.如图输入&#xf…

poi判断excel单元格内容是否为日期

通过cell.getCellType()拿到单元格的数据类型,CellType是一个枚举类型详情如下,能够看到并没有日期类型的code,poi读取到的日期类型的单元格时会认为是NUMERIC类型,然后,poi提供了HSSFDateUtil.isCellDateFormatted(ce…

SEO方案尝试--Nuxtjs项目基础配置

Nuxtjs 最新版 Nuxt3 项目配置 安装nuxtjs 最新版 Nuxt3 参考官网安装安装插件安装ElementPlus页面怎么跳转,路由怎么实现 安装nuxtjs 最新版 Nuxt3 参考官网安装 安装插件 安装ElementPlus 安装 Element Plus 和图标库 # 首先,使用以下命令安装 Eleme…

运用贪心算法实现卡牌游戏-2023年全国青少年信息素养大赛Python复赛真题精选

[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第18讲。 全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设…

Leetcode 01-算法入门与数组-③数组排序

LeetCode 01-算法入门与数组-③数组排序 一. 冒泡排序 1. 冒泡排序算法思想 冒泡排序(Bubble Sort)基本思想: 经过多次迭代,通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面,值较大的元素…