存储管理——置换策略

来源:互联网 发布:k近邻算法 编辑:程序博客网 时间:2024/05/17 03:05

无论是否对内存进行扩容,如果面对这样的情况:需访问的数据或程序不在内存时,怎么将塞的满满当当的内存做出适当的调整,使新的程序装入内存,即内存的置换策略。下面将学习的几个置换策略重新描述一下。


1. FIFO算法

将先进入内存的程序块,对于以后来说,可能是最先淘汰的。基于这个想法,采用先进先出的策略来做替换。
这个方法并没有考虑局部性原理,只考虑了程序的顺序执行。因而相对于后面的几个策略显得不是那么有优势。
将各页表项,看作是循环放置的,有一个指针指向当前被置换的页表项。
具体过程:
1. 当装入新程序时,将指针所指向的页表项装入新的程序块;
2. 指针向下一项移动。

2. URL算法

这个策略的想法是:如果当前页表项很久没有被使用,那么根据局部性原理,以后也不太可能会被使用。
这个策略可以减少抖动的出现,在实际运用中表现的效率也最好。
具体过程:
采用一种能判别时长的方式标记页表项(比如:使用栈或时间标签),新程序等待装入到时长最长的页表中
无论是使用栈还是时间标签,将栈低元素移除和每次更新时间标签,都是开销很大的操作。

3. OPT算法

将下次访问距当前时间最长的页表项置换出去,这显然这样可以极大的降低抖动。
如果细想一想,可以发现这是无法实现的。因为要预测未来,这及其的困难。
那这个无法投入到实际使用的置换策略,有何用呢?因为它是当前最优的置换策略,可以判断其他策略的优劣。

4. 时钟算法

面对URL极其接近OPT的性能,但是面对如此高昂的代价,不得不经历一次又一次的革新,于是时钟系列诞生啦。
Version One:
添加使用位,其用法:
当刚装入页表时,使用位标记为1;或者在缺页中断时访问时,也标志为1
当使用位是0,则可将其置换;
在发生缺页中断时,将为1的使用位取反,变为0,直到找到标记为0的页表。
具体过程:

  1. 从当前指针开始,寻找使用位是0的页表项;
  2. 如果页表项的使用位是1,则置0;并向后寻找;
  3. 如果发现页表项为0,则做置换操作,并将使用位置1,并将指针后移一位。

Version Two:
在One的基础上再添加一位修改位。
每一个页表项就有如下四种情况:

  • 最近未被访问,未被修改(u = 0; m = 0)
  • 最近被访问,未被修改(u = 1; m = 0)
  • 最近未被访问,被修改(u = 0; m = 1)
  • 最近被访问,被修改(u = 1; m = 1)
    具体过程:

    1. 从指针当前位置开始,寻找页表项,对使用位不做修改,将第一个(u = 0; m = 0)的页表项置换;
    2. 第一步失败,则重新扫描,查找(u = 0; m = 1)的页表项。选择第一个这样的页表项进行置换操作。在此过程中,将遇到的使用位由1置0;
    3. 第二步失败,指针对到初始位置,并将使用位均置为0,重复第一步,有必要时,重复第二步

该方法不仅继承了Version One的优点,而且还可以通过修改位,判断是否将内存中刚调出的信息重新写入辅存。在某种程度上增加了效率。

最后引用《操作系统精髓与设计原理》的一张图结束:
各置换策略一览


至此关于操作系统一些简单的学习先告一段落,其中极多的细节尚未涉及,一定要好好学习!!!

0 0
原创粉丝点击