一、虚拟存储器工作原理
页式虚拟存储器是虚拟存储器中用得比较广泛的一种,另外的段式虚拟存储器和段页式虚拟存储器主要是因为地址变换方法不同产生的。
页式虚拟存储器:把主存储器、磁盘存储器和虚拟存储器都划分成固定大小的块--页(Page).
主存储器的页称为实页,虚拟存储器中的页称为虚页。
内部地址变换:多用户虚拟地址Av变换成贮存实地址A
多用户虚拟地址中的页内偏移量D直接作为主存实地址中的页内偏移d
主存实页号p与它的页内偏移d直接拼接就得到主存是地址A
一个用户程序要访问虚拟存储器时,必须给出多用户虚拟地址Av。在操作系统和有关硬件的共同管理下,首先进行内部地址变换。
如果变换成功(命中),得到主存实页号p。把主存实页号p与它的页内偏移d直接拼接起来就得到主存实地址A,访问主存储器。
如果内部地址变换失败(未命中),表示要访问数据不在主存储器中,必须访问磁盘存储器。这时,进行外部地址变换。
外部地址变换主要用软件实现,首先查外页表得到与虚页号P相对应的磁盘存储器的实地址,然后再查内页表(主存实页表),看主存储器中是否有空页。如果主存储器中还有空页,只要找到空页号。把磁盘存储器的实地址和主存储器的实页号送入输入输出处理机(输入输出通道)等,在输入输出处理机的控制下,把要访问数据所在的一整页都从磁盘存储器调入到主存储器。
如果主存储器中已经没有空页,则要采用某种页面替换算法,先把主存中暂时不用的一页写回到磁盘存储器中原来的位置上,以便腾出空位置来存放新的页。
在进行外部地址变换时,如果没有命中,则表示所需要的页还不在磁盘存储器中。这时,要在操作系统控制下,启动磁带机、光盘存储器等海量存储器,先把与所需要数据相关的文件从海量存储器中调入磁盘存储器。
二、地址映像与变换
虚拟地址空间:虚存空间或虚拟存储器空间,是应用程序员用来编写程序的地址空间,这个地址空间非常大。
主存储器的地址空间:主存地址空间、主存物理空间或实存地址空间
辅存地址空间:磁盘存储器的地址空间
虚拟地址:虚存空间上的地址,又称为虚存地址或者虚地址
主存地址:又称为主存实地址、主存物理地址、主存储器地址
磁盘存储器地址:又称为磁盘地址、辅存地址
三、虚拟存储方法
1、段式虚拟存储器
1、程序的模块化性能好。
2、便于程序和数据的共享。
3、程序的动态链接和调度比较容易。
4、便于实现信息保护。在一般情况下,一段程序是否需要保护是根据这个段程序的功能来决定的。
1、地址变换所花费的时间比较长。从多用户虚地址变换到主存实地址需要查两次表,做两次加法运算。
2、主存储器的利用率往往比较低。
3、对辅存(磁盘存储器)的管理比较困难。磁盘存储器通常是按固定大小的块来访问的,如何把不定长度的程序段映象到固定长度的磁盘存储器中,需要做一次地址变换。
2、页式虚拟存储器
4、外部地址变换
前面介绍了内部地址映象和变换方法,即把虚拟地址空间映象到主存物理地址空间,以及把虚拟地址变换成主存实地址。当页表或段表中的有效位指示发生页面失效时,表示需要访问的那一页或那一个程序段还没有装入到主存储器中,这时必须进行外部地址变换。
四、页面替换算法
1、随机算法,即RAND算法(Random algorithm)。
利用软件或硬件的随机数发生器来确定主存储器中被替换的页面。这种算法最简单,而且容易实现。但这种算法完全没有利用主存储器中页面调度情况的历史信息,也没有反映程序的局部性,所以命中率比较低。
2、先进先出算法,即FIFO算法(First-In First-Out algorithm)。
这种算法选择最先调入主存储器的页面作为被替换的页面。它的优点是比较容易实现,能够利用主存储器中页面调度情况的历史信息,但是,没有反映程序的局部性。因为最先调入主存的页面,很可能也是经常要使用的页面。
3、近期最少使用算法,LFU算法(LeastFrequently Used algorithm)。
这种算法选择近期最少访问的页面作为被替换的页面。显然,这是一种非常合理的算法,因为到目前为止最少使用的页面,很可能也是将来最少访问的页面。该算法既充分利用了主存中页面调度情况的历史信息,又正确反映了程序的局部性。但是,这种算法实现起来非常困难。它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。在选择被替换页面时,要从所有计数器中找出一个计数值最大的计数器。因此,通常采用另外一种变通的办法,就是下面的LRU算法。
4、最久没有使用算法,LRU算法(LeastRecently Used algorithm)。
这种算法把近期最久没有被访问过的页面作为被替换的页面。它把LRU算法中要记录数量上的"多"与"少"简化成判断"有"与"无",因此,实现起来比较容易。
5、最优替换算法,OPT算法(OPTimal replacemant algorithm)。
上面介绍的几种页面替换算法主要是以主存储器中页面调度情况的历史信息为依据的,它假设将来主存储器中的页面调度情况与过去一段时间内主存储器中的页面调度情况是相同的。显然,这种假设不总是正确的。最好的算法应该是选择将来最久不被访问的页面作为被替换的页面。这种替换算法的命中率一定是最高的。这就是最优替换算法,简称OPT算法。
要实现OPT算法,唯一的办法是让程序先执行一遍,记录下实际的页地址流情况。根据这个页地址流才能找出当前要被替换的页面。显然,这样做是不现实的。因此,OPT算法只是一种理想化的算法,实际上,经常把这种算法用来作为评价其它页面替换算法好坏的标准。在其它条件相同的情况下,哪一种页面替换算法的命中率与OPT算法最接近,那么,它就是一种比较好的页面替换算法。
例1:一个程序共有5个页面组成,分别为P1~P5。程序执行过程中的页地址流(即程序执行中依次用到的页面)如下:P1,P2,P1,P5,P4,P1,P3,P4,P2,P4,假
设分配给这个程序的主存储器共有3个页面。图中,用"*"号标记下次将要被替换掉的页面。
就本例而言,FIFO命中次数2次,命中率Hp=2/10=0.2
LRU命中次数4次,命中率Hp=4/10=0.4
OPT命中次数5次,命中率Hp=5/10=0.5
假设每个数据平均被访问30次,为了使LRU算法的失效率小于10-5,页面应该至少多大?
(1-Hp)/n =(1-0.4)/30P <10-5
解得P>2000字,页面大小应该为2K字
五、影响主存命中率的因素
1、程序在执行过程中的页地址流分布情况。
2、所采用的页面替换算法。
3 、页面大小。
4 、主存储器的容量
5 、所采用的页面调度方法