所谓虚拟存储器(Virtual Memory),就是采用一定的方法将一定的外存容量模拟成内存,同时对程序进出内存的方式进行管理,从而得到一个比实际内存容量大得多的内存空间,使得程序的运行不受内存大小的限制。虚拟存储区的容量与物理主存大小无关,而受限于计算机的地址结构和可用磁盘容量。
虚拟存储器是由硬件和操作系统自动实现存储信息调度和管理的。它的工作过程包括6个步骤:
①中央处理器访问主存的逻辑地址分解成组号a和组内地址b,并对组号a进行地址变换,即将逻辑组号a作为索引,查地址变换表,以确定该组信息是否存放在主存内。
②如该组号已在主存内,则转而执行④;如果该组号不在主存内,则检查主存中是否有空闲区,如果没有,便将某个暂时不用的组调出送往辅存,以便将这组信息调入主存。
③从辅存读出所要的组,并送到主存空闲区,然后将那个空闲的物理组号a和逻辑组号a登录在地址变换表中。
④从地址变换表读出与逻辑组号a对应的物理组号a。
⑤从物理组号a和组内字节地址b得到物理地址。
⑥根据物理地址从主存中存取必要的信息。
调度方式有分页式、段式、段页式3种。 1、页式调度 页式调度是将逻辑和物理地址空间都分成固定大小的页。主存按页顺序编号,而每个独立编址的程序空间有自己的页号顺序,通过调度辅存中程序的各页可以离散装入主存中不同的页面位置,并可据表一一对应检索。页式调度的优点是页内零头小,页表对程序员来说是透明的,地址变换快,调入操作简单;缺点是各页不是程序的独立模块,不便于实现程序和数据的保护。 2、段式调度 段式调度是按程序的逻辑结构划分地址空间,段的长度是随意的,并且允许伸长,它的优点是消除了内存零头,易于实现存储保护,便于程序动态装配;缺点是调入操作复杂。 3、段页式调度 将这两种方法结合起来便构成段页式调度。在段页式调度中把物理空间分成页,程序按模块分段,每个段再分成与物理空间页同样小的页面。段页式调度综合了段式和页式的优点。其缺点是增加了硬件成本,软件也较复杂。大型通用计算机系统多数采用段页式调度。
虚拟存储器和主存Cache 存储器是两个不同存储层次的存储体系。在概念上两者有不少相同之处:但由主存 - 辅存组成的虚拟存储器和主存Cache 存储器亦有很多不同之处:
●Cache 存储器采用与CPU速度匹配的快速存储元件弥补了主存和CPU之间的速度差距,而虚拟存储器虽然限度地减少了慢速辅存对CPU的影响,但它的主要功能是用来弥补主存和辅存之间的容量差距,具有提供大容量和程序编址方便的优点。
●两个存储体系均以信息块作为存储层次之间基本信息的传送单位,Cache存储器每次传送的信息块是定长的,只有几十字节,而虚拟存储器信息块划分方案很多,有页、段等等,长度均在几百~几百K 字节左右。
●CPU访问快速Cache存储器的速度比访问慢速主存快5 ~ 10倍。虚拟存储器中主存的速度要比辅存缩短100 ~ 1000 倍以上。
●主存Cache 存储体系中CPU与Cache和主存都建立了直接访问的通道。一旦不命中时,CPU 就直接访问主存并同时向Cache调度信息块,从而减少了CPU等待的时间。而辅助存储器与CPU之间没有直接通路,一旦在主存不命中时,只能从辅存调块到主存。因为辅存的速度相对CPU的差距太大,调度需要毫秒级时间,因此,CPU一般改换执行另一个程序,等到调度完成后才返回原程序继续工作。
●Cache 存储器存取信息的过程、地址变换和替换策略全部用硬件实现,对程序员均是透明的。而主存- 辅存层次的虚拟存储器基本上是由操作系统的存储管理软件并辅助一些硬件来进行信息块的划分和主存 - 辅存之间的调度,所以对设计存储管理软件的系统程序员来说,它是不透明的,而对广大用户,因为虚拟存储路提供了庞大的逻辑空间可以任意使用,所以对应用程序员是透明的。
虚拟存储器地址变换基本上有3种形虚拟存储器工作过程式:全联想变换、直接变换和组联想变换。任何逻辑空间页面能够变换到物理空间任何页面位置的方式称为全联想变换。每个逻辑空间页面只能变换到物理空间一个特定页面的方式称为直接变换。组联想变换是指各组之间是直接变换,而组内各页间则是全联想变换。替换规则用来确定替换主存中哪一部分,以便腾空部分主存,存放来自辅存要调入的那部分内容。常见的替换算法有4种。
①随机算法:用软件或硬件随机数产生器确定替换的页面。
②先进先出:先调入主存的页面先替换。
③近期最少使用算法:替换最长时间不用的页面。
④算法:替换最长时间以后才使用的页面。这是理想化的算法,只能作为衡量其他各种算法优劣的标准。
虚拟存储器的效率是系统性能评价的重要内容,它与主存容量、页面大小、命中率,程序局部性和替换算法等因素有关。
一、页式虚拟存储器
在页式虚拟存储系统中,将程序按统一的大小划分成多个页,同时也将虚拟存储器划分为同样大小的页,其中虚拟空间的页称为虚页(逻辑页),而主存空间的页称为实页(物理页),并对这些页按地址从低到高的顺序编号。
在编程时,程序的虚地址由高位字段的虚页号和低位字段的页内地址两部分组成,虚页号标识页。虚地址到实地址之间的变换是由页表来实现的。页表是一张存放在主存中的虚页号和实页号的对照表,记录着程序的虚页调入主存时被安排在主存中的位置。若计算机采用多道程序工作方式,则可为每个用户作业建立一个页表,硬件中设置一个页表基址寄存器,存放当前所运行程序的页表的起始地址。
页表中的每一行记录了与某个虚页对应的若干信息,包括虚页号、装入位和实页号等。页表基址寄存器和虚页号拼接成页表索引地址。根据这个索引地址可读到一个页表信息字,然后检测页表信息字中装入位的状态。若装入位为1,表示该页面已在主存中,将对应的实页号与虚地址中的页内地址相拼接就得到了完整的实地址;若装入位为0,表示该页面不在主存中,于是要启动I/O系统,把该页从辅存中调入主存后再供CPU使用,若主存已满,还需要使用替换算法替换页。如图所示给出了页式虚拟存储器的虚-实地址的变换过程。
页式虚拟存储器虽然能实现虚拟存储,但它还存在一些不足。
(1)由于采用定长的页,虽然建立页表方便,页的调入也容易实现。但由于程序不可能正好是页面的整倍数,那么一页的零头将无法利用而造成空间浪费。
(2)由于页不是逻辑上独立的实体,这给程序的处理、保护和共享等带来了麻烦。
二、段式虚拟存储器
在段式虚拟存储器系统中,将程序按其逻辑结构划分为段,各个段的长度因程序而异。段式虚拟存储器借助于段表来实现虚地址与实地址的转换。段表中每一行记录了某个段对应的若干信息,包括段号、装入位、段起点和段长等。装入位为1,表示该段已调入主存;装入位为0,则表示该段不在主存中。段表其实本身也是一个段,可以存放在辅存中,但一般存放在主存中。
在段式虚拟存储器系统中,虚地址由段号和段内地址两部分组成,如图3-18所示给出了段式虚拟存储器的虚-实地址的变换过程。
由于段式虚拟存储器的段具有逻辑独立性,因此它易于程序的处理、保护和共享等操作,但是,因为段的长度参差不齐,给主存空间分配带来了麻烦,同时很可能也会带来一定的空间浪费。
三、段页式虚拟存储器
段页式虚拟存储器是对段式、页式虚拟存储器的综合,它先将程序按其逻辑结构分段,再将每段划分为若干大小相等的页,同时将主存空间划分为同样大小的块。
因为段页式存储管理对逻辑地址进行了两次划分,次将逻辑地址划分为若干段,第二次将每个段划分为若干页。因此,要对内存正常寻址,不仅要知道将要访问的地址属于哪个段,也要知道该地址属于该段的哪个页。逻辑页与物理块一一对应,所以需要页表来记录各页对应的块号,且因为每个段都分成了很多页,所以每个段都需要一个页表。同时,作业分成了很多段,为了统一管理,系统需要知道每个段的分页情况,所以又要设置一个段表来记录每个段所对应的页表。
作业将要执行其中的某个语句时,根据其地址计算出段号、页号和页内地址。首先根据段号查找段表,得到该段的页表的起始地址,然后查找页表,得到该页对应的块号,根据块的大小和页内地址计算出该语句的内存地址。
维库电子通,电子知识,一查百通!
已收录词条48237个