操做系统原理(二)——内存管理之页面置换算法

https://www.cnblogs.com/yongheng20/p/4967213.html

页面置换算法html

1. 总述算法

  为提升内存利用率,解决内存供不该求的问题,更加合理的使用内存,人们创造了分页式内存抽象。同时有一个虚拟内存的概念,是指将内存中暂时不须要的部分写入硬盘,看上去硬盘扩展了内存的容量,因此叫作“虚拟”内存。使用虚拟内存,应用程序可使用比实际物理内存更大的内存空间。能够认为这个更大的内存空间就在硬盘上,只有将某一部分须要被用到时,才被写入真实内存;当它暂时再也不被用到时,又被写回硬盘。分页式内存管理将物理内存分为等大的小块,每块大小一般为1K、2K、4K等,称为页帧;逻辑内存(使用虚拟内存技术扩大的内存,可认为其位于硬盘上)也被分为等大的小块,称为;且页和页帧的大小必定是同样的,它是写入真实内存和写回硬盘最小单位。性能

  介绍另外几个概念:spa

  使用位:每一个页帧都有一个使用位,记录此页帧是否被使用。3d

  修改位(脏位):每一个页帧都有一个脏位,记录此页帧是否被更改。调出真实内存时,被更改过的页帧要写回硬盘,未被更改过的页帧直接扔掉便可,由于硬盘上此页帧的副本仍然有效。指针

  逻辑地址:使用虚拟内存技术扩大后的内存的地址。htm

  物理地址:真实内存的地址。blog

  固然,进程载入到真实内存才能够运行,而进程代码使用的是逻辑地址,因此牵扯到一个地址转换的问题,将逻辑地址转换为物理地址。逻辑地址可分为两段,前半段表明页号,后半段表明页内偏移,物理地址也可分为两段,前半段表明页帧号,后半段表明页内偏移。地址转换的方法即,将逻辑地址的页号对应为物理地址的页帧号(对应关系记录在一张表中,好比页号为5,对应到真实内存中页帧号为3),页内偏移不一样变化(页和页帧的大小是同样的)。进程

 

2. 介绍页面置换算法内存

  假设某一时刻内存页帧已经被写满了,但这时又须要将一个页写到物理内存中,就须要将本来在物理内存中的某一页换出来。若是置换不当,就会致使刚刚被换出到硬盘的页又要被写回内存,减慢系统运行的速度。页面置换算法就是考虑将哪一页换出来以得到优良性能的方法。

 

2.1 Optimal算法(最优算法)

  首先介绍最优算法,它须要知道之后要被用到的页,而后将不会被用到的页换出内存;若是全部页都会被用到,就把须要使用时间离如今最长的页换出,以尽可能使很差的状况晚发生。这种方法能使系统得到最佳性能,可是,它是不可能实现的......由于当前没法获知之后哪些页要被用到。不过最优算法仍是可以做为其余算法优秀程度的衡量。

 

2.2 FIFO(First-In First-Out,先进先出)算法

  FIFO算法的思想很简单,就是置换出当前已经待在内存里时间最长的那个页。FIFO算法的运行速度很快,不须要考虑其余的因素,须要的开销不多。可是正是因为没有考虑页面的重要性的问题,FIFO算法很容易将重要的页换出内存。

 

2.3 Second Chance(第二次机会)算法

  为了不FIFO算法将重要的页换出内存,Second Chance算法提供了一些改进。Second Chance算法在将页面换出内存前检查其使用位(使用位前文有介绍),若是其使用位为1,证实此页最近有被使用,猜想它还可能被使用,因而不把它置换出内存,可是把其使用位置为0,随后检查下一个页面,直到发现某页的使用位为0,将此页置换出内存。

 

2.4 Clock算法(时钟轮转法)

  为了节约Second Chance算法一个接着一个检查使用位的开销,时钟轮转法又提出了改进。时钟轮转法将全部的页组成一个圆,圆心的指针指向下一个要被置换的页面,置换前一样检查使用位,若是使用位为1,一样将其使用位置为0,随后将顺指针旋转,检查下一个页面,直到发现某页的使用位为0,将此页置换出内存。很容易理解此算法为何叫“时钟”轮转法。

图示:

  此时2号页是下一个要被置换出内存的页,置换时若是发现其使用位为1,则将使用位置0后顺时针旋转指针检查1号页。

 

2.5 LRU(Least Recent Used, 最近最少使用)算法

  为得到对最优算法的模拟,提出了LRU算法。因为当前时间以后须要用到哪些页没法提早获知,因而记录当前时间以前页面的使用状况,认为以前使用过的页面之后还会被用到。在置换时,将最近使用最少的页面换出内存。此种方法的开销比较大。

 

2.6 NRU(Not Recent Used, 最近未使用)算法

  前面提到修改位和使用位,NRU算法利用这两个标志位将全部页帧分为4组:

  第0组:修改位和使用位都为0;

  第1组:修改位为0,使用位为1;

  第2组:修改位为1,使用位为0;

  第3组:修改位和使用位都为1。

  NRU算法从组数最小的一组中随机选择一个页面将其移出内存。可能有人会发现第2组这种状况根本不会出现,若是一个页帧被修改,其修改位会被置1,同时它也被使用了,其使用位也会被置1;即不会出现被修改可是没有被使用的状况。真实状况是,页帧的使用位会被定时清零,这样第3组通过一次清零就会变成第2组。这也符合“最近”未使用,即好久之前被使用的页帧被清零了,不在统计范围内,只要“最近”没有被使用,就颇有可能被移出。

  NRU算法不是最好的,可是它使用起来开销很小,用较小的代价就获得了不错的效果,不失为一种不错的算法。

相关文章
相关标签/搜索