当前位置: 首页 > news >正文

考研408《计算机组成原理》复习笔记,第三章(7)——虚拟存储器

一定要有Cache缓存的知识点概念,因为虚拟存储器跟它很像很像!!!

一、前提知识点

首先我们学过操作系统的话应该知道:

  • 一个【程序的运行】是放到【主存(内存)】运行的
  • 而其他暂时不运行的大量数据都是存放到【外存(辅存)】,也就是机械硬盘、固态硬盘这些

然后会发现我们会发现:

  • 我们的电脑、手机的【运行内存(主存)】容量很小
  • 但是要下载一个王者荣耀、吃鸡、生化危机、岛国动作片.....都需要几十G、几百G的
  • 那这么小的【运行内存(主存)】是怎么运行得了这么大的程序的?
    • 其实是这些程序【大部分】都是放到【辅存】的,在运行的时候,只有【部分目前需要用到的数据】才会放入【内存
      • 比如:你当前在用王者荣耀的购买皮肤功能,那就只会从辅存调入 “商城指令、数据” 到内存
      • 你在使用微信的视频聊天功能,那就只会从辅存调入 “视频聊天指令、数据” 到内存
      • 在操作系统中,我们通常把【一个程序中当前正要运行的这部分】叫做【进程】

二、什么是虚拟存储器

1、为什么要有虚拟存储器?为了解决什么问题?

说句人话就是:

  • 解决【主存容量不够大】【访问辅存速度不够快】的问题!!!(CPU没法直接访问辅存,必须要经过主存
  • 而且还要【多个程序的进程】能够并发执行、并且互不干扰!!!

2、虚拟存储器基本概念

简单说人话:

  • 1、是一项技术,一种【逻辑存储器】
    • (记住不是实际的存储器!!!!只是一种技术!!)
  • 2、由【主存】+【辅存】共同构成,【统一编址】
    • 因此应用程序员才可以无视实际的主存容量和进程在主存的位置,当成一整块逻辑整体就行
  • 3、具有【主存的速度】+【辅存的容量】
  • 4、由【硬件:存储器管理单元MMU】+【软件:OS操作系统】共同运行

【虚拟存储器】和【Cache】的区别

回顾这张图,依旧是这张出现了N次的图,把它背烂在心底:

二者【相同之处】:

  1. 目的都是为了:提高系统性能,协调相邻层之间容量、速度、价格的梯度差距
  2. 都把数据划分为【小信息块】作为基本的交换单位虚拟系统的信息块更大一点
  3. 都有【地址映射】、【替换算法】、【写入更新策略】等问题
  4. 依据【局部性原理】应用 “快速缓存” 思想将活跃的暂时要用的数据放在相对高速的部件
    1. Cache-主存的高速缓存部件:【Cache】是【主存 的高速缓存
    2. 虚拟存储器高速缓存不就:【主存】是【辅存 的高速缓存

【不同之处】:

  • 1、主要解决的针对性问题不一样:
    • Cache主要解决【系统速度】;
    • 虚拟存储器主要解决【主存容量】
  • 2、实现原理上:
    • Cache全靠【硬件】实现;
      • 是【硬件存储器】
      • 因此对所有程序员透明
    • 虚拟存储器要靠【硬件】+【软件:OS操作系统】
      • 是【逻辑存储器】
      • 因此只对应用程序员透明,系统程序员还需要接触

3、【虚拟空间】和【实际空间】

  • 【虚拟地址(VA:Virtual Address)】:应用程序员编程用的是【虚地址(也叫:逻辑地址)】
    • 对应 “逻辑上:主存+辅存” 的这一整块【虚拟空间(程序空间)】的位置
    • 可以发现,虚拟地址在虚拟空间是【连续的】
  • 【实际地址(PA:Physical Address)】:实际物理上的主存单元地址就是【实地址(也叫:物理地址)】
    • 对应【主存的地址空间】
    • 可以发现,虚拟地址实际在主存中是【分散的】

【虚拟存储器】的【基本寻址流程】

  • 首先:CPU使用虚地址VA时,要先判断虚地址对应的内容是否【已经在主存】?
    • 1、如果已经在主存,则通过【MMU】进行【地址变换】变成实地址PA
    • 2、如果不在主存,那么这种情况叫【数据缺失】(CPU要的数据在辅存,但不能在主存找到)
      • 则把包含这个字的【一页 或 一段】从高辅存调入主存先,然后再由CPU访问
      • (若主存已经满了,则采用【替换算法】换主存的【页框】)
      • 还有别的情况就是操作系统的知识点了....

4、虚拟存储器传输数据的单位【页】

虚拟存储器传输数据的单位是【页】

  • 【虚拟地址空间】的【页】:【虚拟页(VP:Virtual Page)】也叫【虚页(题目中用的比较多)】、【逻辑页
  • 【实际主存空间】的【页】:【物理页(PP:Physical Page)】也叫【实页】、【页框(题目中用的比较多)
  • 和Cache同样的是,【页】也是相当于把【一堆存储单元】合起来,Cache的一个【块】里还有【块内单元】;【页】里也有【页内单元】

注意!!!!!

  • 【Cache-主存系统】里,主存的【块】虽然也可叫做【页/页面/页框】
  • 但是【Cache-主存系统的 “页(块)”】绝对绝对不等于【虚拟存储器的 “页”】!!!
    • 【虚拟存储器的 “页”】  【Cache-主存系统的 “页(块)”】
    • 原因后面解释.......

5、虚拟存储器必知知识点!

前面说过了,【数据缺失】就是:

  • Cache的数据缺失是指:CPU获取的数据在【Cache中未命中,但是在主存】
  • 虚拟存储器的数据缺失是指:CPU要获取的数据在【主存找不到,但是在辅存】
    • 那么【主存 的访问速度】比【Cache 的访问速度】慢
    • 辅存 的访问速度】又比【Cache 的访问速度】更更更慢,
      • 而且主存还没办法直接访问辅存,还得靠“中介”主存来访问,更是慢慢慢!!!

所以:

  • 1、这就是为什么【虚拟存储器的 “页”】  【Cache-主存系统的 “页(块)”】
  • 2、虚拟存储器必须采取【全相联映射】!!!
  • 3、虚拟存储器必须采取【写回法】!!!

三、3种虚拟存储器

1、页式虚拟存储器

1)符合页式虚拟存储器的地址结构

