LRU算法具体怎么算的,有没有例子

2024-12-12 20:33:58
推荐回答(1个)
回答1:

LRU算法参考例子如下:
include
using namespace std;

int ans[1000];//存放原序列
int block[1000];//机器分给程序的内存块
int num[1000];//每个页面在内存中待的时间
int n; //页面流数
int m; //内存块数
int sum;//命中次数
//初始化函数
void Init()
{
cout<<"输入页面数"< cin>>n;
cout<<"输入原页面流"< for(int i=0;i cin>>ans[i];
cout<<"输入分给程序的内存块数"< cin>>m;
sum=0;
}

//扫描block中是否已存在该块
int saomiao(int k,int now)
{
int i;
for(i=0;i {
if(block[i]==now)return i;
}
return -1;
}

//打印内存中的页面情况
void print(int k,int now)
{
cout<<"被调用的页面号 "< cout<<"内存中的页面号 ";
for(int i=0;i cout< cout<<"对应在内存的时间 ";
for(i=0;i cout< cout<}

//LRU
void LRU()
{
int i,j,k,p;
k=0;//计算已用的内存块数
for(i=0;i {
if(k {
p=saomiao(k,ans[i]);
if(p>=0)
{
sum++;
cout<<"命中"< print(k,ans[i]);//打印内存中的页面情况
for(j=0;j num[j]++;//修改各页在内存中待的时间
num[p]=1;
}
else
{
cout<<"未命中"< print(k,ans[i]);//

block[k]=ans[i];
for(j=0;j num[j]++;
num[k++]=1;
}
}
else
{
p=saomiao(m,ans[i]);
if(p>=0)
{
sum++;
cout<<"命中"< print(m,ans[i]);//
for(j=0;j num[j]++;
num[p]=1;
}
else
{
int max=-1;
int p1=0;
for(j=0;j if(num[j]>max)
{
max=num[j];
p1=j;
}

cout<<"未命中"< print(m,ans[i]);//
cout<<"将被替换的叶号和时间"< block[p1]=ans[i];//替换
for(j=0;j num[j]++;
num[p1]=1;
}
}
}
}

int main()
{
Init();
LRU();
cout<<"命中次数 "< cout<<"命中率 "<<(double)sum/(double)n*100<<"%"< return 0;
}