当前位置:   article > 正文

最近最久未使用(LRU)页面置换算法原理及模拟实现_最近最久未使用(lru)的页面置换算法是根据页面调入内存后的使用情况做出决策的。

最近最久未使用(lru)的页面置换算法是根据页面调入内存后的使用情况做出决策的。

FIFO算法的性能较差,它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用状况。最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做出决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有也面中t值最大的,即最近最久未使用的页面予以淘汰。

LRU算法的硬件支持

LRU算法虽然是一种比较好的算法,但是要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速得知道哪一页是最近最久未使用的页面,须有寄存器和栈两类硬件之一的支持。
1)寄存器
为了记录某进程在内存中各页的使用情况,须为每个内存中的页面配置一个移位寄存器,可表示为

R=Rn1Rn2···R2R1R0

当进程访问某物理块时,要将相应的寄存器的 Rn1位置成1。此时,定时信号将每隔一定时间将寄存器右移一位。如果我们把 <script type="math/tex" id="MathJax-Element-3">n</script>位寄存器的数看作是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。
2)栈
可利用一个特殊的栈保持当前使用的各个页面的页面号。每当进程访问某页面是,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最近最久未使用页面的页面号。

代码模拟

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
class LRU
{
public:
    LRU()
    {
        siz=0;
    }
    bool isOutofBoundary()
    {
        if(siz>=N)return true;
        return false;
    }
    int indexOfElement(int o)
    {
        for(int i=0; i<N; i++)
        {
            if(o==a[i])
                return i;
        }
        return -1;
    }
    void push(int o)
    {
        int t=-1;
        if(!isOutofBoundary()&&indexOfElement(o)==-1)
        {
            a[siz]=o;
            siz++;
        }
        else if(isOutofBoundary()&&indexOfElement(o)==-1)
        {
            for(int i=0; i<siz-1; i++)
            {
                a[i]=a[i+1];
            }
            a[siz-1]=o;
        }
        else
        {
            t=indexOfElement(o);
            for(int i=t; i<siz-1; i++)
            {
                a[i]=a[i+1];
            }
            a[siz-1]=o;
        }
    }
    void showMemoryBlock()
    {
        printf("now memory use:\n");
        for(int i=0; i<siz; i++)
        {
            printf(i==siz-1?"%d\n":"%d ",a[i]);
        }
    }
private:
    int N=5;
    int a[5],siz;
};
int main()
{
    int iter[]= {4,7,0,7,1,0,1,2,1,2,6};
    LRU lru;
    printf("%d %d %d\n",sizeof(iter),sizeof(int),sizeof(iter)/sizeof(int));
    for(int i=0; i<sizeof(iter)/sizeof(int); i++)
    {
        lru.push(iter[i]);
        lru.showMemoryBlock();
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

输出结果:

now memory use:
4
now memory use:
4 7
now memory use:
4 7 0
now memory use:
4 0 7
now memory use:
4 0 7 1
now memory use:
4 7 1 0
now memory use:
4 7 0 1
now memory use:
4 7 0 1 2
now memory use:
4 7 0 2 1
now memory use:
4 7 0 1 2
now memory use:
7 0 1 2 6

Process returned 0 (0x0)   execution time : 0.033 s
Press any key to continue.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/163629
推荐阅读
相关标签
  

闽ICP备14008679号