组成原理(十一):存储系统之 虚拟存储器
虚拟存储器由 主存储器 和 辅助存储器(磁盘存储器) 共同组成。
1、虚拟存储器的基本概念
虚拟存储器将主存和辅存的地址空间统一编址,形成一个庞大的存储空间。在该空间中,不必考虑程序在主存中是否装得下以及这些程序将来在主存中的实际存放位置。
用户编程的地址称为 虚地址或逻辑地址,实际的主存单元称为实地址或物理地址。
实际物理存储磁层,所有程序和数据在OS的管理下,先送入磁盘,然后操作系统将当前运行所需要的部分带入主存,供CPU使用,其余暂不运行部分了留在磁盘中。
程序运行时,CPU以虚地址来访问主存,由辅助硬件找出虚地址和实地址之间的对应关系,并判断该虚地址指示的存储单元内容是否已装入主存。若已在主存中,通过地址变换,CPU可直接访问主存的实际单元;若不在主存中,则把包含这个字的一页或一个程序段调入主存后再由CPU访问;若主存已满,则由替换算法从主存中将暂不运行的一页或一段调回辅存,再从辅存调入新的一页或一段到主存。
2、页式虚拟存储器
以页为基本单位的虚拟存储器称为页式虚拟存储器。主存空间和虚存空间都划分为若干个大小相等的页。主存即实存的页称为实页,虚存的页称为虚页。
程序虚地址分为两个字段:高位字段为虚页号,地位字段为页内地址。虚地址到实地址之间的变换由页表来实现。
页表是一张存放在主存中的虚页号和实页号的对照表,记录着程序的虚页调入主存时被安排在主存中的位置。
在多道程序工作方式下,OS为每个用户作业建立一个页表,硬件中设置一个页表基址寄存器,存放当前所运行程序的页表的起始地址。
页表中的每一行记录了与某个虚页对应的若干信息,包虚页号、装入位和实页号等。
页表基址寄存器和虚页号拼接成页表索引地址,根据索引地址可读到一个页表信息字,检测页表信息字中装入位的状态。若状态为"1",表示该页面已在主存中,将对的实页号与虚地址中的页内地址拼接得到完整的实地址;若装入位为"0",表示页面不再主存中,启动I/O系统,将该页从辅存中调入主存后再供CPU使用。
页式虚拟存储器,容易造成内碎片。
3、段式虚拟存储器
段式存储器中的段是按照程序的逻辑结构划分的,段的长度因程序而异。
为了把程序虚地址变换为实主存实地址,需要一个段表,段表中每一行记录了某个段对应的若干信息,包括段号、装入位、段起点和段长等。
段表一般驻留在主存中,若装入位为"1",表示该段已调入主存;若装入位为"0",表示该段不再主存。
程序在主存中的分配及段表:
程序使用的虚地址包含两部分:段号和段内地址。
段式虚拟存储器的虚-实地址变换过程:
CPU根据虚地址访存时,首先将段号与段表的起始地址相拼接,形成访问段表对应行的地址,然后根据段表内装入位判断该段是否已调入主存。若已调入主存,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。
段式虚拟存储器,容易造成外碎片。
4、段页式虚拟存储器
段页是虚拟存储器将存储空间按逻辑块分成段,每段又分成若干个页,访存通过一个段表和若干个页表进行。主存空间划分为若干同样大小的页。
虚存和实存之间以页为基本传送单位,每个程序对应一个段表,每段对应一个页表。
CPU访问时,虚地址包含段号、段内页号、页内地址 三部分。
段表的起始地址与段号合成,得到段表地址;再从段表中取出该段页表起始地址,与段内页号合成,得到页表地址;最后从页表中取出实页号,与页内地址拼接形成主存实地址。
段的长度必须必须是页长的整数倍,段的起点必须是某一页的起点。
5、快表与慢表
在虚拟存储器中,访问主存的速度受到极大的影响。页式/段氏虚拟存储器,必须先查页表或段表;段页式虚拟存储器,既要插段表又要查页表。
若想访问虚存的速度接近访问主存的速度,增设快表。
将当前最常用的页表信息存放在一个小容量的高速存储器中,称为"快表"(TLB),当快表中查不到时,再从存放在主存中的页表中查找实页号。
存放在主存中页表,称为"慢表"。快表是慢表的一个副本,只存放了慢表中的部分信息。