LRU算法之实现

来源:互联网 发布:程序员上班很闲干嘛 编辑:程序博客网 时间:2024/06/10 08:04

理念理念,写个LRU算法,据说这个是目前公认比较好的页面置换算法,操作系统不能白学,呵呵,下面就是我的实现代码,方法有点野,不过感觉要比用结构体数组做要节约点……

#include<iostream>
#include<vector>
using namespace std;
int Check(int* curPage,int page,int blockNum)//检验是否缺页
{
 int i;
 for(i=0;i<blockNum;i++)
  if(page==curPage[i])
   return 0;//说明没有缺页
 return 1;//说明缺页了
}
int GetPosition(int* curPage,int page,int blockNum)//获取要替换的位置
{
 int i;
 for(i=0;i<blockNum;i++)
 {
  if(curPage[i]==page||curPage[i]==-1)
   return i;
 }
 return -1;
}
int GetStep(int * curPage,int *page,int curPosition,int blockNum)
{
 int i,j,step=0,k=0;
 vector<int> record(blockNum);//记录检索的出现情况
 for(i=0;i<blockNum;i++)
  record[i]=0;
 for(i=curPosition-1;i>=0;i--)
 {
  step++;
  for(j=0;j<blockNum;j++)
  {
    if(record[j]==0&&page[i]==curPage[j])
    {
     record[j]=1;
     k++;
    }
    if(k==blockNum)
     return step;
  }
 }
 return blockNum;
}
void main()
{
 system("color 0E");
//变量声明
 int pageNum,blockNum;//定义页面数和物理块数
 int i,j;//循环变量
 int lackpageNum=0;//缺页数
 
//数据提交
 cout<<"请输入物理块的个数:";//用户输入物理块个数
 cin >> blockNum;
 vector<int> curPage(blockNum);//存放物理块中的页面
 cout<<"请输入页面数:";//用户输入页面数
  cin>>pageNum;
 vector<int> page(pageNum);
 cout<<"请输入要访问的页面顺序:";
 for(i=0;i<pageNum;i++)//用户输入页面访问顺序
  cin>>page[i];
 int step=blockNum;
 
//实现算法
 cout<<"详细信息:"<<endl;
 for(i=0;i<blockNum;i++)
  curPage[i]=-1;//填充注明内存为空

 int *pcurPage=&curPage[0];//引用动态数组
 int *ppage=&page[0];
 
 for(i=0;i<pageNum;i++)
 {
  if(Check(pcurPage,page[i],blockNum)==1)
  {
   lackpageNum++;
   curPage[GetPosition(pcurPage,page[i-GetStep(pcurPage,ppage,i,blockNum)],blockNum)]=page[i];//置换
   cout<<"缺页号为:"<<page[i]<<" ";
  }
  else
   cout<<"            ";
  cout<<"内存情况:";
  for(j=0;j<blockNum;j++)
  {
   
   if(curPage[j]==-1)
    cout<<" ";
   else
    cout<<curPage[j];
   cout<<" ";
  }
  cout<<endl;
  
 }cout<<"缺页率为:"<<((double)lackpageNum/(double)pageNum)*100<<"%"<<endl;
}