考研408《操作系统》复习笔记,第三章《3.3 虚拟内存、请求分页》

【前提知识点】

进程运行具有【局部性】

这里引用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个页表有几个页表项】=【有几级页表】
  • 【多级页表例题】