《深入理解计算机系统》学习笔记 —— 虚拟内存详解

news2024/11/20 4:27:58

文章目录

    • 虚拟内存
      • 物理内存、物理地址、虚拟地址
      • 虚拟地址空间
      • 虚拟内存
      • 缓存
      • 页表
        • 分配页面
        • 页命中
        • 缺页
      • 虚拟内存的好处
        • 简化链接
        • mmap
      • 虚拟内存的私有性
      • 地址翻译
        • 我们先看一下使用页表进行地址翻译有哪些东西:
        • 虚拟地址到物理地址处理过程
        • 页面大小和虚拟地址物理地址关系
      • TLB翻译后备缓冲器
      • 多级页表

虚拟内存

虚拟内存是一种主存的抽象概念
他为每个进程提供了一个大的,一致的,私有的地址空间。
三个重要能力:

  1. 更高效的使用主存。
  2. 为每个进程提供了一个一致的私有空间,简化内存管理。
  3. 保护进程的地址空间不被其他进程破坏。

物理内存、物理地址、虚拟地址

物理内存被组织成一个由M个连续字节大小的单元组成的数组。
在这里插入图片描述
每个字节都有一个唯一的物理地址,用来定位这个字节的数据叫做PA。
CPU访问内存最自然的方式就是使用PA,这种方式我们叫做物理寻址。
比如上图CPU通过PA然后定位到主存中某个字节然后读取4字节的数据,放到CPU的寄存器中。

早期的PC都是使用物理寻址,现在一些嵌入式微控制器也使用这种方式。
现代处理器则使用虚拟寻址方式。
在这里插入图片描述
CPU通过生成的虚拟地址,然后将该虚拟地址通过MMU地址翻译系统翻译成PA,通过PA来定位主存中位置获取数据。

虚拟地址空间

有了虚拟地址,我们再介绍一下地址空间。
地址空间就是一块非负整数地址的有序集合。

比如在一个带虚拟内存的系统中,CPU从一个有2^N个的地址空间中生成虚拟地址。这块空间我们叫虚拟地址空间VAS。比如有2的32次方个地址的虚拟空间,我们叫32位地址空间,这个空间可以存放2的32次方个虚拟地址,每个地址表示一个byte,那么32位地址空间就能表示4G大小的内存空间。 64位的地址空间能表示的内存大小为16EB,这个空间是非常大的。

所以主存中的每个字节都有一个选自虚拟地址空间的VA和一个选自物理地址空间的PA。

虚拟内存

那么我们为何不直接使用PA,而是使用VA,还要做个翻译来获取数据呢。因为我们要使用虚拟内存。
虚拟内存是如何体现的呢?他被组织为一个由存放再磁盘上的N个连续的字节大小的单元组成的数组。注意他在磁盘上,而不是在主存中。磁盘上的内容一部分被缓存在主存中。
磁盘上和主存之间以一个块作为传输单元,这个块在磁盘上称为虚拟页,虚拟页大小为2的N次方个字节,一般是4K。主存页需要被分割成同样大小的块,这个块叫物理页或页帧,大小和虚拟页相同,一般也是4K。

虚拟内存在任意时刻都有三部分,每部分都由很多个虚拟页组成:

  1. 未分配的:没有在磁盘上分配空间的页。
  2. 未缓存的:已在磁盘上分配空间,但是没有在主存上缓存对应的页。
  3. 已分配的:已在主存中缓存的页。
    在这里插入图片描述
    可以看到虽然虚拟内存在磁盘上是一整块空间,但是实际上映射到主存上的页可以是不连续的并且相隔可能很远。比如一个程序我们给他虚拟内存了,那么他可能在物理内存中占用非常小,极大减少主存的消耗。

缓存

SRAM表示CPU和主存之间的L1,L2,L3高速缓存。
DRAM表示虚拟内存系统的缓存也就是主存,他在主存中缓存虚拟页。
DRAM比SRAM慢10倍,而磁盘比DRAM慢100000倍。因此DRAM中的缓存不命中要比SRAM缓存不命中对系统影响更大。因为不命中处罚很大,所以虚拟页往往较大4K~2M。而且DRAM使用了更复杂精密的替换此算法。

页表

