-
最近最久未使用(LRU)置换算法原理 就是:当需要淘汰某页面时,选择当前一段时间内最久未使用过的页先淘汰, 即淘汰距当前最远的上次使用的页。
例如: 分配给该进程的页块数为3,一个20长的页面访问序列为 :12560,36536,56042,70435, 则缺页次数和缺页率按下图给出: -
假定分配给该进程的页块数为3,页面访问序 列长度为20。本实验可以采用数组结构实现, 首先随机产生页面序列,当发生请求调页时, 若内存已满,则需要利用LRU算法,将当前一段时间内最久未使用过的页替换出去。
数据结构:
struct memory //表示每一个页块
{
int num;
int time;
}page[100];
void print()//打印
int find() //找到最久未置换或者空页块
void run() //时间加1
void change(memory page[],int xulie[]) //页块分配
具体代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
struct memory
{
int num;
int time;
}page[100];
int count=0;
int n, m;
void print()//打印
{
cout<<"页块号 内容 时间"<<endl;
for(int i=0;i<n;i++)
{
cout<<i+1<<" "<<page[i].num<<" "<<page[i].time<<endl;
}
}
int find() //找到最久未置换或者空页块
{
int nu=0;
for(int i=0;i<n;i++)
{
if(page[i].num==-1)
{
nu=i;
return nu;
break;
}
}
int max=0,maxnum=0;
for(int i=0;i<n;i++)
{
if(page[i].time>max)
{
max=page[i].time;
maxnum=i;
}
}
return maxnum;
}
void run() //时间加1
{
for(int i=0;i<n;i++)
{
if(page[i].num!=-1) page[i].time++;
}
}
void change(memory page[],int xulie[]) //页块分配
{
for(int i=0;i<m;i++)
{
bool fa=true;
for(int j=0;j<n;j++) //命中
{
if(page[j].num==xulie[i])
{
fa=false;
page[j].time=-1;
run();
print();
break;
}
}
if(fa==true) //不命中
{
count++;
int j=find();
page[j].num=xulie[i];
page[j].time=-1;
run();
print();
}
}
}
int main()
{
int xulie[100];
cout << "分配给进程的页块数为:";
cin >> n;
cout<< "请输入页面访问序列长度:";
cin >> m;
for(int i=0;i<n;i++) //页块初始化
{
page[i].num=-1;
page[i].time=0;
}
cout<<"页面访问序列为";
for (int i = 0; i < m; i++)
{
xulie[i] = rand()%10;
cout<<xulie[i]<<" ";
}
cout<<endl;
change(page,xulie);
double queyelv=count*1.000/m;
cout<<"缺页次数:"<<count<<endl<<"缺页率:"<<queyelv;
}