最近最久未使用(LRU)算法
FIFO算法和OPT算法之间的主要差别是,FIFO算法利用页面进入内存后的时间长短作为置换依据,而OPT算法的依据是将来使用页面的时间。如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以置换。这种算法就称为最久未使用算法(Least Recently Used,LRU)。
#include <stdio.h>
#include <stdlib.h>typedef struct item
{
int num;
int time;
} Pro;
/**
*设置查询函数
*在内存的物理块中查询当前需置换的页面编号是否已经存在
*如果存在则返回页面在数组中的位置
*如果没有找到则返回-1
*/
int Search(Pro *p,int flag,int mnum)
{
int q=0;
for(int i=0; i<mnum; i++)
{
if(p[i].num==flag)
{
q=i;
break;
}
else
{
q=-1;
}
}
return q;
}
/**
*设置打印函数
*每执行一次页面置换就会输出页面置换的情况
*/
void print(Pro *p,int mnum)
{
for(int i=0; i<mnum; i++)
printf("%d ",p[i].num);
printf("\n");
}
/**
*在页面数组中还有一个值time存放已经置换在物理块的页面编号在页面编号数组中的位置
*返回time最小的物理块编号
*/
int selectprop(Pro *main,int mnum)
{
int min;
int p=0;
min=main[0].time;
for(int i=1;i<mnum;i++)
{
if(min>main[i].time)
{
min=main[i].time;
p=i;
}
}
return p;
}
int main()
{
int i,j,pagenum;
int number;
int mnum;
Pro *page;
Pro *main;
printf("请输入分配给主存的页面数");
scanf("%d",&pagenum);
page=(Pro*)malloc(sizeof(Pro)*pagenum);
printf("请输入页面的编号");
for(i=0; i<pagenum; i++)
{
scanf("%d",&number);
page[i].num=number;
}
printf("请输入内存的块数");
scanf("%d",&mnum);
main=(Pro*)malloc(sizeof(Pro)*mnum);
for(int i=0; i<mnum; i++)
{
main[i].num=-1;
main[i].time=0;
}
int trans;
for(i=0; i<pagenum; i++)
{
if(i<mnum)
{
main[i].num=page[i].num;
main[i].time=i;
print(main,mnum);
}
else
{
int p=page[i].num;
int m;
m=Search(main,p,mnum);
if(m==-1)
{
int n;
n=selectprop(main,mnum);
main[n].num=page[i].num;
main[n].time=i;
print(main,mnum);
}
else
{
printf("不缺页\n");
main[m].time=i;
}
}
}
return 0;
}