• 内容讲解

1. 什么是虚拟存储器

当代计算机系统的主存主要由半导体存储器组成,由于工艺和成本的原因,主存的容量受到限制。然而,计算机系统软件和应用软件的功能不断增强,程序规模迅速扩大,要求主存的容量越大越好,这就产生了矛盾。为了给大的程序提供方便,使它们摆脱主存容量的限制,可以由操作系统把主存和辅存这两级存储系统管理起来,实现自动覆盖。也就是说,一个大作业在执行时,其一部分地址空间在主存,另一部分在辅存,当所访问的信息不在主存时,则由操作系统而不是程序员来安排I/O指令,把信息从辅存调入主存。从效果上来看,好像为用户提供了一个存储容量比实际主存大得多的存储器,用户无需考虑所编程序在主存中是否放得下或放在什么位置等问题。我们称这种存储器为虚拟存储器。

虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。它借助于磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。虚拟存储器指的是主存-外存层次,它以透明的方式为用户提供了一个比实际主存空间大得多的程序地址空间。

物理地址是实际的主存单元地址,由CPU地址引脚送出,是用于访问主存的。设CPU地址总线的宽度为m位,则物理地址空间的大小就是2m

虚拟地址是用户编程时使用的地址,由编译程序生成,是程序的逻辑地址,其地址空间的大小受到辅助存储器容量的限制。显然,虚拟地址要比实际地址大得多。程序的逻辑地址空间称为虚拟地址空间。

程序运行时,CPU以虚拟地址来访问主存,由辅助硬件找出虚拟地址和实际地址之间的对应关系,并判断这个虚拟地址指示的存储单元内容是否已装入主存。如果已在主存中,则通过地址变换,CPU可直接访问主存的实际单元;如果不在主存中,则把包含这个字的一个存储块调入主存后再由CPU访问。如果主存已满,则由替换算法从主存中将暂不运行的一块调回外存,再从外存调入新的一块到主存。

从原理角度看,虚拟存储器和Cache-主存层次有不少相同之处。事实上,前面提到的各种控制方法是先应用于虚拟存储器中,后来才发展到Cache-主存层次中去的。不过,Cache-主存层次的控制完全由硬件实现,所以对各类程序员是透明的;而虚拟存储器的控制是软硬件相结合的,对于设计存储管理软件的系统程序员来说是不透明的,对于应用程序员来说是透明的。

主存-外存层次和Cache-主存层次所使用的地址变换及映射方法和替换策略,从原理上看是相同的,都基于程序局部性原理。它们遵循的原则是:

(1)把程序中最近常用的部分驻留在高速的存储器中;

(2)一旦这部分变得不常用了,把它们送回到低速的存储器中;

(3)这种换入换出是由硬件或操作系统完成的,对用户是透明的;

(4)力图使存储系统的性能接近高速存储器,价格接近低速存储器。

两种存储系统的主要区别在于:在虚拟存储器中未命中的性能损失,要远大于Cache系统中未命中的损失。

2. 主存-外存层次的基本信息传送单位

主存-外存层次的基本信息传送单位可采用页、段和段页3种不同的方案。根据地址格式的不同,虚拟存储器可分成页式虚拟存储器、段式虚拟存储器和段页式虚拟存储器3种。

页式和段式存储结构采用二维地址格式,它们把整个存储器空间(包括主存、辅存和虚拟存储器)分成若干个页或段,每个页或段又包含若干个存储单元。段页式存储结构采用三维地址格式,它把整个存储器分成若干个段,每段又分成若干页,每页包含若干个存储单元。

页式管理系统以定长的页为基本信息传送单位,主存的物理空间也被分成等长的页,每一页等长的区域称为页面,页面在主存中的位置是固定的。因此,页面的起始地址和结束地址都是固定的,这给页表的制作带来很大的方便。新页调入主存也很容易,只要有空闲的页面就可容纳。

把主存按段分配的存储管理方式称为段式管理。段是利用程序的模块化性质,按照程序的逻辑结构划分成多个相对独立的部分,如过程、数据表、阵列等。段作为独立的逻辑单位可以被其他程序段调用,这样就形成了段间连接,产生规模较大的程序。因此,把段作为基本信息单位在主存-外存之间传送和定位是比较合理的。一般用段表来指明各段在主存中的位置,每段都有它的名称(用户名称或数据结构名称或段号)、段起点、段长等。段表也是主存的一个可再定位的段。段式管理的优点是段的分界与程序的自然分界相对应,段的逻辑独立性使它易于编译、管理、修改和保护,也便于多道程序共享。某些类型的段(例如堆栈、队列)具有动态可变长度,允许自由调度以便有效利用主存空间。但是,正因为段的长度各不相同,段的起始地址和结束地址不定,这给主存空间分配带来麻烦,而且容易在段间留下许多碎片不好利用,造成浪费,这种浪费比页式管理系统要大。

页式存储管理和段式存储管理各有优缺点,段页式存储管理则是结合两者优点的一种方案。程序按模块分段,段内再分页,进入主存仍以页为基本信息传送单位,用段表和页表(每段一个页表)进行两级定位管理。