操作系统之虚拟内存

1.物理寻址

​  计算机系统被组织成一个由M字节连续大小的单元组成的数组,每字节都有一个唯一的物理地址,CPU按照这种简单的线性地址结构进行地址访问,这就是物理寻址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IenzsgXM-1631674486210)(%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F.assets/image-20210915104817413.png)]

2.虚拟寻址

​​  现代处理器采用的是一种虚拟寻址的形式。使用虚拟寻址,CPU通过生成一个虚拟地址(VA)来访问主存,这个虚拟地址被送到内存之前先转换成适当的物理地址。这个过程称为地址翻译。地址翻译需要CPU硬件和操作系统的配合,内存管理单元(MMU)利用存放在主存中的查询表来动态翻译虚拟地址。

在这里插入图片描述

3.虚拟内存

​​​  虚拟内存在概念上被组织成一个由存放在磁盘上的N个连续的字节大小的单元组成数组。每个字节都有一个唯一的虚拟地址,作为数组的索引。虚拟内存被划分成大小固定的块,称为虚拟页面。

​​​  在任意时刻,虚拟页面的集合都分为三个不相交的子集:

​​​  ​​​   1. 未分配的,VM 系统还未分配(或者创建)的页,未分配的页没有任何数据和它们关联,因此不占用任何内存空间。
​​​  ​​​   2. 缓存的,当前已缓存在物理内存中的已分配页。
​​​  ​​​   3. 未缓存的,未缓存在物理内存中的已分配页。

4.页表

​​​  CPU进行地址访问时需要根据物理地址确定数据的位置,也就是说,虽然使用虚拟寻址方式,但是本质需要访问实际的物理地址,这也就需要通过MMU(内存管理单元)进行从虚拟地址到物理地址的翻译。也称之为虚拟内存到物理内存的映射,我们把这个映射表称为页表

​​​  虚拟内存系统需要有某种方法来判定一个虚拟页是否在缓存DRAM中的某个地方。这时会出现两种情况:

  • 虚拟页已经在主存中,此时需要判断虚拟页存储在主存的哪个物理页中。
  • 虚拟页不在主存中,此时系统需要判断虚拟月存放在磁盘的什么位置,并且在主存中选择一个牺牲页,将虚拟页从磁盘复制到主存(DRAM)中,替换牺牲页。

​​​  页表将虚拟页映射到物理页,每次地址翻译硬件将一个虚拟地址转换到物理地址时,都会读取页表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItwEYBaF-1631674486228)(%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F.assets/image-20210915093510124.png)]
  ​页表是一个页表条目(PTE)的数组,虚拟地址空间的每个页在页表中都有一个对一个的PTE,假设PTE由一个有效位和一个n位的地址段构成,有效位表示虚拟页是否被缓存在主存中。

  • 有效位为1:主存缓存了虚拟页,地址字段表示主存中相应物理页的起始位置。
  • 有效位为0:地址字段为null表示虚拟页还未被分配。否则该地址就指向该虚拟页在磁盘上的起始位置【已经被分配但是未被缓存】。

4.1页命中

  ​当CPU读取虚拟内存中的内容时,地址翻译硬件将虚拟地址作为地址索引定位PTE(页表条目),并从内存中读取,这时可以开始匹配有效位,如果虚拟页缓存在主存中,此时利用PTE中的物理地址构造需要数据的物理地址。这就是页命中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDyQPqN2-1631674486229)(%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F.assets/image-20210915095019696.png)]

  ​​页表地址转换方法:将内存地址分成页号和偏移量两个部分。【后期总结】

  ​​如有需要参考:【页表地址转换

4.2缺页

​  ​​DRAM缓存不命中称为缺页。当CPU需要获取虚拟内存中的内容时,地址翻译硬件从内存中读取PTE,根据有效位推断虚拟页未被缓存,此时触发缺页异常。调用内核中的缺页异常处理程序,程序选择牺牲页进行替换。
在这里插入图片描述
​  ​​然后内核就可以将虚拟页内容复制到物理页中,更新PTE。这时虚拟页就已经缓存在主存中了,也就可以正常命中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FT7afUTq-1631674486231)(%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F.assets/image-20210915102939758.png)]

4.3局部性提升虚拟内存工作效率

​​  虚拟内存工作的很好的原因在于局部性的存在。程序运行过程中引用不同页面的总数可能超过物理内存的大小,但是局部性保证在任意时刻,程序趋向于在一个较小的活动页面集合上工作(工作集)。

​​  如果工作集的大小超过了物理内存的大小,那么就会出现抖动状态。

​​  局部性原理请参考:【局部性原理

4.3.1抖动现象及解决方法

【现象】

​​  在请求分页存储管理中,从主存(DRAM)中刚刚换出(Swap Out)某一页面后(换出到Disk),根据请求马上又换入(Swap In)该页,这种反复换出换入的现象,称为系统颠簸,也叫系统抖动。产生该现象的主要原因是置换算法选择不当

【解决方案】

​  运用局部性原理优化页面置换算法【后期继续总结】

​  如有需要参考:
​  ​  【页面置换算法
​  ​  【页面置算法及c++实现

【危害】

​​  系统时间消耗在低速的I/O上,大大降低系统效率。进程对当前换出页的每一次访问,与对RAM中页的访问相比,要慢几个数量级。

参考

《深入理解计算机系统》
《现代操作系统》
虚拟内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值