【虚地址结构】

记住人话:【虚地址结构】=【虚页号】+【页内偏移量】

  • 页内偏移量你就当成 “页内地址”,就像 "Cache-主存" 的 “块内地址”)
  • 再次提示:【逻辑空间】里的地址都是【连续的】
【主存实地址结构】

记住人话:【实地址结构】=【页框号】+【页内偏移量】

  • 页内偏移量你就当成 “页内地址”,就像 "Cache-主存" 的 “块内地址”)
  • 再次提示:【实际主存空间】里的地址都是【分散的】
【提示】

那么可以发现,这跟【Cache-主存】的直接映射关系是有区别的:

  • 【Cache-主存】的直接映射,地址结构虽然不一样,但是地址一模一样,长度一样
    • 因为特么直接映射就是要一块一块直接对应上啊
  • 【虚拟空间-主存空间】的地址结构不一样,地址内容也不一样了
    • 因为特么的它只能用【全相联映射】,随意乱映射....​​​​​​
    • 这就不能单纯靠看地址结构来分析了,需要依靠一个 【“中间翻译人”:页表】!!!!
      • 不过其实只是【虚页号】对不上【页框号】虚拟空间 与 主存空间的【页内地址】还是一模一样的(因为二者的【页】一样大小,1个【页】里面有几个单元都是一样的,所以页内地址位数、位置都一样)
      • 这是因为【虚页号位数】>【页框号位数】(【虚拟存储器】 > 【主存容量】)

2)页表

究竟是怎么怎么根据【虚地址】映射到【实地址】?————那就是靠页表

【页表是啥?】

页表

  • 他就是翻译 “虚地址” 和 “实地址” 的翻译官:记录了一个【虚页】被调入主存时是安排在【主存的什么位置】
  • 【页表】会被长久地存放在【内存里面】!!!!
  • 每一个进程都有【专属于该进程自己】的【页表】
    • 比如:王者荣耀有王者荣耀的页表、快手有快手的页表、CSDN有CSDN的页表...
【页表结构】

        这里我想用数据库的概念来解释,学过计算机的应该都会数据库,那【页表】其实就是一个【表】