系统需要判定虚拟页存放在DRAM(主存)中的哪个物理页上,如果缓存中没有需要的页,也就是不命中,那么我们还需要知道该虚拟页在磁盘中的位置,取出来并替换掉当前缓存中的一个页。
这些功能是软硬件联合提供的,包括操作系统,MMU和一个存放在主存中的一个叫做页表的数据结构。
页表的作用就是:将虚拟页映射到物理页。
每次地址翻译硬件将一个虚拟地址转换成物理地址的时候,都需要去读取页表来查找。OS负责维护页表。
页表是由页表条目组成的数组。其中每个页表条目叫做PTE(page table entry)。
PTE由两部分组成

  1. 有效位,表示改虚拟页是否被缓存在主存中
  2. 地址位置,如果有效位表示在主存中,则存储的就是物理地址(注意这里存储的是该物理页的起始地址),如果不在主存中,则存储的是磁盘中的地址。如果是NULL则表示未在磁盘中分配空间。
    在这里插入图片描述
    如上图所示,如果磁盘中有8个虚拟页,则对应的页表有8个PTE,其中有4个缓存在主存中,所以有4个PTE的地址存储的是主存的物理地址,其中两个并未分配存储null,两外两个存储的是磁盘中的虚拟页地址。

如果我们的虚拟地址空间为32位,也就是可以表示4G的虚拟内存,把这个4G内存分为很多个页,假设每个页大小为4K,那么就会分成1M个页,那么我们使用页表所需要的PTE数量也就需要是1M个。

分配页面

当我们使用malloc分配空间时,实际上会在磁盘上创建空间,比如一个页4K。此时会在页表上新建一个PTE映射该VP,但是实际上还没有缓存在DRAM上。

页命中

当CPU要读取虚拟内存中的一个字节的数据时,如果页命中,说明VP缓存在DRAM中,CPU拿到虚拟地址,通过MMU转换器得到定位页表中某个PTE的位置,然后通过获取PTE中的数据得到VP是在DRAM中,然后就可以得到该物理地址指向的页帧。
在这里插入图片描述

缺页

如果CPU要访问的数据,这个虚拟页不在DRAM中,那么叫做缺页。

  1. 此时通过虚拟地址定位到页表中的某个PTE,发现此VP的数据并不在DRAM中,比如VP3,此时触发缺页异常。
  2. 通过缺页异常,OS会调用一个异常处理程序来处理,该程序会使用替换算法,比如要牺牲某个页比如VP4,这个页之前被修改过,那么需要先将该页拷贝到磁盘中。
  3. 然后将VP3从磁盘中拷贝到DRAM,并修改页表的该PTE项。
  4. 此时缺页异常程序重启刚才的指令,CPU再次使用虚拟地址定位PTE,发现该PTE在DRAM中,那么就可以取出来使用,也就是页命中。

上面替换页的过程叫做页面调度或者叫做页交换。

虚拟内存的好处

操作系统为每个进程都提供了一个独立页表,也就是一个独立的虚拟地址空间。并且多个VP可以同时映射到一个PP。
在这里插入图片描述

简化链接

每个进程都可以使用相同的存储基本格式。而不需要管数据实际存储在主存中的哪里。
在这里插入图片描述

在这里插入图片描述
共享代码区,比如每个C程序都要调用printf函数,那么不同程序可以使用共享代码和数据。操作系统通过将不同程序虚拟页面都映射到相同物理页面来共享这些代码,而不是在每个进程中都使用单独的一份存储在主存。

mmap

虚拟内存并不总是存在到磁盘上,我们也可以将他映射到一个文件或者另一个存储位置中,这个过程就叫做mmap,memory mapping。

虚拟内存的私有性

操作系统提供手段控制内存系统访问。

  1. 不允许用户进程修改只读代码段
  2. 不允许读或修改任何内核中代码和数据
  3. 不允许他读或写其他进程私有内存
  4. 不允许修改其他进程共享内存页,除非有显示允许。

所以PTE上不只有标识是否缓存到物理内存,而且还带额外的许可位来控制队一个虚拟页面内容的访问。
在这里插入图片描述
比如这几个许可位,sup表示进程是否必须运行在内核态才能访问该页,no表示程序可以访问,READ和Write就是读写访问权限。
比如进程i,在用户模式下可以读VP0和读写VP1,但是无VP2的访问权限。

