当CPU遇到缺页时,会触发缺页异常 。缺失页面异常将控制转移到操作系统内核,然后调用内核中的缺失页面异常处理程序,该程序将选择一个受害页面 。如果牺牲页被修改过,内核会先把它拷贝回硬盘(用回写机制代替直接写也是为了尽量减少对硬盘的访问次数),然后把虚拟页覆盖到牺牲页的位置,更新PTE 。
当页面错误异常处理程序返回时,它将重新启动导致页面错误的指令,这将向MMU重新发送导致页面错误的虚拟地址 。既然已经成功处理了缺页异常,那么最终的结果就是页面命中并获得物理地址 。
这种在硬盘和内存之间转移页面的行为称为分页:页面从硬盘切换到内存,从内存切换到硬盘 。当异常发生时,将页面交换到内存中的策略称为请求分页 。所有现代操作系统基本上都使用按需分页策略 。
虚拟内存和CPU缓存(或者其他使用缓存的技术)一样,依赖于局部性原则 。虽然处理缺页会消耗大量的性能(毕竟还是要从硬盘中读取),而且程序在运行过程中引用的不同虚拟页面的总数可能会超过物理内存的大小,但是局部性原理保证了程序在任何时候都会倾向于工作在一个很小的活动页面集上,这个页面集就是所谓的工作集 。根据空之间的局部性原理(被访问过的内存地址及其周围的内存地址将有很大的机会再次被访问)和时间局部性原理(被访问过的内存地址稍后将有很大的机会再次被访问),只要工作集缓存在物理内存中,下一个地址转换请求就有很大的机会在其中,从而减少额外的硬盘流量 。
如果一个程序没有好的局部性,就会使工作集的大小不断扩大,直到超过物理内存的大小 。这个时候程序会产生一种状态叫做thrashing,页面会不断的换入换出 。这么多倍的硬盘读写开销,性能自然会“惨不忍睹” 。所以,要想写出高性能的程序,首先要保证程序的时间局部性和空局部性 。
多级页面表到目前为止,我们只讨论了一页表,但是在实际环境中,virtual 空之间的地址是非常大的(32位系统的地址空之间有2^32 = 4GB,更不用说64位系统了) 。在这种情况下,使用单页表显然是低效的 。
常见的方法是使用分层页表 。假设我们的环境是一个32位虚拟地址空,其形式如下:
虚拟地址空分为4KB页,每个PTE为4字节 。
内存的前2K页分配给代码和数据 。
接下来的6K页尚未分配 。
接下来的1023页不分配,下一页分配给用户栈 。
下图显示了为这个虚拟地址空(实际情况下有四级或四级以上)构建的二级页表的层次结构 。一级页表的每个PTE(1024个PTE刚好覆盖4GB的虚拟地址空,每个PTE只有4个字节,所以一级页表和二级页表的大小和一个页的大小完全一样,都是4KB)负责每个PTE 。辅助页表中的每个PTE负责映射一个4KB的虚拟内存页 。
这种结构看起来像B树,这种分层结构有效地降低了内存需求:
如果一级页表的PTE是空,那么对应的二级页表将不存在 。这代表了巨大的潜在节省(对于一个普通的程序,大多数虚拟地址空将是未分配的) 。
只有一级页表总是需要缓存在内存中,这样虚拟内存系统就可以在需要的时候创建、调入或调出二级页表(只有经常使用的二级页表才会缓存在内存中),减轻了内存压力 。
地址翻译的过程形式上,地址转换是n元素的虚拟地址空中的元素和m元素的物理地址空中的元素之间的映射 。
下图显示了使用页表进行MMU寻址的过程:
页基址寄存器(PTBR)指向当前页表 。具有n位的虚拟地址由两部分组成,具有p位的虚拟页面偏移量(VPO)和具有n-p位的虚拟页面号(VPN) 。
MMU根据VPN选择对应的PTE,例如VPN 0代表PTE 0,VPN 1代表PTE 1...因为物理页面和虚拟页面的大小相同,所以物理页面偏移量(PPO)与VPO相同 。那么,只要将物理页号、PTE中的PPN和虚拟地址中的VPO串联起来,就可以得到对应的物理地址 。
多级页表的地址转换也是如此,只不过VPN需要分成多个段,因为有多个级别 。假设有一个K级页表,将虚拟地址分为K个VPN和1个VPO,每个VPN i都是I级页表的索引 。为了构造物理地址,MMU需要访问K个pte来获得相应的PPN 。
TLB页面缓存在内存中 。虽然与硬盘相比,内存的速度已经很快了,但它仍然落后于CPU 。为了防止每个地址转换操作访问内存,CPU使用缓存和TLB来缓存PTE 。
最坏的情况下(不包括页面未命中),MMU需要访问内存来获取对应的PTE,代价大概是几十到几百个周期 。如果PTE恰好缓存在L1缓存中(如果L1丢失,将从L2查找,但我们将忽略多级缓冲区的细节),那么性能开销将下降到一个或两个周期 。然而,许多系统甚至需要消除如此小的开销,TLB应运而生 。
推荐阅读
- 图文解说 施乐3117加粉只需10分钟新系统了解的东西
- word文档斜杠怎么打系统教程推荐
- 苹果系统上QQ音乐怎么更换皮肤[技能提升]
- 摩尔庄园手游邻居系统解锁条件一览-邻居系统怎么开启让您技能天下无双
- 原神元素能量怎么回复-元素能量系统机制介绍出神入化
- apple-watch怎么升级系统精选视频
- Win7系统更改磁盘卷标排列顺序的操作步骤是什么? 如何更改硬盘驱动器的卷标
- 华为手机系统更新怎么关闭视频学习
- oppo手机系统更新精选视频
- 华为手机系统更新在哪里视频学习