操作系统-----页面置换算法

页面置换算法

把内存已无空闲空间时选择换出页面的算法称为页面置换算法(Page-Replacement Algorithms)。
不适当的算法可能会导致进程发现“抖动”,即刚被换出的页很快又要被访问,需要将它重新调入,可能会出现频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上。一个好的页面置换算法,应具有较低的页面更换频率。

最佳置换算法和先进先出置换算法

最佳置换算法是一种理想化的算法,通常使用最佳置换算法作为标准,来评价其它算法的优劣。先进先出置换算法是最直观的算法,由于与通常页面的使用规律不服,可能是性能最差的算法,故实际应用极少。

最佳置换算法。
其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问(即下一次访问时间最晚)的页面。采用最佳置换算法,通常可保证获得最低的缺页率。

先进先出页面置换算法。
总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
FIFO 置换算法性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况。



最近最久未使用(LRU)算法:

是根据页面调入内存后的使用情况进行决策的。即选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最久未使用的页面予以淘汰。

最佳置换算法是从“向后看”的观点出发的,即它是依据以后各页的使用情况;而 LRU 算法则是“向前看”的,即根据各页以前的使用情况来判断,而页面过去和未来的走向之间并无必然的联系。
LRU 置换算法的硬件支持。

  1. 寄存器。
    为每个在内存中的页面配置一个移位寄存器,可表示为
    在这里插入图片描述
    当进程访问某物理块时,要将相应寄存器的 Rn-1 位置成 1。此时,定时信号将每隔一定时间(例如 100 ms)将寄存器右移一位。如果我们把 n 位寄存器的数看做是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。

  2. 栈。
    可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。

最近最少使用 LFU 置换算法。

该算法用移位寄存器方式。每次访问某页时,便将该移位寄存器的最高位置 1,再每隔一定时间(例如 100 ms)右移一次。LFU 置换算法的页面访问图与 LRU 置换算法的访问图完全相同;或者说,利用这样一套硬件既可实现 LRU 算法,又可实现 LFU 算法。但 LRU 算法是根据将 n 位看作一个整数找到最近最久未使用的页面,而 LFU 算法的在最近一段时间使用最少的页面将是∑Ri 最小的页。
应该指出,LFU 算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,在该时间间隔内,对某页访问一次和访问 1000 次是完全等效的。



Clock 置换算法

虽然 LRU 算法是较好的一种算法,但由于它要求有较多的硬件支持,故在实际应用中,大多采用 LRU 的近似算法。Clock 算法就是用得较多的一种 LRU 近似算法。

简单的 Clock 置换算法。
只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置 1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是 0,就选择该页换出;若为 1,则重新将它置 0,暂不换出,而给该页第二次驻留内存的机会,再按照 FIFO 算法检查下一个页面。该算法是循环地检查各页面的使用情况的。又把该算法称为最近未用算法 NRU。

改进型 Clock 置换算法:

在改进型 Clock 算法中,除须考虑页面的使用情况外,还须再增加一个因素,即置换代价,这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位 A 和修改位 M 可以组合成下面四种类型的页面:

1 类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。

2 类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。

3 类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问。

4 类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问。

在内存中的每个页必定是这四类页面之一,在进行页面置换时,与简单 Clock 算法差别在于该算法须同时检查访问位与修改位,以确定该页是四类页面中的哪一种。其执行过程可分成以下三步:

  1. 从指针所指示的当前位置开始,扫描循环队列,寻找 A=0 且 M=0 的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位 A。
  2. 如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找 A=0 且 M=1 的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置 0。
  3. 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并已将所有的访问位复 0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页。
    该算法与简单 Clock 算法比较,可减少磁盘的 I/O 操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。
页面缓冲算法 PBA

影响页面换进换出效率的若干因素

  1. 页面置换算法。
  2. 写回磁盘的频率。对于已经被修改过的页面,在将其换出时,应当写回磁盘。
    但如果在系统中已建立了一个已修改换出页面的链表,则对每一个要被换出的页面(已修改),系统可暂不把它们写回磁盘,而是将它们挂在已修改换出页面的链表上,仅当被换出页面数目达到一定值时,例如64个页面,再将它们一起写回到磁盘上,这样就显著减少了磁盘 I/O的操作次数。或者说,减少已修改页面换出的开销。
  3. 读入内存的频率。在设置了已修改换出页面链表后,在该链表上就暂时有一批装有数据的页面,如果有进程在这批数据还未写回磁盘时需要再次访问这些页面时,就不需从外存上调入,而直接从已修改换出页面链表中获取,这样也可以减少将页面从磁盘读入内存的频率,减少页面换出的开销。

页面缓冲算法 PBA

PBA 算法特点:① 显著地降低了页面换进、换出的频率。② 正是由于换入换出的开销大幅度减小,才能使其可采用一种较简单的置换策略,如先进先出(FIFO)算法。

在该系统中内存分配策略上采用了可变分配和局部置换方式,同时在内存中设置了两个链表:

  1. 空闲页面链表
    实际上是一个空闲物理块链表。当进程需要读入一个页面时,便可利用空闲物理块链表中的第一个物理块来装入该页。当有一个未被修改的页要换出时,而是把它们所在的物理块挂在空闲链表表尾。
  2. 修改页面链表
    是由已修改的页面所形成的链表。当进程需要将一个已修改的页面换出时,系统并不立即把它换出到外存上,而是将它所在的物理块挂在修改页面链表的末尾。当达到一定数量时,再将它们一起写回磁盘。

C++语言实现LRU以及LFU

猜你喜欢

转载自blog.csdn.net/weixin_43743711/article/details/115011084
今日推荐