您的位置:首页 > 其它

操作系统页面置换算法与虚拟内存

2017-06-03 13:20 253 查看
为了更好的实现计算机对内存资源的管理,操作系统提供了存储管理服务。如果将物理地址直接暴露给进程,用户程序在寻址内存的时候很有可能在无意中破坏操作系统,所以又对存储器做了一定的抽象,让进程间接地的访问物理地址

使用链表对空闲内存的进行管理(链表将存储器大小不等的的空闲地址块连接起来,进程当需要空闲区域时有五种获取规则)

20K30K10K2K3K5K15K25K
                                         
(图中为链表所连接的空白块大小,现在有进程需要24K的区域)

首次适配(first fit):存储管理器按链表进行搜索,找到一个足够大的,24k放第二空白块
下次适配(next fit):工作方式和首次适配相同,不同点是他在找到合适适配区后记录位置下次从记录的位置                       处开始适配(无论所找区域和上次是否相同),而不是像首次适配继续从开头找起
最佳适配  (best fit):找出可以容纳进程最小的取悦区域,最后一块25K
最差适配(worst fit):找出可以容纳的最大区域,第二快30K
快速适配(quick fit):将常用大小的区域单独维护形成新链表如下图;这样寻找起来就会十分快速 ,直接寻                        到所在位置 

5K10K15K20K25K
                        

虚拟内存
   虚拟内存的思想:每个程序都有自己的地址空间,这个空间被分为很多的块,每一块称作一页或页面,每一页有连续的地址范围,这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。

   页面与页框(块):页面是指将作业的逻辑地址分为一系列大小相同的部分(偏移量),并为每个页进行编号(即虚拟页号),编号从0开始。块是指将物理内存也分为同样大小的地址空间,进行编号从#0开始。页与块相对应,每一个块中存放一页用户作业,实现映射

    页表:虚拟地知道物理地址的一个映射,页表是一个函数,参数是虚拟页号,结果是物理页框号。其中虚拟地址包括虚拟页号和偏移量(低位)虚拟页号是映射物理地址的关键,偏移量就是指前面页面的内容。页面长度和偏移量有关,个数和虚拟页号有关

   页面置换(转+补)

   地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
1.最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。 
最佳置换算法可以用来评价其他算法。假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:

    7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1

进程运行时,先将7, 0, 1三个页面依次装入内存。进程要访问页面2时,产生缺页中断,根据最佳置换算法,选择第18次访问才需调入的页面7予以淘汰。然后,访问页面0时,因为已在内存中所以不必产生缺页中断。访问页面3时又会根据最佳置换算法将页面1淘汰……依此类推,如图3-26所示。从图中可以看出釆用最佳置换算法时的情况。

可以看到,发生缺页中断的次数为9,页面置换的次数为6。
访问页面70120304230321201701
物理块1777222227
物理块200004000
物理块31133311
缺页否
 

2.先进先出置换算法(FIFO):是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。 

 
访问页面70120304230321201701
物理块1777222444000777
物理块200033322211100
物理块31110003332221
缺页否
 
这里仍用上面的实例,釆用FIFO算法进行页面置换。进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。由图 3-27可以看出,利用FIFO算法时进行了 12次页面置换,比最佳置换算法正好多一倍。

FIFO算法还会产生当所分配的物理块数增大而页故障数不减反增的异常现象,这是由 Belady于1969年发现,故称为Belady异常,如图3-28所示。只有FIFO算法可能出现Belady 异常,而LRU和OPT算法永远不会出现Belady异常。
访问页面123412512345
物理块11114445,5'5
物理块222211133
物理块33332224
缺页否
111555544
物理块2*222211115
物理块3*33332222
物理块4*4444333
缺页否
注意:内存的页面中“最老“的页面,会被新的网页直接覆盖,而不是“最老“的页面先出队,然后新的网页从队尾入队。

3.最近最久未使用(LRU)算法:这种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。 

再对上面的实例釆用LRU算法进行页面置换,如图3-29所示。进程第一次对页面2访问时,将最近最久未被访问的页面7置换出去。然后访问页面3时,将最近最久未使用的页面1换出。

访问页面70120304230321201701
物理块1777224440111
物理块200000033300
物理块31133222227
缺页否
 

实际上,LRU算法根据各页以前的情况,是“向前看”的,而最佳置换算法则根据各页以后的使用情况,是“向后看”的。

LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类的算法。理论上可以证明,堆栈类算法不可能出现Belady异常。FIFO算法基于队列实现,不是堆栈类算法。

4. 时钟(CLOCK)置换算法

LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大;FIFO算法实现简单,但性能差。所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体。

简单的CLOCK算法是给每一帧关联一个附加位,称为使用位。当某一页首次装入主存时,该帧的使用位设置为1;当该页随后再被访问到时,它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换;如果所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情况,故称为CLOCK算法,又称为最近未用(Not
Recently Used, NRU)算法。

CLOCK算法的性能比较接近LRU,而通过增加使用的位数目,可以使得CLOCK算法更加高效。在使用位的基础上再增加一个修改位,则得到改进型的CLOCK置换算法。这样,每一帧都处于以下四种情况之一:
最近未被访问,也未被修改(u=0, m=0)。
最近被访问,但未被修改(u=1, m=0)。
最近未被访问,但被修改(u=0, m=1)。
最近被访问,被修改(u=1, m=1)。

算法执行如下操作步骤:
从指针的当前位置开始,扫描帧缓冲区。在这次扫描过程中,对使用位不做任何修改。选择遇到的第一个帧(u=0, m=0)用于替换。
如果第1)步失败,则重新扫描,查找(u=0, m=1)的帧。选择遇到的第一个这样的帧用于替换。在这个扫描过程中,对每个跳过的帧,把它的使用位设置成0。
如果第2)步失败,指针将回到它的最初位置,并且集合中所有帧的使用位均为0。重复第1步,并且如果有必要,重复第2步。这样将可以找到供替换的帧。改进型的CLOCK算法优于简单CLOCK算法之处在于替换时首选没有变化的页。由于修改过的页在被替换之前必须写回,因而这样做会节省时间。

例题:

*在5个页框上使用LRU页面替换算法,当页框初始为空时,引用序列为0、1、7、8、6、2、3、7、2、9、8、1、0、2,系统将发生(C)次缺页

    A、13            B、12           C、11          D、8

解析:内存中驻留5个页框:

        
访问页面01786237298102
页框100000222222222
页框21111133333111
页框3777777777700
页框488888899999
页框56666668888
是否缺页YYYYYY(换页)Y(换页)NNY(换页)Y(换页)Y(换页)Y(换页)N
 LRU是堆栈类的算法,最后访问的页面放在栈顶,可以得到答案为C。

5. 最近未使用算法NRU:页面被访问(读或者写)设置R位,当页面被修改设置为M位。挡启动一个进程时,所有页面                       的两位都被设置为0,R位被定期清0.淘汰没有被访问已经被修改的。淘汰顺序如下:

                      1 没有被访问,没有被修改

                      2 没有被访问,已经被修改

                      3 已经被访问,没有被修改

                      4 已经访问,已经修改

6.第二次机会算法:页面被访问(读或者写)设置R位,当页面被修改设置为M位。和先进先出类似,稍作修改。先检                   查最老页面的R位,如果R位为0,那这个即老又没被使用的立即置换;如果是1,将R位清0,将其          
        看作最新别加入的页面

7.最不经常使用算法NFU:LRU的相对初略近似

8.老化算法:通过LRU改动的有效算法

9.工作集算法:实现起来开销很大

10.工作集时钟算法:好的有效算法

   

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: