考研408《计算机组成原理》复习笔记,第三章(7)——虚拟存储器
一定要有Cache缓存的知识点概念,因为虚拟存储器跟它很像很像!!!
一、前提知识点
首先我们学过操作系统的话应该知道:
- 一个【程序的运行】是放到【主存(内存)】运行的
- 而其他暂时不运行的大量数据都是存放到【外存(辅存)】,也就是机械硬盘、固态硬盘这些
然后会发现我们会发现:
- 我们的电脑、手机的【运行内存(主存)】容量很小;
- 但是要下载一个王者荣耀、吃鸡、生化危机、岛国动作片.....都需要几十G、几百G的
- 那这么小的【运行内存(主存)】是怎么运行得了这么大的程序的?
- 其实是这些程序【大部分】都是放到【辅存】的,在运行的时候,只有【部分目前需要用到的数据】才会放入【内存】
- 比如:你当前在用王者荣耀的购买皮肤功能,那就只会从辅存调入 “商城指令、数据” 到内存
- 你在使用微信的视频聊天功能,那就只会从辅存调入 “视频聊天指令、数据” 到内存
- 在操作系统中,我们通常把【一个程序中当前正要运行的这部分】叫做【进程】
二、什么是虚拟存储器
1、为什么要有虚拟存储器?为了解决什么问题?
说句人话就是:
- 解决【主存容量不够大】和【访问辅存速度不够快】的问题!!!(CPU没法直接访问辅存,必须要经过主存)
- 而且还要【多个程序的进程】能够并发执行、并且互不干扰!!!
2、虚拟存储器基本概念
简单说人话:
- 1、是一项技术,一种【逻辑存储器】
- (记住不是实际的存储器!!!!只是一种技术!!)
- 2、由【主存】+【辅存】共同构成,【统一编址】
- 因此应用程序员才可以无视实际的主存容量和进程在主存的位置,当成一整块逻辑整体就行
- 3、具有【主存的速度】+【辅存的容量】
- 4、由【硬件:存储器管理单元MMU】+【软件:OS操作系统】共同运行
【虚拟存储器】和【Cache】的区别
回顾这张图,依旧是这张出现了N次的图,把它背烂在心底:
二者【相同之处】:
- 目的都是为了:提高系统性能,协调相邻层之间容量、速度、价格的梯度差距
- 都把数据划分为【小信息块】,作为基本的交换单位(虚拟系统的信息块更大一点)
- 都有【地址映射】、【替换算法】、【写入更新策略】等问题
- 都依据【局部性原理】应用 “快速缓存” 思想(将活跃的暂时要用的数据放在相对高速的部件)
- Cache-主存的高速缓存部件:【Cache】是【主存 的高速缓存】
- 虚拟存储器高速缓存不就:【主存】是【辅存 的高速缓存】
【不同之处】:
- 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、段页式虚拟存储器(操作系统再细学)
先分段,再分页