当物理块满了以后,要将物理块中的某一个块替换出去,那么我们就要有考虑的选择要替换下去哪一个
那么最近最久未使用算法,简单来说就是要选取物理块中最久没有被使用的页块号
首先明确,我们要将页上的信息对应装入到物理块中
那么我们就要首先判断物理块是否有值,若没有,将信息装进去;若物理块满,则判断是否物理块中的值是否和页块号相同,如果有相同的,那么更新时间顺序,如果没有相同的,则找到最久没有被使用的,将其替换出来,同时更新时间
理清逻辑后,我们写代码
#include <iostream>
#define N 200
using namespace std;
int page[N];//页面引用号
struct block
{
int block;
int bt; //时间
}b1[N];
int n;//页面引用号个数
int m;//物理块数目
void lru()
{
int j = 0;
memset(b1, -1, sizeof(b1)); //将物理块清零
for (int i = 0; i < n; i++)
{
for (; j < m;)
{
if (b1[j].block == -1) //判断是否满
{
b1[j].block = page[i]; //不满写进去
b1[j].bt = j;
cout<<endl<<"当前内存中页面情况wu:"<<endl;
for(int x = 0; x < m; x++)
cout<<b1[x].block<<" "; //遍历
cout<<endl<<endl;
j++;
cout<<j<<endl;
j = j%m ;
break;
}
bool flag=false;
int MIN=0x3f3f3f3f,p=0;
for(int w = 0; w < m; w++)
{ if (b1[w].block == page[i]) //判断物理块中是否有与页块号相同的
{
b1[w].bt = m-1;
for(int a = m-1; a > w; a--)
b1[a].bt--;
cout<<endl<<"当前内存中页面情况chong:"<<endl;
for(int x = 0; x < m; x++)
cout<<b1[x].block<<" ";
cout<<endl<<endl;
flag=true;
break;
}
if(MIN>b1[w].bt) //找最小的,当然也可以用for循环跑
{
MIN=b1[w].bt;
p=w;
}
}
if(!flag) //物理块满,并且不相同
{
b1[p].block = page[i]; //替换最久没使用过的
b1[p].bt = m-1; //更新时间信息
for(int a = m-1; a > p; a--) //更新时间信息
b1[a].bt--;
}
cout<<endl<<"当前内存中页面情况ti:"<<endl;
for(int x = 0; x < m; x++)
cout<<b1[x].block<<" ";
cout<<endl<<endl;
break;
}
}
}
int main()
{
cin>>n>>m;
for(int i=0; i < n; i++){
cin>>page[i];
}
lru();
return 0;
}