操作系统 请求分页存储管理
作者:互联网
目录
- 请求分页存储管理中的页表机制
- 缺页中断机构
- 地址转换
- 页置换算法
- 页分配和页置换策略
- 工作集及抖动现象的消除
- 请求分页存储管理的优缺点
请求分页存储管理中的页表机制
系统需要解决的问题
- 系统如何获知进程当前所需页面不在主存
当发现缺页时,如何把所缺页面调入主存
当主存中没有空闲的页框时,为了要接受一个新页,需要把老的一页淘汰出去,根据什么策略选择欲淘汰的页面
页表机制
页描述子的扩充(页表机制 )
- 状态位P(中断位)指示该页是在内存还是在外存
- 访问位A 用于记录本页在一段时间内被访问的次数或记录本页在最近多长时间未被访问
- 修改位M 表示该页在内存中是否被修改过
- 外存地址 该页在外存上的地址,通常是物理块号
缺页中断机构
- 在请求分页系统中,每当所要访问的页面不在内存时,便产生一缺页中断。相应的中断处理程序把控制转向缺页中断子程序,执行此子程序,即把所缺页面装入主存,然后处理机重新执行缺页时打断的指令。这时,就将顺利形成物理地址。
- 缺页中断与一般中断的区别
- 在指令执行期间产生和处理中断信号
- 一条指令在执行期间可能产生多次缺页中断,例如:在请求分页存储管理中,当中断位反映出进程当前欲访问的页不在内存时(1表示该页在内存,0表示该页不在内存),就产生一次缺页中断。系统收到缺页中断信号后就立即执行相应的缺页中断处理程序。
- 特点:
(1)缺页中断的产生和处
理(中断的响应)出现在一条指令的
执行期内。
(2)程序运行过程中,一条指令的执行
期间内可能会产生多次缺页中断。
地址变换机构
- 如果在快表中未找到该页的页表项,则应再到内存中去查找页表,再从找到的页表项中的状态位P,该页是否调入内存。其结果可能是:
(1)该页已经调入内存,这是应将此页的页表项写入快表,当快表已满时,应先调出按某种算法所确定的页的页表项,然后再写入该页的页表项。
(2)该页尚未调入内存,这时便应产生缺页中断,请求OS从外存中把该页调入内存。
请求分页中的地址变换过程
页面调入过程
页置换算法
缺页率
- 假设一个进程的逻辑空间为n页,系统为其分配的内存物理块数为m(m≤n)。
- 如果在进程的运行过程中,访问页面成功(即所访问页面在内存中)的次数为S,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为F,则该进程总的页面访问次数为A=S+F,那么该进程在其运行过程中的缺页率即为
影响缺页率的因素
- 分配给进程的物理页面数
- 页面本身的大小
- 程序的编制方法
- 页面淘汰算法
最佳(Optimal)置换算法
- 最佳置换算法是由Belady于1966年提出的一种理论上的算法
- 其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面
- 采用最佳置换算法,通常可保证获得最低的缺页率
- 采用最佳置换算法可保证获得最低的缺页率。
- 由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法也是无法实现的,但是可利用该算法去评价其它算法。
利用最佳页面置换算法时的置换图
先进先出(FIFO)页面置换算法
- 该算法总是淘汰最先进入内存的页面,即选择在内存中的驻留时间最久的页面予以淘汰。
- 该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老页面。
- 但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,含有全局变量、常用函数、例程等的页面,FIFO置换算法并不能保证这些页面不被淘汰。
利用FIFO置换算法时的置换图
最近最久未使用(LRU)置换算法
- 最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况。
- 由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似。
- LRU置换算法是选择最近最久未使用的页面予以淘汰。
LRU页面置换算法
LRU置换算法的硬件支持
把LRU算法作为页面置换算法是比较好的,它对于各种类型的程序都能适用,但实现起来有相当大的难度,因为它要求系统具有较多的支持硬件。所要解决的问题有:
- 一个进程在内存中的各个页面各有多久时间未被进程访问;
如何快速地知道哪一页最近最久未使用的页面。
为此,须利用以下两类支持硬件:
- 一个进程在内存中的各个页面各有多久时间未被进程访问;
- 移位寄存器:
定时右移 - 栈:
当进程访问某页时,将其移出压入“栈顶”,“栈底”换出。
寄存器
为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为
访问时将Rn-1位置成1,定时信号每隔一时间间隔右移一位,则具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面
某进程具有8个页面时的LRU访问情况
栈
- 进程访问某页时,将该页面的页号从栈中移出,再压入栈顶
- 用栈保存当前使用页面时栈的变化情况
最少使用(LFU: Least Frequently Used)置换算法
为内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率
该算法选择在最近使用最少的页面作为淘汰页
与最近最少用算法LRU的区别
- 只考虑一段时间内使用的次数,而不管其使用的
注意:这种算法并不能真正反映出页面的使用情况,因在每一时间间隔内只是用寄存器的一位来记录页的使用情况,因此访问1次和10000次是等效的
简单的Clock置换算法
- 利用Clock算法时,只须为每页设置一位访问位,在将内存中的所有页面都通过链接指针链成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只须检查其访问位。
- 各字段说明如下
(1)状态位(存在位)P。用于指示该页是否调入内存,供程序访问时参考。
(2)访问字段A。用于记录本页在一段时间内被访问的次数,或最近已有多长时间未被访问,提供给置换算法选择换出页面时参考。
(3)修改位M。表示该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,若未被修改,在置换该页时就不须将该写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本。
(4)外存地址。用于指出该页在外存上的地址,通常是物理块号,供调入该页时使用。
简单的CLOCK置换算法(近似的LRU算法)
- 当采用简单的CLOCK算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列
- 当某页被访问时,其访问位被置1
- 置换算法在选择一页淘汰时,只需检查页的访问位,是0换出,是1重新置0且暂不换出,再按FIFO检查下一个页面。检查到最后一个页面,若其访问位仍为1,则再返到队首检查。
- 由于该算法是循环地检查各页面的访问情况,故称为CLOCK算法,置换的是未使用过的页,又称为最近未用算法NRU(Not Recently Used)
简单Clock置换算法的流程和示例
改进型Clock置换算法
- 在将一个页面换出时,如果该页已被修改过,便须将它重新写到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。同时满足两条件的页面作为首选淘汰的页。
- 各字段说明如下:
(1)状态位(存在位)P。用于指示该页是否调入内存,供程序访问时参考。
(2)访问字段A。用于记录本页在一段时间内被访问的次数,或最近已有多长时间未被访问,提供给置换算法选择换出页面时参考。
(3)修改位M。表示该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,若未被修改,在置换该页时就不须将该写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本。
(4)外存地址。用于指出该页在外存上的地址,通常是物理块号,供调入该页时使用。
改进型Clock置换算法说明
- 考虑使用情况和置换代价,换出的最好是未使用且未被修改过的
- 由访问位A和修改位M组合:
- 1类**(A=0, M=0)**:表示该页最近既未被访问,又未被修改,是最佳淘汰页
- 2类**(A=0, M=1)**:表示该页最近未被访问,但已被修改,并不是很好的淘汰页
- 3类**(A=1, M=0)**:最近已被访问,但未被修改, 该页有可能再被访问
- 4类**(A=1, M=1)**:最近已被访问且被修改,该页可能再被访问
- 其执行过程可分成以下三步
- 从指针所指示的当前位置开始, 扫描循环队列, 寻找A=0且M=0的第一类页面, 将所遇到的第一个页面作为所选中的淘汰页。 在第一次扫描期间不改变访问位A
- 如果第一步失败,即查找一周后未遇到第一类页面, 则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位A都置0
- 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位A复0。 然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页
改进型Clock置换算法-示例
未完待续。。。
续
标签:存储管理,操作系统,请求分页,置换,访问,算法,内存,该页,页面 来源: https://blog.51cto.com/u_14175378/2759909