如果一条指令违反了许可条件,比如这个指令要进程i去读VP2,但是读VP2是不被允许的,那么CPU就会触发一个保护,产生异常,Linux一般将这种异常报告为段错误。也就是程序访问的虚拟地址有问题,这个地址实际上是不允许被访问的。

地址翻译

形式上来说:地址翻译就是虚拟地址空间VAS中的元素和物理地址空间PAS中元素的映射。
也就是通过虚拟地址找到物理地址。

我们先看一下使用页表进行地址翻译有哪些东西:

  1. n位虚拟地址包含两个部分:p位虚拟页面偏移VPO和n-p位的虚拟页号VPN
  2. 页表基址寄存器指向当前页表
  3. MMU利用VPN虚拟页号来选择页表中的PTE
  4. 将PTE中保存的物理页号PPN和VPO串联起来就可以计算得到物理地址。
  5. m位的物理地址也包含两部分类似于虚拟地址,PPO和PPN。这里的PPO和VPO实际上是完全相同的。
    在这里插入图片描述

虚拟地址到物理地址处理过程

  1. 处理器生成VA,并传送给MMU
  2. MMU找到该页表并找到PTE的地址PTEA,向高速缓存请求这个PTE(主存只接收地址并返回数据
  3. 主存将PTE返回给MMU。
  4. MMU通过PTE构造物理地址PA并向主存请求数据。
  5. 主存返回数据给CPU
    在这里插入图片描述
    如果页面不命中,那么我们看处理步骤:
    3. 1~3步和上面处理相同
    4. MMU拿到的PTE发现这个数据并不在主存中,这是MMU触发一次异常传递给异常处理程序
    5. 异常处理程序会确定牺牲页并把它换给磁盘中
    6. 从磁盘中拿到新页也就是要查找的页拷贝给主存,并更新主存中的PTE
    7. 缺页处理程序完成,回到原进程再次执行VA查找指令,重复上面过程。
    所以可以发现如果不命中,整个系统的耗时要增加很多。

页面大小和虚拟地址物理地址关系

如果我们有一个n=32位的VA和一个m=24的PA,那么我们如何设定VPO及PPO呢?
如果页面大小为4K:那么意味着对于VPO我们需要12位,也就是2的12次方个数,才能确定4K页面的每一个byte的数据,那么PPO也是12位。所以对于VA,VPN的位数就位20位,PPN的位数九尾12位。
如果页面大小位8K:那么VPO和PPO我们就需要13位,VPN就19位,PPN就剩11位。

TLB翻译后备缓冲器

我们通过上面两种虚拟地址到物理地址转换的过程,发现,如果是每次MMU都要从主存中去请求PTE,而CPU和主存之间的速度差是很大的。所以这个速度将被拖慢。
所以我们加入一个机制叫做TLB,他的作用就是缓存PTE数据,TLB是用SRAM来存储的,来加快地址翻译。
下面我们看加入TLB的流程:

  1. 处理器生成VA
  2. MMU通过VPN去TLB中查到PTE。VA中的VPN部分就是保存TLB索引的。
  3. 从TLB获取到PTE
  4. 直接翻译成PA然后从主存中取出数据.
    在这里插入图片描述

多级页表

如果我们的虚拟地址空间为32位,也就是可以表示4G的虚拟内存,把这个4G内存分为很多个页,假设每个页大小为4K,那么就会分成1M个页,那么我们使用页表所需要的PTE数量也就需要是1M个。每个PTE是4byte,那么我们一个页表的大小就要有4M。
这一个进程的4M页表是要存储在主存中的,我们开启十多二十个进程其实也还好,大不了就占用个几百M。但是如果虚拟地址空间为64位呢,那这个页表可就太大了,主存可能装两个进程就占满了。
所以我们需要一种压缩页表的方法,这种方法就是使用多层次结构的页表,也就是多级页表。

在这里插入图片描述
如果使用二级页表,我们看一下会有什么优势。
一级页表的一个PTE 4byte负责定位一个二级页表的4K页,然后这4K页可以映射虚拟内存中的4M块。那么一级页表用1024个PTE就可以映射虚拟内存的4G了。
如果虚拟内存中的一块内存是未分配的,那么假设这块连续内存大小为400M,那么二级页表的400K就可以不被分配到主存中,这是一个潜在的巨大节约。一级页表的PTE为空,那么二级页表的相应4K就不会存在。一个典型的4G程序,他的虚拟内存大部分空间都是未分配的。第二,只有一级页表存储在主存中,而二级页表可以放到硬盘中,经常需要使用的缓存在主存中。从而减少主存压力。

下面我们看一下多级页表
虚拟地址va被划分成很多部分,每一部分对应VPN的页表索引。
为了构造物理地址,需要访问K个PTE。
访问K个PTE,第一眼看上去好像及其昂贵且不可思议,但是可以使用TLB缓存不同级别的页表,这样在实际操作中,K级页表的访问并不比只有一级页表慢很多,但是节约的内存却是巨大的。
在这里插入图片描述

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

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

相关文章

2022年,我45岁,一息尚存不落征帆,静稳前行未来可期

2022年,我45岁,一息尚存不落征帆,静稳前行未来可期, 关键词:模式固定,回顾与审视,不间断地阅读 模式固定 本年的52周,每逢周五我会把还在更新的15册讲书各讲一期。每期讲20分钟左…

nodejs mp2 姿势启动

以前运行 nodejs 代码都是 node xxx.js; 但是很容易就关掉了, 或者你想看跟详细的数据 是看不到的。 可以试试 pm2的方式 运行你的代码;学习新的姿势! pm2的安装: 1: npm install pm2 -g C:\Users\Admini…

数据治理:数据治理框架和标准

参考《一本书讲透数据治理》、《数据治理》等 数据治理并不是新概念,在国内外都有实践,这里重点介绍下国内外对数据治理的主流框架和标准 国际数据治理框架 国际上,主流的数据治理框架主要有:ISO数据治理标准、GDI数据治理框架、…

深入浅出scala之函数(匿名函数)(P41-45)

文章目录1.函数的定义2.匿名函数3.递归函数4.无参函数5.方法和函数的区别联系1.函数的定义 package MethodDemoobject FunctionDefinition {// 实现加法的功能,省略写法,把函数体写在返回值的位置val f1 ((a: Int, b: Int) > { a b })val f2 (a: …

Charles - 配置抓Chrome、iOS、Android包环境

官网下载地址:https://www.charlesproxy.com/。 1、设置代理http端口 路径:Proxy > Proxy Settings > Proxies > HTTP proxy > Prot 2、设置代理https端口 路径:SSL Proxying Settings > SSL Proxyin 3、Mac证书配置 …

谷粒商城-基础篇-Day06-属性分组

属性分组 抽取出一个tree组件放到modules下的common下的category.vue <template><el-tree :data"menus" :props"defaultProps" node-key"catId"ref"menu"></el-tree> </template><script> //这里可以…

LVGL学习笔记6 - 输入设备

目录 1. 移植文件 2. 移除多余代码 3. 输入设备初始化 4. 输入设备读回调函数 4.1 LV_INDEV_TYPE_POINTER 4.2 LV_INDEV_TYPE_KEYPAD 4.3 LV_INDEV_TYPE_ENCODER 4.4 LV_INDEV_TYPE_BUTTON 5. 事件 6. 实例 7 Group 7.1 创建Group 7.2 与输入设备关联 7.3 添加对…

低频功率放大器参考电路图解大全

功率放大器一般也被我们称为电压放大器&#xff0c;主要是把微弱信号进行电压放大&#xff0c;其输入输出的电压电流一般很小&#xff0c;不能够直接驱动功率较大的仪器。为了满足使用需求&#xff0c;需要在放大器末级增加功率放大器。而功率放大器主要就是放大信号功率&#…

供应商绩效管理对企业采购组织的重要价值

供应商绩效管理是供应商管理中的重要组成部分&#xff0c;它在企业整个采购管理生命周期中起到重要的作用&#xff0c;作为管理好供应商的一个重要手段&#xff0c;现代企业几乎都会对供应商实施绩效考核。供应商绩效管理是对公司供应商的可靠性、质量和性能的监视和分析。它能…

sec2-GObject

1 类和实例 GObject实例用函数g_object_new创建。GObject不仅仅有实例&#xff0c;也有类。 一个GObject类在第一次访问g_object_new时候创建&#xff0c;只有有一个GObject类存在。GObject实例在任何时候访问g_object_new都会被创建&#xff0c;所以就会创建更多GObject实例…

【剧前爆米花--爪哇岛寻宝】String类型构造,修改的底层逻辑与StringBuilder和StringBuffer的关系

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaSE语法与底层详解》 文章分布&#xff1a;这是一篇关于String类型及其底层构造的文章&#xff0c;如有疏漏&#xff0c;欢迎大佬指正&#xff01; String对象的创建 字符串的用法比较多&#xff0c;所以String类提供的构造方…

算法复杂度 O(1),O(n),O(logn),O(nlogn)的区别

算法复杂度分为时间复杂度和空间复杂度 时间复杂度是指执行这个算法所需要的计算工作量空间复杂度是指这个算法所需要的内存空间 1.对于一个循环&#xff0c;假设循环体的时间复杂度为O(n),循环次数为n&#xff0c;则这个循环的时间复杂度为O(n*1)。 void aFunc(int n) {for…

嵌入式终端的以太网系统简析

一 初识以太网电路 从硬件的角度看&#xff0c;以太网接口电路主要由 MAC&#xff08;Media Access Control&#xff09;控制器和物理层接口 PHY&#xff08;Physical Layer&#xff09;两大部分构成&#xff0c;一般一个嵌入式终端系统的以太网硬件抽象 如下&#xff1a; 1 网…

数字孪生教学楼3d可视化系统功能介绍

目前&#xff0c;校园教学楼运维管理阶段面临的主要难题有&#xff1a;数据采集不全、数据各自为阵的数据孤岛现象严重&#xff1b;系统的集成度低&#xff0c;缺乏统一、有效的运行维护处理中心平台&#xff1b;能耗巨大&#xff0c;不符合绿色建筑要求&#xff0c;未形成有效…

做了多年的Android开发,自己是否有擅长领域?(Framework 篇)

前言 如今Android 开发行业的招聘需求可谓是越来越高了&#xff0c;如果你想入大厂工作&#xff0c;学历还只是他们的基础入门的门槛&#xff0c;他们不仅要看学历还得看你是否在某块技术领域有着过硬的实力。比如&#xff1a;APP性能优化、Framework底层原理、音视频、APP架构…

数字验证学习笔记——SystemVerilog芯片验证17 ——数组约束

一、数组约束 1.1 数组的属性约束 多数情况下&#xff0c;数组的大小应该给定范围&#xff0c;防止生成过大体积的数组或者空数组此外还可以在约束中结合数组的其他方法sum&#xff08;&#xff09;&#xff0c;product&#xff08;&#xff09;&#xff0c;and&#xff08;&a…

Ansys Zemax | 如何在 OpticStudio 中模拟人眼

本文是人眼模型的一个案例研究&#xff0c;并提供了更高级的序列模式建模技术的演示。我们将在OpticStudio中使用Liou & Brennan 1997眼睛模型创建人眼模型。在OpticStudio中成功生成这个眼睛模型后&#xff0c;我们将使用它来设计一个自由形式的渐进眼镜镜片。 下载 联系…

正大国际期货:2022年各行业顶级富豪身价大洗牌

2022年各行业顶级富豪身价大洗牌 富豪身价较2021年年底变动幅度涨跌幅 行业&#xff1a;加密货币&#xff0c;币安创始人&#xff1a;赵长鹏816%&#xff0c;身价174亿美元 行业&#xff1a;基建、大宗商品&#xff0c;阿达尼集团创始人&#xff1a;高塔姆阿达尼210%&#x…

Linux下Python脚本的编写(二)

今天试着把两个shell小脚本转化成Python版本 一. 脚本1 判断所接的nvme 在哪个CPU上 #!/bin/bash lscpu |grep -i node for nvme in nvme list|sed 1,2d|awk {print $1}|awk -F "/" {print $NF} doecho $nvmebusid$(readlink -f /sys/block/$nvme |cut -d / -f 6)ec…

【解决】VMware虚拟机中ubuntu系统联网问题——以桥接模式解决

问题描述 由于需要通过笔记本的蓝牙与外接设备进行通信&#xff0c;我使用的是无线网。所以需要使用VMware中提供的桥接模式&#xff0c;借助笔记本的无线网卡进行联网&#xff0c;之前设置过一次&#xff0c;能够正常运行&#xff0c;但是关机后&#xff0c;可能加载的快照不同…