【前提知识点】
进程运行具有【局部性】
这里引用B站里昂学长的教材,很好理解:
- 【时间局部性】:短时间被多次用到的【指令、数据】
- 常见【循环语句(for\while)里的代码】、【循环语句(for\while)里的变量】.......
- 【空间局部性】:在内存里连续紧挨着的几个数据被顺序访问
- 常见【数组】、【顺序表】.......
;
;
而前面我们辛辛苦苦学的一大堆内存管理方式.....全是传统存储方式我操!!
- 现在计算机都是靠【虚拟内存管理技术】
一、虚拟内存基本概念
1、虚拟内存技术定义
2、虚拟内存的特征
- 由【虚拟性】可得:【逻辑上虚拟内存容量 > 实际内存容量】 ,可算得以下容量:
![]()
- 1)【进程 虚拟地址空间】
- 就等于:【CPU寻址范围】=【最大虚拟存储器(虚拟内存)容量】
- 计算公式:【2^系统位数】
- 是CPU能生成别的全部逻辑地址编号总数 ,只由【地址寄存器位数】决定:单个进程的虚拟逻辑空间范围
- 2)【虚拟存储器(虚拟内存)】
- 通常指【实际虚拟存储器(虚拟内存)容量 】
- 是整个计算机的虚拟内存大小
- 计算公式:【实际虚拟存储器(虚拟内存)容量 】= 【实际内存】+【实际外存】
- 若【CPU寻址范围】比【实际内存外存之和】还小,则取【CPU寻址范围】
![]()
- 切记:【实际虚拟存储器】大小必然小于【内外存之和】、小于【CPU寻址范围】,取最小的容量就是实际的虚拟内存的容量!!
【例题1】
【例题2】
【例题3】
(Belady现象、页面置换算法到后面会学,先只看后两个选项)
3、如何实现虚拟内存技术
这里用两个博主解释,基本就是讲一件事:
- 【虚拟内存技术】等于【传统离散内存分配】+【2新功能:(请求调页/段)、(页面置换)】
【里昂学长的文字版叙述】:(侧重只讲"虚拟页式",不讲"虚拟段式")
;
【王道课件版本】:(概括包含 "虚拟页式" 和 "虚拟段式" )
【总结】
【例题】
【背诵常识】
二、虚拟内存之【请求分页存储管理】
1、负责【地址映射】的硬件:MMU
2、负责【请求调页】和【页面置换】的3种硬件

1)请求页表机制
就是在传统的分页管理的【页表】基础上,增加了几个【新字段】
关于这4个字段,不同教材有不同的叫法,但是本质功能一样
严重提醒【里昂学长的错误图】:
- 首先,凡是跟里昂学长的,这个部分别听,不然就乱了!!
第一是人家还没学页面置换算法,你上来一个访问位让人学个鸡毛,然后各个字段的【别称】一大堆又不解释!!!
我结合【王道】和【里昂】和【课后题】的总结:
- 1、【虚拟(逻辑)页号】:
- 不多说了,要注意的是【请求分页页表】记录的是【虚拟页】,也就是一个进程【有几个虚拟页】就【有几个页表项】
- 2、【内存(物理)页号】:
- 对应物理内存哪个页框号
- 3、【状态位】:又叫【合法位】、【有效位】、【驻留位】
- 最重要!!!看上面名字就知道,他就是判断【该页面在不在内存】!!
- 以他来判断决定【这个页面是否 "缺页"】!!!
- 4、【修改位】:又叫【脏位】
- 判断该页面在内存里运行时【是否被修改了】
- 若修改了,则置换页面的时候需要写回外存,跟外存原本的这页内容保持一致
- 若没有修改,则置换页面的时候直接淘汰就行,反正内存、外存这个页都一样
- 5、【保护位】:又叫【保护码】
- 一开始就设定的【该页面的读写权限】
- 【只读】就不可修改(如存储常量的页面只可读);【可读写】就可以写入修改
- 6、【访问位】:又叫【访问字段】、【引用位】
- 后续学到页面置换算法时,有个叫【CLOCK时钟置换算法】,会根据【访问位】来判断某个页面是不 "近期刚刚被访问过"
- 原理就是【访问位=1时,说明刚刚访问这个页面,暂时要用到它,不应该淘汰置换它】、【访问位=0时,说明近期没用到这个页面,可以置换淘汰它出去】
- 7、【外存地址】
- 最后别漏了这个,传统分页里没有页面置换的需求,所以只用知道各个页【在内存的位置】就行,但是虚拟请求分页涉及页面置换,必须要还得知道【外存地址】
- 【王道的笔记】:
【例题(加强记忆)】
2)缺页中断机构
3)地址变换机构
【例题】
【难点:TLB命中问题】
【难点:回顾多级页表】
在做着一章课后题的时候又遇到了多级页表,这是前面的知识点但是我已经全忘了,再次提醒加深记忆
- 1、二级页表:
- 记住有【页目录号】+【页号】+【页内偏移】
- 先算【页内偏移量】:由一个页面有多大/一个页表有多大,确定位数
- 再算【页号】:二级页表固定就是2位,不用算
- 最后【页目录号】:【总的逻辑地址位数】-【页内偏移】-【2位页号】就得出来了
- 所以要先算出前两个才能得出【页目录号】
2、多级目录:
因为不知道几级,所以没法确定【页号位数】,因此虚拟逻辑地址结构分为
【总的各级页号】+【页内偏移量】
- 依旧先算【页内偏移量】:由一个页面有多大/一个页表有多大,确定位数
- 再算【总的各级页号】:【总的逻辑地址位数】-【页内偏移】就得到了
- 然后算【1个页表有几个页表项】:已知【1个页表项大小】,【页表大小】/【页表项大小】就得出一个页表有几个页表项了
- 因为各级页表一样大,所以【总的各级页号】/【1个页表有几个页表项】=【有几级页表】
- 【多级页表例题】
















(Belady现象、页面置换算法到后面会学,先只看后两个选项)















第一是人家还没学页面置换算法,你上来一个访问位让人学个鸡毛,然后各个字段的【别称】一大堆又不解释!!!
































