最近最久未使用置换:选择最近最久未使用的页面予以淘汰。赋予每个页面一个访问字段,用以记录一个页面自上次被访问以来所经历的时间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");
}