按照王道教科书的【页表】结构,就一共就【5个字段(含一个隐含位)】:

  • 【有效位】:又叫【装入位】,和Cache的 有效位 意义一样:
    • 【1】就是这个虚页【已经放入主存】
    • 【0】就是这个虚页【还在辅存,没有放入主存】
    • (当然别的教材里还详细说明,还有【仅存在辅存】和【连辅存都没有分配】,了解即可)
  • 【脏位】:又叫【修改位】,和Cache的 脏位 意义一样:
    • 【1】就是这个【页】已经【被修改过】了,那替换时就需要写回磁盘辅存
    • 【0】就是【没有被改过】,可直接替换、无需写回
    • 注意:因为虚拟存储器采用【写回法】,所以必须要靠【脏位】来判断替换时是否要将页的数据写回磁盘辅存
  • 【引用位】:又叫【使用位】【替换控制位】
    • 就是确定这个【页】被替换时采用的是【FIFO先进先出算法】、【LRU最近最少使用算法】.......哪一种替换算法
    • 注意:虚拟存储器采用【全相联映射】,所以必须要用【替换法】
  • 【存放位置】:也就是【物理页  或  磁盘位置】
    • 这里就是翻译的最直接最后的一步了,到底这个【虚拟地址】对应的【页】的【实际地址】是哪
    • 这里需要根据前面【有效位】来决定了
      • 【有效位:1】说明存在主存,那这里就是【物理页地址(主存实际位置)
      • 【有效位:0】说明还没放到主存,那就只能是在辅存了,所以对应【辅存地址
  • 【虚页号(隐含位)】
    • 就是这个【虚拟地址】里的【虚拟号】
    • 前面我们说过:虚拟空间是【连续的】,所以虚拟号也是连续排列在【页表】里
    • 注意!!这个并不是【页表】里明确包含的字段,它是隐含的
    • 就像学过数据库的都知道,一个表在添加数据的时候,前面会有个索引号自动添加,但实际表里根本没有记录这些数据                     

湖工大的更为详细,但是我觉得中间的【访问权限位】、【禁止缓存位】可以不学

除了这两位,那么别的位就都是一样的解释

还有【有效位】那里也解释的过于详细,【0】的情况还会对应【存放位置】的2种情况,了解即可,以王道的解释为准

3)页式虚拟存储器优弊端

  • 页式虚拟存储器的优点:
    • 【页面】长度固定(比如固定了【虚拟页】和【页框】都是4B,不能大不能小)
    • 【页表】结构简单,调入方便
  • 弊端:
    • 但是【程序大小】又怎么可能会刚好是【页面长度】的【整数倍】
    • 那么最后不够一个【页】的数据,也会算作一个【页】的大小映射
      • 那么空闲的容量无法再被利用,会造成空间浪费

4)回顾整个流程

完整教材文字表述如下:

为了上面那个图大家看不懂,还是用最详细最直白的下图表示:

那么我在用一句话来总结、加速大家的理解:

  • 【虚地址】的【虚页号】到【页表】里找到【实地址】的【页框号】就结束了(剩下的【页内偏移量】是一样的,有了【实页号(页框号)】,直接拼接【页内偏移量】就结束了)

那么这里再讲一个重点:

可以发现【步骤(②】、【步骤③④】我们共【访存2次 主存】

  • 【步骤②】我们先要去主存找到【页表】
  • 然后【步骤③④】才去根据【页框号(物理页号)】+【页内偏移量(页内地址)】再去访问主存,找到最终完整地址

另外,在湖工大的教材里,甚至详细到结合了Cache一起工作的流程

感兴趣的可以看看,可以发现:

  • 既然【页表】是放在主存的,那么它同样是主存的一份数据,可以备份到Cache,那么MMU可以先去Cache找有没有页表,找到就直接返回给MMU用;没找到再去主存拿页表,并替换回Cache
  • Cache能命中页表,那就在拿数据的时候访问一次主存;Cache未命中页表,那就还是得访问2次主存                 

5)快表TLB

【概念】

考点速记:

  • 1、【快表】又叫【转换后备缓冲器】、【TLB(Translation Lookaside Buffer)】
    • 快表】存【经常要访问的页表项】(所以会比【慢表】小)
    • 页表】就可以被叫做【慢表(Page)】了,在主存里的页表就是【慢表】
  • 2、你就把【快表TLB】当成【Cache】,都是SRAM存储器都是高速缓存,都是为了让CPU更快地访问,可以免去CPU访问主存的时间
    • 但是它两存的东西还是有区别的
      • 【Cache】存 “主存” 的各种数据,关心的是【主存数据】(包括主存的【页表】)
      • 【快表TLB】只存 “慢表” 里的常用的页表项,关心的是【主存地址】
  • 3、【快表TLB】使用【全相联映射】或【组相联映射】方式映射慢表的页表项
  • 4、【快表TLB】未命中时的替换算法使用【随机替换算法

【TLB地址映射】(复用 Cache 逻辑!)

