算法思想:
最近最久未使用(LRU)置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。
数据结构说明:
在LRU算法中,要找出最近最久未使用的页面的话,要必须设置有关的访问记录项,且每一次访问这些记录项,页面都必须更新这些记录项。用结构体表示:
struct queue
{
int num; //页号
int time; //记录最久未访问的时间
}lru[20];
源程序:
//LRU算法
#include <stdio.h>
#include <stdlib.h>
//3 4 2 6 4 3 7 4 3 6 3 4 8 4 6
struct queue
{
int num; //页号
int time; //记录最久未访问的时间
}lru[20];
int page[30];
int length; //访问序列长度
int block; //页面大小
bool flag;
int res = 0; //缺页次数
void init() //初始化
{
for (int i = 0; i < length; i++)
{
lru[i].time = 0;
lru[i].num = -1;
}
}
int find_page(int k)
{
int i = 0, j;
for (j = 0; j < block; j++){ //查询是否在内存块中
if (lru[j].num == page[k]) {
i = j;
flag = false;
break;
}
}
if (flag) { //如果不在内存块,则找到最大的使用记录
for (j = 1; j < block; j++){
if (lru[i].time < lru[j].time) {
i = j;
}
}
}
return i;
}
void in() //装入
{
init(); //初始化
int line = 0;
bool flag1; //访问标志
int i, j, tmp;
for (i = 0; i < length; i++) {
flag = true;
if (line < block){ //没有装满的情况
flag1 = false;
for (j = 0; j < line; j++){
if (lru[j].num == page[i]) { //访问序列目标已经存在
printf("%d页面已经存在\n", lru[j].num);
flag1 = true;
lru[j].time = 0;
break;
}
}
if (!flag1){
printf("没有装满,添加新页面\n");
lru[line++].num = page[i];
res++;
}
}
else{
tmp = find_page(i);
if (flag){
printf("产生页面置换中断\n");
printf("将%d页置换出去,将%d页置换进来\n",lru[tmp].num,page[i]);
lru[tmp].num = page[i];
lru[tmp].time = 0;
res++;
}
else{
printf("访问%d页面成功\n", lru[tmp].num);
lru[tmp].time = 0; //时间清零
}
}
if (line > block) { //内存装满
for (int k = 0; k < block; k++) {
lru[k].time++;
}
}
else {
for (int k= 0; k < line; k++) {
lru[k].time++;
}
}
printf("------------\n");
for (int i = 0; i < block; i++) {
printf("|%d ", lru[i].num);
}
printf("|\n");
printf("------------\n");
}
}
int main(void)
{
system("color 3f");
printf("输入队列的长度: \n");
scanf("%d", &length);
printf("输入访问序列: \n");
for (int i = 0; i < length; i++) {
scanf("%d", &page[i]);
}
printf("输入页面大小: \n");
scanf("%d", &block);
in();
printf("缺页次数为: %d, 命中率率为: %.0lf%%\n", res, (1 - res * 1.0 / length) * 100);
system("pause");
return 0;
}
例子: