请求分页也称为页式虚拟存储管理,它是建立在基本分页基础上,为了能支持虚拟存储器功能而增加了请求调页功能和页面置换功能。
基本思想:
在进程开始运行之前,不是装入全部页面,而是装入部分页面,之后根据进程运行的需要,动态装入其它页面。当内存空间已满,而又需要装入新的页面时,根据某种算法淘汰某个页面,以便装入新的页面。
1.1 请求分页存储管理的硬件支持
为了实现页式虚拟存储管理,系统需要解决下面3个问题:
-
(1) 系统如何获知进程当前所需页面不在主存?
-
(2) 当发现缺页时,如何把所缺页面调入主存?
-
(3) 当主存中没有空闲区时,为了接受一个新页,需要淘汰某个页面,根据什么策略选择淘汰的页面?
页表机制
在请求分页系统中,页表的基本作用仍然是将用户地址空间中的逻辑地址变换为内存空间中的物理地址。
-
内存块号:这是最重要的数据,地址映射的目的就是要找到内存块号。
-
状态位:用于指示该页是否已调入内存。
-
访问字段:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供选择换出页面时参考。
-
修改位:表示该页在调入内存后是否被修改过,供置换页面时参考。由于内存中的每个页面都在外存上保留一份副本,因此,如果未被修改,在置换该页时就不需要将该页写回到外存上,以减少系统开销和启动磁盘的次数;如果已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本。
-
外存地址:用于指出该页在外存上的地址,供调入该页时参考。
缺页中断机构
-
程序在执行时,当访问的页面不在内存时,便产生缺页中断,请求操作系统将所缺页调入内存。中断处理程序将把控制转向缺页中断子程序。然后系统执行此子程序,把所缺页面装入主存中。
-
缺页中断是一种特殊的中断,同样需要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理、恢复CPU环境等几个步骤,但与一般的中断相比,它又具有以下不同点:
-
(1) 一般中断是一条指令完成后中断,而缺页中断是在一条指令执行时中断。通常,CPU都是在一条指令执行完之后,才检查是否有中断请求到达。如果有,便去响应中断,否则,继续执行下一条指令。然而,缺页中断则是在指令执行期间,发现所访问的指令或数据不在内存时所产生和处理的。
-
(2) 一条指令执行时可能产生多个缺页中断。如指令可能访问多个内存地址,这些地址在不同的页中。例如,CPU执行指令Copy A To B(其中指令本身跨两个页面,A和B又分别是一个数据块,也都跨了两个页面)时,系统就有可能产生6次中断。
-
地址变换机构
请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,为实现虚拟存储器而增加了某些功能而形成的,例如,产生和处理缺页中断,以及从内存中换出一页的功能等等。
1.2 页面置换算法
在请求分页存储管理中,如果所访问的页面不在内存而需要把该页从外存调入内存,但内存已无空闲空间时,操作系统必须采取一定的策略,从内存中挑选一个或多个页面送到磁盘的对换区中,以腾出足够的空间装入新的页面。通常把选择换出页面的算法称为页面置换算法。
最佳(Optimal)置换算法
-
其所选择的被淘汰页面将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可以保证获得最低的缺页率。但由于目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的 。
-
假定系统为某进程分配了3个物理块,并考虑有以下的页面号引用串: 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
-
采用最佳置换算法时的置换图,系统共发生了6次页面置换。
先进先出(FIFO)页面置换算法
-
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
-
利用FIFO算法总共进行了12次页面置换,比最佳置换算法正好多一倍。
最近最久未使用(LRU)置换算法
-
根据页面调入内存后的使用情况来进行置换决策的。LRU算法利用“最近的过去”作为“不久的将来”的近似,选择最近一段时间内最久没有使用的页面淘汰掉,这也正体现出程序运行中所表现出的时间局部性特征。
-
采用LRU算法产生了12次缺页 。
LRU的近似算法
-
(1) 简单的时钟(Clock)置换算法
-
简单的时钟置换算法也称第二次机会置换法,是对FIFO算法的改进,以避免把经常访问的页面置换出去。采用简单的Clock算法时,只需为每个页面设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当需要进行页面置换时,按照FIFO算法,检查最老页面的访问位:如果是0,就立即淘汰该页;如果访问位为1,则重新将它置0,暂不换出,而给它第二次驻留内存的机会,并选择下一个FIFO页。当检查到队列中的最后一个页面时,如果其访问位仍为1,则再返回到队首去检查第一个页面。又把该算法称为最近未使用算法NRU(Not Recently Used)。
-
-
(2) 改进型Clock置换算法
-
在改进型Clock算法中,除了考虑页面的访问情况外,还要再增加一个因素,即置换代价,这样,在选择页面换出时,既要是未访问过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。通过将页表的访问位和修改位结合起来,形成改进型Clock置换算法。由访问位A和修改位M可以组合成下面4种类型的页面:
-
1类(A=0, M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。
-
2类(A=0, M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
-
3类(A=1, M=0):最近已被访问,但未被修改,该页有可能再被访问。
-
4类(A=1, M=1):最近已被访问且被修改,该页可能再被访问。
-
-
最少使用(LFU)置换算法
最少使用(LFU:Least Frequently Used)置换算法的原理是:为内存中的每个页面设置一个计数器,用来记录该页面被访问的次数。当系统对每一页面访问一次后,就使它相应的计算器增加1。过一定时间t后,将所有计数器一律清零。当需要淘汰一页面时,计数值最小的计数器所对应的页面便是淘汰对象。
1.3 请求分页系统内存块的分配
最小物理块的确定
分配给每个进程的最小物理块数是指保证进程正常运行所需的最少内存块数。当系统为进程分配的内存块数少于此值时,该进程将无法运行。
内存块的分配策略
-
在请求分页系统中,可采用固定分配和可变分配两种内存分配策略。固定分配策略是指在进程创建时,系统根据进程特点为每个进程分配一定数目的内存块,在进程运行期间不再改变;而可变分配策略是指允许分配给进程的内存块数随进程的运行而改变。
-
在进行页面替换时,可以采用全局置换和局部置换策略。
-
(1) 固定分配和局部替换策略
-
(2) 可变分配和全局替换策略
-
(3) 可变分配和局部替换
-
分配算法
-
(1) 平均分配算法
-
这种方法是将内存中所有可用的内存块平均分配给各个进程。
-
-
(2) 按比例分配算法
-
这是根据进程的大小按比例分配内存块的算法。
-
-
(3) 优先权法
-
在实际应用中,为了照顾到重要的、紧迫的作业能尽可能快地完成,应该为它分配较多的内存空间。通常采用的方法是把内存中可供分配的所有内存块分成两部分:一部分按比例分配给各个进程,而另一部分则根据各进程的优先权,适当增加其相应的份额后,分配给各个进程。
-
1.4 工作集理论和抖动问题
工作集
-
工作集是指在某段时间间隔Δ里,进程实际访问的页面集合,具体地说便是把某进程在时间t-Δ ~ t之间所访问的页面集合计为w(t, Δ),把变量Δ称为工作集窗口尺寸。
-
正确选择工作集窗口尺寸,对存储器的有效利用和系统吞吐率的提高,都将产生重要影响。一方面,如果把Δ选得很大,进程虽不易产生缺页,但存储器也将不会得到充分利用。另一方面,如果把Δ选得过小,则会使进程在运行过程中频繁地产生缺页中断,反而降低了系统的吞吐率。
抖动
-
若在系统运行过程中,刚被淘汰出内存的页面,过后不久又要访问它,需要再次将其调入,而该页面调入内存后不久又再次被淘汰出内存,然后又要访问它,如此反复,使得系统把大部分时间用在了页面的调入/换出上,几乎不能完成任何有效的工作,这种现象称为抖动(又称颠簸)。
-
防止抖动发生与限制抖动影响的方法 :
-
(1) 采用局部置换策略防止抖动的传播。
-
(2) 利用工作集模型预防抖动。
-
(3) 通过挂起进程来解决抖动问题。
-
页面异常处理
通常情况下,导致页面异常的原因有:
①编程错误。可分为内核程序错误和用户程序错误。常见的用户程序错误有访问错误的地址空间和传递给系统调用错误的参数等。
②操作系统故意引发的异常。最常见的如缺页,就操作系统利用异常获得一个物理页帧后再重新执行产生异常的指令。