B.4 虚拟存储器
一、基本概念
1、虚拟存储器把物理存储器划分成块以后分配给不同的进程;采用一种保护机制来限制各个进程,使其仅能访问属于自己的块。
2、重定位机制允许同一程序在物理存储器中的任意位置运行。
3、页和段用于块,缺页错误和地址错误用于缺失。存储器映射或地址变换:处理器生成虚拟地址,由软硬件组合方式转换成物理地址,再访问主存储器。
4、缓存vs虚拟存储器
(1)缓存缺失主要由硬件控制,虚拟存储器替换主要由操作系统控制。
(2)处理器地址空间大小决定虚拟存储器大小,但是缓存大小与处理器地址空间大小无关。
(3)辅助存储不仅用于充当主存储器的后援存储,还用于文件系统,事实上文件系统占用了大部分辅助存储。
5、虚拟存储器系统的两类:采用固定大小块的页和采用可变大小块的段。
页:寻址方式有一个固定大小的地址,分为页编号和业内偏移量。
段:一个字表示段号,一个字表示段内偏移量。
二、四个问题
(1)一个块可以放在主存储器什么位置?
为了降低缺失代价(旋转磁存储缺失代价高昂),因此操作系统允许块放在主存储器的任何地方。可以标记为全相联。
(2)如果一个块在主存储器中,怎么找到它?
依靠一种按照段号或者页号索引的数据结构(含有块的地址)。分段会将偏移量加到相关的物理地址中获得最终地址;分页则只是被联系到这一物理页地址。物理页地址通常采用页表的数据结构,通过虚拟页号进行索引,大小就是虚拟空间的页数。
(3)在虚拟存储器缺失时应该替换哪个块?
操作系统最高指导准则是将缺页错误降到最低。应该尝试替换最近最少使用(LRU)的块。
为了班助操作系统评估LRU,很多处理器提供了一个使用位或参考位,一般情况下在发生缓冲区缺失时对其置位(在逻辑上只要访问一个页就对其置位)。操作系统定期清除这些使用位,之后再记录它们,判读一个特定时间段用了哪一些页。
(4)在写入时发生了什么?
采用写回策略,由于对第一级的非必要访问成本太高,所以虚拟存储系统通常包含一个脏位,可以仅将上次读取磁盘后修改过的块写至磁盘。
三、快速地址变换技术
分页意味着每次存储器访问在逻辑上至少要分两次进行,第一次是获得物理地址第二次是为了获得数据。我们可以通过局部性来避免增加存储器的访问次数。变换(旁路)缓冲区(TLB/TB):将地址变换局限在一个特殊缓存中,存储器访问就很少再需要第二次访问来转换数据,这一特殊地址变换缓存就是变换(旁路)缓冲区(TLB/TB)。
TLB项好像是缓存中的一个条目,其中的标记保存了虚拟地址部分,数据部分保存了物理页帧编号、保护字段、有效位,通常还有一个使用位和脏位。如果要改变页表中某一项的物理页帧编号或保护字段,操作系统必须确认旧项不在TLB中,否则系统不会正常运行。(注:此处的脏位表示对应的页曾经被改写过而不是TLB地址变换或数据缓存中的这些特殊块经过改写;操作系统通过改变页表中的值,然后使TLB项失效来重置这些位;在从页表加载该项时,TLB会获得这些位的准确副本)。
图中描述的是Opteron数据TLB组织方式。
步骤1、2:变换首先向所有的标记发送虚拟地址(这些标签必须标记为有效以允许匹配),第二步还需要根据TLB中的保护信息检查存储器访问的类型是否违规。
步骤3:匹配成功的标记通过一个40选1多路选择器发送相应的物理地址。
步骤4:将业内偏移量和物理页帧合并,生成一个完整的大小为40位的物理地址。
四、选择页面大小
(1)页表的大小与页面大小成反比,因此,增大页面大小可以节省存储器(或其他用于存储器映射的资源)。
(2)B.3节曾经提到,页面较大时,缓存可以更大,缓存命中时间可以更短。
(3)与传递较小的页面相比,从(向)辅助存储传递较大页面(有可能通过网络)的效率更高一些。
(4)TLB条目的数量有限,所以页面较大意味着可以高效地映射更多存储器,从而减少TLB缺失数量。
由于最后这个原因,近来的微处理器决定支持多种页面大小。对于一些程序,TLB缺失对CPI的影响可能与缓存缺失一样大。
采用较小页面的主要目的是节省存储。当虚拟存储器的连续区域的大小不等于页面大小的整数倍时,采用较小的页面可以减少存储的浪费。表示页面中这种未使用存储器的术语是内部碎片化。假定每个进程有3个主要段(文本、堆和栈),每个进程的平均浪费存储量为页面大小的1.5倍。对于有数百MiB存储器、页面大小为4-8 KiB的计算机来说,这点数量是可以忽略的。当然,当页面非常大(超过32KiB)时,就可能浪费存储(主存储器和辅助存储器)和I/O带宽了。最后一个问题是进程启动时间,许多进程很小,所以较大的页面可能会延长调用一个进程的时间。
五、总结
(1)64位的虚拟地址在逻辑上被划分成了虚拟页号和页内偏移量。前者被发送到TLB并且被转换为物理地址,后者的高位被发送到L1缓存,充当索引。
(2)如果TLB缓存命中,那么就会将物理页号发送到L1缓存标记,检查是否匹配。
(3)如果匹配,则是L1缓存命中。块偏移随后为处理器选择该字。如果L1缓存核对为缺失,则使用物理地址尝试L2缓存。
(4)如果L1缓存核对显示为缺失,则使用物理地址尝试L2缓存。物理地址的中间部分用作4MiB L2缓存的索引。将所得到的L2缓存标记与物理地址的上半部分对比,以检查是否匹配。如果匹配,我们得到一次L2缓存命中,数据被送往处理器,处理器使用块偏移量来选择所需字。在发生L2缺失时,会使用物理地址从存储器获取该块。