简介
外页表是指虚页号与磁盘实地址的对应表。外页表主要作用是实现虚地址到辅存实地址的转换。与之相反,虚页号和内存实地址的对应表称为内页表。外页表的内容是在将程序装入辅存时填写的,其中M是装入位。M=1时,表示该扇区中的页已从海量存储器装入磁盘,通常将外页表放于辅存中,当发生缺页中断需要查用时才将它调入内存,从虚页表找外页表可由软件实现1。
虚拟存储器当代计算机系统的主存主要由半导体存储器组成,由于工艺和成本的原因,主存的容量受到限制。然而,计算机系统软件和应用软件的功能不断增强,程序规模迅速扩大,要求主存的容量越大越好,这就产生了矛盾。为了给大的程序提供方便,使它们摆脱主存容量的限制,可以由操作系统把主存和辅存这两级存储系统管理起来,实现自动覆盖。也就是说,一个大作业在执行时,其一部分地址空间在主存,另一部分在辅存,当所访问的信息不在主存时,则由操作系统而不是程序员来安排I/O指令,把信息从辅存调入主存。从效果上来看,好像为用户提供了一个存储容量比实际主存大得多的存储器,用户无需考虑所编程序在主存中是否放得下或放在什么位置等问题。我们称这种存储器为虚拟存储器。
虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。它借助于磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。虚拟存储器指的是主存-外存层次,它以透明的方式为用户提供了一个比实际主存空间大得多的程序地址空间。
物理地址是实际的主存单元地址,由CPU地址引脚送出,是用于访问主存的。设CPU地址总线的宽度为m位,则物理地址空间的大小就是2。
虚拟地址是用户编程时使用的地址,由编译程序生成,是程序的逻辑地址,其地址空间的大小受到辅助存储器容量的限制。显然,虚拟地址要比实际地址大得多。程序的逻辑地址空间称为虚拟地址空间。
程序运行时,CPU以虚拟地址来访问主存,由辅助硬件找出虚拟地址和实际地址之间的对应关系,并判断这个虚拟地址指示的存储单元内容是否已装入主存。如果已在主存中,则通过地址变换,CPU可直接访问主存的实际单元;如果不在主存中,则把包含这个字的一个存储块调入主存后再由CPU访问。如果主存已满,则由替换算法从主存中将暂不运行的一块调回外存,再从外存调入新的一块到主存。
从原理角度看,虚拟存储器和Cache-主存层次有不少相同之处。事实上,前面提到的各种控制方法是先应用于虚拟存储器中,后来才发展到Cache-主存层次中去的。不过,Cache-主存层次的控制完全由硬件实现,所以对各类程序员是透明的;而虚拟存储器的控制是软硬件相结合的,对于设计存储管理软件的系统程序员来说是不透明的,对于应用程序员来说是透明的。
主存-外存层次和Cache-主存层次所使用的地址变换及映射方法和替换策略,从原理上看是相同的,都基于程序局部性原理。它们遵循的原则是:
(1)把程序中最近常用的部分驻留在高速的存储器中;
(2)一旦这部分变得不常用了,把它们送回到低速的存储器中;
(3)这种换入换出是由硬件或操作系统完成的,对用户是透明的;
(4)力图使存储系统的性能接近高速存储器,价格接近低速存储器。
两种存储系统的主要区别在于:在虚拟存储器中未命中的性能损失,要远大于Cache系统中未命中的损失。
页面页面和物理块分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从 0 开始,如第 0 页、第 1 页等。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如 0 # 块、1 # 块等等。 在为进程分配内存时, 以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片” 。
页面大小在分页系统中的页面其大小应适中。页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。然而,如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。因此,页面的大小应选择适中,且页面大小应是 2 的幂,通常为 512 B~8 KB。
页表机制在请求分页系统中所需要的主要数据结构是页表。其基本作用仍然是将用户地址空间中的逻辑地址变换为内存空间中的物理地址。由于只将应用程序的一部分调入内存,还有一部分仍在盘上,故须在页表中再增加若干项,供程序(数据)在换进、换出时参考。在请求分页系统中的每个页表项如下所示:
现对其中各字段说明如下:
(1) 状态位 P:用于指示该页是否已调入内存,供程序访问时参考。
(2) 访问字段 A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供选择换出页面时参考。
(3) 修改位 M:表示该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,若未被修改,在置换该页时就不需再将该页写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本。简言之,M 位供置换页面时参考。
(4) 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考2。
缺页中断机构在请求分页系统中,每当所要访问的页面不在内存时,便产生一缺页中断,请求 OS 将所缺之页调入内存。缺页中断作为中断,它们同样需要经历诸如保护 CPU 环境、分析中断原因、转入缺页中断处理程序进行处理、恢复 CPU 环境等几个步骤。但缺页中断又是一种特殊的中断,它与一般的中断相比,有着明显的区别,主要表现在下面两个方面:
(1) 在指令执行期间产生和处理中断信号。通常,CPU 都是在一条指令执行完后,才检查是否有中断请求到达。若有,便去响应,否则,继续执行下一条指令。然而,缺页中断是在指令执行期间,发现所要访问的指令或数据不在内存时所产生和处理的。
(2) 一条指令在执行期间,可能产生多次缺页中断。在图 4-24 中示出了一个例子。如在执行一条指令 COPY A TO B 时, 可能要产生 6 次缺页中断, 其中指令本身跨了两个页面,A 和 B 又分别各是一个数据块,也都跨了两个页面。基于这些特征,系统中的硬件机构应能保存多次中断时的状态,并保证最后能返回到中断前产生缺页中断的指令处继续执行。
地址变换机构请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,再为实现虚拟存储器而增加了某些功能而形成的,如产生和处理缺页中断,以及从内存中换出一页的功能等等。图 4-25 示出了请求分页系统中的地址变换过程。在进行地址变换时,首先去检索快表,试图从中找出所要访问的页。若找到,便修改页表项中的访问位。对于写指令,还须将修改位置成“1” ,然后利用页表项中给出的物理块号和页内地址形成物理地址。地址变换过程到此结束。
如果在快表中未找到该页的页表项时,应到内存中去查找页表,再从找到的页表项中的状态位 P,来了解该页是否已调入内存。若该页已调入内存,这时应将此页的页表项写入快表,当快表已满时,应先调出按某种算法所确定的页的页表项,然后再写入该页的页表项;若该页尚未调入内存,这时应产生缺页中断,请求 OS 从外存把该页调入内存。