首先我们需要知道:

  • 【虚拟地址】去【页表(慢表)】映射的是————【物理地址(实地址、主存地址)】
    • (实际上只用找【实页号(页框号)】
  • 【虚拟地址】去【快表 TLB】映射的是————【逻辑地址(虚地址)】
    • (实际上只用找【虚页号】
    • 再通过【快表TLB】的【逻辑地址(虚地址)】直接映射成【物理地址(实地址、主存地址)】,而不用在访问【慢表】

然后看【TLB的地址结构】

  • 首先CPU拿到的【虚拟地址】结构前面已经说过了,就不再多说
  • 然后对应两种映射方式,有两种地址结构:
    • 【全相联映射地址结构】:【Tag标记】+【页内偏移量】
    • 【组相联映射地址结构】:【Tag标记】+【组索引】+【页内偏移量】

重点:

  • 三个地址全部一模一样!!!和Cache映射的逻辑一样!!!因为本质上都是逻辑地址,所以所有地址【长度】、【内容】完完全全一模一样
  • 只是【比特位意义】不同!!!

        那么这里比特位意义我直接用图片解释,另外可以直接用Cache映射的概念带还进去,TLB 的全相联、组相联映射,和 Cache 的映射逻辑完全一致

这里湖工大的PPT里把:

        【组相联映射】的 “Tag标记” 叫做 “TLB标记”、“组索引” 叫做 “TLB索引”;

        【全相联映射】的 “Tag标记” 叫做 “虚拟页号”

          建议还是按“Tag标记”、“组索引”这样的说法记忆

【全相联映射】下

注意:

【有效位为1:命中,在TLB表里这个页表项是慢表的页表项】

【有效位为0:未命中,这只是TLB表里的这个空页表项,还得去慢表找】

【组相联映射】下

注意,组相联映射计算地址时:

  • 首先要知道【虚拟地址几位?】
  • 然后知道【虚拟页号几位?】【页内偏移量几位?】
    • 然后把【虚拟页号】拆成【Tag标记】+【组索引】
      • 先算【组索引】,有【2^n】个组,就用【n】位表示组索引
      • 得出【组索引】后才能算【Tag标记】,就是【虚页号位数 - 组索引位数(n)】

【例题】

最后看【TLB命中、缺失】情况

记住重点:

  • 1、【快表TLB】是【慢表(页,页表,Page)】的 “一块副本”【Cache】因为是【主存数据的 “一块副本”】,所以也可以存【慢表(页,页表,Page)】的 “一块副本”
    • ​​​​​​​【快表TLB】命中,则【慢表(页,页表,Page)】一定一定命中,因为就是从他那复制过去的
  • 2、【慢表(页,页表,Page)】里面都没命中的话,那就说明这个页表项压根就不在主存
    • ​​​​​​​所以它的【TLB副本】【Cache副本】也一定缺失!!
  • 3、【Cache】爱存不存【慢表】,它爽就存(那TLB不命中也可以不用去主存,而是在Cache找到);不爽就不存(那TLB不命中的话,没法子还得去主存找【慢表】)​​​​​​​

提示:

说人话就是:

【Cache】完全只靠【硬件】

【快表TLB】可靠【硬件】or【软件】

最后看【TLB命中、缺失】流程

然后我累了,不想打字了。。。自己看吧。。。

【例题】

2、段式虚拟存储器(操作系统再细学)

每个段长度大小不一定

【段】之间分散

【段内】连续

3、段页式虚拟存储器(操作系统再细学)

先分段,再分页

​​​​​​​

http://www.dtcms.com/a/331230.html

相关文章:

  • 考公VS考研,拼哪个性价比高?
  • 什么是域名抢注?域名抢注常见问题汇总
  • 图书商城小程序怎么做?实体书店如何在微信小程序上卖书?
  • 使用vllm运行智谱GLM-4.5V视觉语言模型推理服务
  • 如何使用 AI 大语言模型解决生活中的实际小事情?
  • 数据结构——线性表(链表,力扣简单篇)
  • vscode的wsl环境,ESP32驱动0.96寸oled屏幕
  • 失败存储:查看未成功的内容
  • vscode使用keil5出现变量跳转不了
  • 如何让手机访问本地服务器部署的网页?无公网IP内网主机应用,自定义外网地址,给任意网设备访问
  • 利用 Java 爬虫按图搜索 1688 商品(拍立淘)实战指南
  • 第一章 java基础
  • 手写MyBatis第17弹:ResultSetMetaData揭秘:数据库字段到Java属性的桥梁
  • 《C++》哈希表解析与实现
  • 能源行业数字化转型:边缘计算网关在油田场景的深度应用
  • Python机器学习与深度学习;Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等
  • 基于51单片机倒计时器秒表定时器数码管显示设计
  • vue+后端
  • 微服务、分布式概念-以及集群部署 vs 分布式部署
  • 容器运行时支持GPU,并使用1panel安装ollama
  • 将 pdf 转为高清 jpg
  • 数巅中标中建科技AI知识库项目,开启建筑业数智化新篇章
  • CSS aspect-ratio 属性
  • Multimodal RAG Enhanced Visual Description
  • Linux 对 RPM 包的管理
  • 19 ABP Framework 本地化系统
  • hashmap和concurrentHashmap是否允许null值和null健
  • PiscCode使用光流法计算漂浮物位移速度
  • 把 AI 推理塞进「 8 位 MCU 」——0.5 KB RAM 跑通关键词唤醒的魔幻之旅
  • 监控插件SkyWalking(一)原理