页面置换-最近最久未使用置换(LRU)

版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82908923

最近最久未使用置换:选择最近最久未使用的页面予以淘汰。赋予每个页面一个访问字段,用以记录一个页面自上次被访问以来所经历的时间t,当需淘汰一个页面,选择t值最大的。

输入:内存物理块的大小,以及页面号引用串的大小,各个 引用串的页面编号。

输出:被置换出去的页面编号。

运行结果:

所需的数据结构:

//页面
struct Page
{
    int id;                        //标志
    int start_time;                //进入内存的时间
    int exist_time;                //在内存中没有被访问的时间
};

辅助函数:

//在内存中寻找标志为id的页,如果找到,返回内存下标,否则返回-1
//q内存,m内存大小。
int Find(Page *q, int m, int id)
{
    int i;

    for(i = 0; i < m; i++)
        if(q[i].id == id)
            return i;

    return -1;
}
//当来一个新的页面引用时,更新内存中页面上次被访问以来所经历的时间
void Update(Page *q, int m)
{
    for(int i = 0; i < m; i++)
        q[i].exist_time++;
}
//在内存中选择最近最久未使用的页面。返回内存下标。
int FindLong(Page *q, int m)
{
    int time, k, i;

    time = q[0].exist_time;
    k = 0;
    for(i = 1; i < m; i++)
        if(q[i].exist_time > time)
        {
            time = q[i].exist_time;
            k = i;
        }

    return k;
}

实现方式:

void LRU(Page *p, int n, int m)
{
    int i, j, k, t;
    Page q[maxm];

    for(i = 0; i < m; i++)
    {
        Update(q, i);                 //每次有新的页面引用,都更新页面未被访问的时间
        q[i] = p[i];
    }

    for(i = m; i < n; i++)
    {
        Update(q, m);
        k = Find(q, m, p[i].id);
        if(k < 0)
        {
            k = FindLong(q, m);       //在内存中选择最近最久未使用的页面
            printf("%d ", q[k].id);
            q[k] = p[i];
        }
        else                          //找到了, 更新页面未被访问的时间为0。
            q[k].exist_time = 0;
    }
    printf("\n");
}

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/82908923