*页面置换算法

    xiaoxiao2021-04-01  29

    页面置换

    在请求分页存储管理系统中,由于使用了虚拟存储管理技术,使得所有的进程页面不是一次性地全部调入内存,而是部分页面装入。

    这就有可能出现下面的情况:要访问的页面不在内存,这时系统产生缺页中断。操作系统在处理缺页中断时,要把所需页面从外存调入到内存中。如果这时内存中有空闲块,就可以直接调入该页面;如果这时内存中没有空闲块,就必须先淘汰一个已经在内存中的页面,腾出空间,再把所需的页面装入,即进行页面置换。

    先进先出法(FIFO)

    算法描述:由于认为最早调入内存的页不再被使用的可能性要大于刚调入内存的页,因此,先进先出法总是淘汰在内存中停留时间最长的一页,即先进入内存的页,先被换出。先进先出法把一个进程所有在内存中的页按进入内存的次序排队,淘汰页面总是在队首进行。如果一个页面刚被放入内存,就把它插在队尾

    性能较差,调出的页面可能是经常要访问的页面(驻留时间长,本身就说明可能常用),有belady现象(给的物理页帧越多反而缺页越频繁),FIFO算法很少单独使用。

     

    最佳置换法(OPT)

    算法描述:最佳置换算法(OPT)在为调入新页面而必须预先淘汰某个老页面时,所选择的老页面应在将来不被使用,或者是在最远的将来才被访问。采用这种算法,能保证有最小缺页率。

    优缺点:OPT算法因为要需要预先知道一个进程在整个运行过程中页面走向的全部情况,因此只是一种理想状态,实际是行不通的。一般用算法来衡量(如通过模拟实验分析或理论分析)其他算法的优劣。

     

    最近最少使用置换法(LRU)

    算法描述:最近最少使用置换法(LRU)是选择在最近一段时间里最久没有使用过的页面予以淘汰。借鉴FIFO算法和OPT算法,以“最近的过去”作为“不久将来”的近似。

    在每次页面命中后,该页面的优先级会调到最高,之所以会默认采用这个策略,是因为一般的程序内存访问具有较高的局部性,这种策略会很有效。局部性不仅仅局限于虚拟内存管理上,只要有cache的地方,都会考虑局部性。

    LRU确定最后使用时间的顺序:

    (1)计数器:每个页表项一个使用时间字段,并给CPU增加一个计数器。每次存储访问时钟+1。每当访问一个页面时,时钟寄存器的内容就被复制到页表对应项的时间字段中。这样我们就始终保留每个页面最后一次访问时间

    (2)栈:栈保留页号,访问一个页时就把它取出放到栈顶。这样栈顶总是存放目前使用最多的也。

    优缺点:LRU算法是经常采用的页面置换算法。缺点是实现上需要大量的硬件支持。

     

    时钟页面置换算法

    Clock 页面置换算法——LRU的近似,对FIFO的改进

    基本思路:需要用到页表项的访问位(access bit),当一个页面被装入内存时,把该位初始化为0,然后如果这个页被访问(读/写)时,硬件把它置为1.

    把各个页面组织成环形链表(类似钟表面),把指针指向最老的页面(最先进来);

    当发生一个缺页中断,考察指针所指向的最老的页面,若它的访问为为0,则立即淘汰。若访问为1,则把该位置为0,然后指针往下移动一格。如此下去,直到找到被淘汰的页面,然后把指针移动到它的下一格。

     

    最不常用算法(LFU)

    基本思路:当一个缺页中断发生时,选择访问次数最少的那个页面,并淘汰之

    实现方法:对每个页面设置一个访问计数器,每当一个页面被访问时,该页面的访问计数器加1,淘汰计数值最小的那个页面

    LRU/LFU区别:LRU考察的是多久未访问,时间越短越值得留在内存,LFU是访问次数/频度,次数越多越好。

    反例:一个页面在进程开始时使用的很多,但以后就不使用了。此时LFU就不适用了。把时间也考虑进去,在一段时间内考察LFU。比如,定期把次数寄存器右移一位。

    不要把存储管理的页面置换算法与处理机调度算法混淆。FIFO是先进先出页面置换算法,FCFS是先来先服务的作业调动算法,虽然道理相似,却用在不同的地方。

     

    Belady 现象

    Belady现象:在采用FIFO算法时,有时会出现的物理页面数增加,缺页率反而提高的异常现象。

    Belady现象原因:FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,与置换算法的目标是不一致的(即替换较少使用的页面),因此,被它置换出去的页面不一定是进程不会访问的。

     

    LRU、FIFO与Clock的比较

    LRU和FIFO本质都是先进先出的思路,但LRU是针对页面的最近访问时间来进行排序,所以需要在每一次页面访问的时候动态的调整各个页面之间的先后顺序(每一个页面的最近访问时间变了);而FIFO针对页面进入内存的时间来进行排序,这个时间是固定不变的,所以页面之间的先后顺序是固定不变的。如果程序局部性,则LRU会很好。如果内存中所有页面都没有被访问过会退化为FIFO(如页面进入内存后没有被访问,最近访问时间与进入内存的时间相同)。

    LRU算法性能较好,但系统开销较大;FIFO算法的系统的开销较小,但可能发生Belady现象。因此,择衷的办法就是Clock算法,在每一次页面访问时,它不必去动态调整页面在链表中的顺序,而仅仅是做一个标记,等待发生缺页中断的时候,再把它移动到链表的末尾。对于内存当中未被访问的页面,Clock算法的表现与LRU一样好,而对于那些曾经访问过的页面,它不能像LRU那样记住它们的准确访问顺序。

    衡量页面置换算法好坏的标准是:好的算法能适当减少缺页率,避免系统“抖动”(Thrashing)即频繁的换页活动。

    转载请注明原文地址: https://ju.6miu.com/read-665545.html

    最新回复(0)