某虚拟存储系统采用最近最少使用的(LRU)页面淘汰算法,假定系统为每个作业分配4个页面的主存空间,其中一个页面用来存放程序。现有某作业的程序如下:
Var A:Array[1..100,1..100]OF integer;
i,j:integer;
FOR i:=1 to 100 Do
FOR j:=1 to 100 Do
A[i,j]:=0;
设每个页面可存放200个整数变量,变量i、j存放在程序页中。初始时,程序及i、j均已在内存,其余3页为空。若矩阵A按行序存放,那么当程序执行完后 * * 生______次缺页中断;若矩阵A按列序存放,那么当程序执行完后 * * 生______次缺页中断。
A.50
B.100
C.5000
D.10000
参考答案:C
解析:虚拟存储管理的提出就是为了解决这一问题,应用程序在运行之前未必全部装入内存,仅需将当前运行到的那部分程序和数据装入内存便可启动程序的运行,其余部分仍驻留在外存上。当要执行的指令或访问的数据不在内存时,再由操作系统通过请求调入功能将它们调入内存,以使程序能继续执行。如果此时内存已满,则还需通过置换功能,将内存中暂时不用的程序或数据调至外存上,腾出足够的内存空间后,再将要访问的程序或数据调入内存,使程序继续执行。这样,便可使一个大的用户程序能在较小的内存空间中运行,也可在内存中同时装入更多的进程使它们并发执行。从用户的角度看,该系统具有的内存容量比实际的内存容量大得多。将这种具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的存储器系统称为虚拟存储系统。
局部性原理
虚拟存储管理能够在作业信息不全部装入内存的情况下保证作业正确运行,是利用了程序执行时的局部性原理。局部性原理是指程序在执行时呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分。相应地,它所访问的存储空间也仅局限于某个区域。程序局部性包括时间局部性和空间局部性,时间局部性是指程序中的某条指令一旦执行,不久以后该指令可能再次执行。产生时间局部性的典型原因是由于程序中存在着大量的循环操作;空间局部性是指一旦程序访问了某个存储单元,不久以后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址可能集中在一定的范围内,其典型情况是程序顺序执行。
工作集
在虚拟存储管理中,可能会出现这种情况,即对于刚被替换出去的页,立即又要被访问,需要将它调入,因无空闲内存又要替换另一页,而后者是即将被访问的页,于是造成了系统需花费大量的时间忙于进行这种频繁的页面交换,致使系统的实际效率很低,严重时导致系统瘫痪,这种现缘称为抖动现象。防止抖动现象有多种办法,例如,采取局部替换策略、引入工作集算法和挂起若干进程等。工作集是指在某段时间间隔内,进程实际要访问的页面的集合。引入虚拟内存后,程序只需有少量的内存就可运行,但为了使程序有效地运行,较少产生缺页,必须使程序的工作集全部在内存中。
页面置换算法
当内存中没有空闲页面,而又有程序和数据需要从外存中装入内存运行时,就需要从内存中选出一个或多个页面淘汰出去,以便新的程序和数据装入运行,良好的页面置换算法应该淘汰那些被访问概率最低的页,将它们移出内存。
①随机淘汰算法。无法确定哪页被访问的概率较低时,随机地选择某个页面,并将其换出。
②轮转算法。按照内存页面的编号,循环地换出内存中一个可以被换出的页,无论该页是刚换进来还是已驻留内存很长时间。
③先进先出算法(First In First Out,FIFO)。FIFO算法总是选择在内存驻留时间最长的一页将其淘汰。实现FIFO算法需要把各个已分配页面按页面分配时间顺序链接起来,组成FIFO队列,并设置一置换指针,指向FIFO队列的队首页面。FIFO算法忽略了一种现象的存在,那就是在内存中停留时间最长的页往往也是经常要访问的页。将这些页淘汰,很可能刚置换出去,又请求调用该页,致使缺页中断太频繁,严重降低内存的利用率。
FIFO的另一个缺点是它可能会产生一种异常现象。一般来说,对于任一作业或进程,如果给它分配的内存页面数越接近于它所要求的页面数,则发生缺页的次数会越少。但使用FIFO算法时,有时会出现分配的页而数增多,缺页次数反而增加的现象,称为belady现象。
④最近最久未使用算法(Least Recently Used,LRU)。当需要淘汰某一页时,选择离当前时间最近的一段时间内最久没有使用过的页先淘汰。例如,考虑一个仅460个字节的程序的内存访问序列(10,11,104,170,73,309,185,245,246,434,458,364),页面的大小为100个字节,则460个字节应占5页,编号为0~4,第0页字节为0~99,第1页为100~199,依此类推。得到页面的访问序列是(0,0,1,1,0,3,1,2,2,4,4,3),可简化为(0,1,0,3,1,2,4,3)。如果内存中有200个字节可供程序使用,则内存提供2个页帧供程序使用。按照FIF0算法, * * 生6次缺页中断,如表所示。
FIFO算法缺页中断 | |||||||
0 | 1 | 0 | 3 | 1 | 2 | 4 | 3 |
0 | 0 | 0 | 3 | 3 | 3 | 4 | 4 |
1 | 4 | 1 | 1 | 2 | 2 | 3 | |
× | × | × | × | × | × |
LRU算法缺页中断 | |||||||
0 | 1 | 0 | 3 | 1 | 2 | 4 | 3 |
0 | 0 | 0 | 0 | 1 | 1 | 4 | 4 |
1 | 1 | 3 | 3 | 2 | 2 | 3 | |
× | × | × | × | × | × | × |
⑥最优置换算法。选择那些永久不使用的,或者在最长时间内不再被访问的页面置换出去。因为要确定哪个页面是未来最长时间内不再被访问的,目前来说很难估计,所以,该算法通常用来评价其他算法。
⑦时钟页面替换算法(Clock)。使用页表中的引用位,将作业已调入内存的页面链成循环队列,用一个指针指向循环队列中的下一个将被替换的页面。其实现方法如下:一个页面首次装入内存时,其引用位置1;在内存中的任何一个页面被访问时,其引用位置1;淘汰页面时,存储管理从指针当前指向的页面开始扫描循环队列,把所遇到的引用位是1的页面的引用位清0,并跳过这个页面;把所遇到的引用位是0的页面淘汰掉,指针推进一步:扫描循环队列时,如果遇到的所有页面的引用位均为1,则指针就会绕整个循环队列一圈,将碰到的所有页面的引用位清0;指针停在起始位置,并淘汰掉这一页,然后指针推进一步。
在本题中,从题干可知,作业共有4个页面的主存空间,其中一个已被程序本身占用,所以在读取变量时可用的页面数只有3个。每个页面可存放200个整数变量,程序中A数组共有100*100=10000个变量。按行存放时,每个页面调入的200变量刚好是程序处理的200个变量,所以缺页次数为10000/200=50。而按列存放时,虽然每个页面调取数据时,同样也读入了200个变量,但这200个变量中,只有2个是近期需要访问的(如:第1个页面调入的是A[*,1]与A[*,2],但程序近期需要访问的变量只有A[1,1]和A[1,2]),所以缺页次数为:10000/2=5000。