LRU算法是最近最久未使用的页面置换算法,根据页面调入内存后的使用情况来做出决策。
要实现这种算法的方法是多种多样的,可以通过使用寄存器来存储页面的使用情况,也可以通过建一种特殊的栈来实现。
我的方法是通过给每个物理块分配一个权重,假设有三个物理块,初始权重为0,0,0,之后,当每次申请物理块时,首先加一,没有空闲物理块时三个物理块的权重值肯定有3,2,1,如果申请的页面在物理块中,则命中,依旧先全加一,然后把这个物理快的权重值改为1,如果没有命中,则要找出权重最大的(因为加一权重是4,3,2),也就是权重为4的物理块,让后换掉物理块中的页即可。
下面是代码:
void show(){
printf("物理块
页
号\n");
for(int i = 0;i < 3;i ++){
printf("
%d
",i);
if(f[i] == 0){
printf("空
闲\n");
}
else{
printf("
%d\n",team[i]);
}
}
}
}
void deal(int id){
int a = 0;
for(int i = 0;i < 3;i ++){
if(f[i] == 0){
printf("存在空闲物理块!\n");
team[i] = id;
f[i] = 1;
flag[i]=3-i;
show();
return;
}
}
for(int j = 0;j < 3;j ++){
if(team[j] == id){
a = j;
}
}
int max =
0,n = 0;
if(a == 0){
for(int j = 0;j < 3;j ++)
//首先全加一
flag[j]++;
for(int i = 0;i < 3;i ++){
//找最大的标记,替换页号后,将当前物理块标记变为1
if(max
n = i;
max = flag[i];
}
}
printf("页号%d替换为页号%d\n\n",team[n],id);
team[n] = id;
flag[n] = 1;
}
else{
//如果命中,所有的标记全加一,之后将命中的块号的标记置为一(最小)
printf("页号命中\n\n!");
for(int i = 0;i < 3;i ++){
flag[i]++;
}
flag[a] = 1;
}
show();
}
}