⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fifolru.cpp

📁 完成一些算法功能 FIFO LRU两种
💻 CPP
字号:
//文件FIFOLRU.cpp
#include"FIFOLRU.h"
#include<iomanip.h>      //为下面调用setw()函数作声明

void StoreM::Input1()
{ ap1=1;      //标志着有输入页框数
  cout<<endl<<"请输入作业的页框数:";
  cin>>N;
  page=new Pro[N];
}

void StoreM::Input2()
{ ap2=1;    //标志着有输入页面走向
  cout<<endl<<"请输入该作业的页面走向的总个数:";
  do
  { cin>>m;
    if(m>M)     //已经定义了最大,所以不能超过最大的页号数
	  cout<<endl<<"总页面数太多,请重试!"<<endl;
	else
	  break;
  }while(1);
  cout<<endl<<"请输入此作业的页面走向:";
  for(int i=0;i<m;i++)
  { cin>>P[i].content; 
    P[i].time=0;     //令其对应的页面号在内存中的时间为0
  }
}

void StoreM::BlockClear()    //逐个的初始化页面的基本情况
{ for(int i=0;i<N;i++)
  { page[i].content=-1;
    page[i].time=0;
  }
}

void StoreM::Display(int a,int b)    //显示被置换和被修改的页面
{ for(int i=0;i<N;i++)
    cout<<setw(3)<<page[i].content<<"  ";
  if(a!=-1)
	cout<<"   "<<b<<" 置换出上一个的 "<<a;
  cout<<endl;
}

int StoreM::Search(int e)
{ for(int i=0;i<N;i++)       //逐个从页面中查找是否与传值下来的页号相匹配
    if(e==page[i].content)
	  return i;       //找到了就返回其下标
   return -1;         //没找到就返回-1
}

int StoreM::Max()    //在页面中查找离现在时间最长的页面
{ int e=page[0].time;
  for(int i=0;i<N;i++)   //逐个在页面中找在页面的时间最长
	if(e<page[i].time)
	  e=page[i].time;
  for(i=0;i<N;i++)     //如果有就返回其下标
	if(e==page[i].time)
	  return i;
  return -1;          //没有就返回-1
}

void StoreM::FIFO()
{ int i=0,t=0,ne;     //i是作输入的页号的下标,t作页面的下标,ne用来储存没有置换前的页面的页号
  float count=0;       //计量总的缺业个数,初值为0
  if(ap1==1&&ap2==1)    //表示有输入页框数和页面走向
  { cout<<endl<<"以下是FIFO(先进先出)算法页面置换情况及被修改的信息!"<<endl;
    while(i<m)    //在P中逐个遍历所有的页号
	{ if(Search(P[i].content)>=0)
        i++;
      else
	  { if(t==N)   t=0;    //t到了末尾就令它到首位
	    else
		{ count++;     //表示有缺业情况计量就加1
	      ne=page[t].content;    //储存置换前的页面的页号
		  page[t].content=P[i].content;     //置换相应的页号
	      Display(ne,P[i].content);     //显示相关信息
		  t++;     //下标移向下一个
		}
	  }
	}
    cout<<endl<<"缺业次数为:"<<count<<"   缺业率为:"<<count/m<<endl<<endl;
  }
  else      //没有输入页框数和页面走向就提示没有输入相关信息
	cout<<endl<<"!!!想查询FIFO页面置换算法,请先确定页框数及页面走向都输入了!!!"<<endl<<endl;
}

void StoreM::LRU()
{ int t,ne;     //t用来接收在页面中查找是否有相同的页号的返回值,ne用来储存没有置换前的页面的页号
  float count=0;  //计量总的缺业个数,初值为0
  if(ap1==1&&ap2==1)    //表示有输入页框数和页面走向
  { cout<<endl<<"以下是LRU(最近最久未使用)算法页面置换情况及被修改的信息!"<<endl;
    for(int i=0;i<m;i++)   //在P中逐个遍历所有的页号
	{ t=Search(P[i].content);
      if(t>=0)   //找到了就令其在内存中的时间为0
	    page[t].time=0;
	  else
	  { count++;   //表示有缺业情况计量就加1
	    t=Max();   //在页面中找离现在时间最久的页号下标
	    ne=page[t].content;    //储存置换前的页面的页号
	    page[t].content=P[i].content;  //置换相应的页号 
		Display(ne,P[i].content);   //显示相关信息 
	    page[t].time=0;    //用完了就令对应在内存的时间为0
	  }
	  for(int j=0;j<t;j++)    //不是离现在时间最久的页号对应的时间就相应的加1
	    page[j].time++;
	  for(j=t+1;j<N;j++)
	    page[j].time++;
	}
    cout<<endl<<"缺业次数为:"<<count<<"   缺业率为:"<<count/m<<endl<<endl;
  }
  else     //没有输入页框数和页面走向就提示没有输入相关信息
	cout<<endl<<"!!!想查询LRU页面置换算法,请先确定页框数及页面走向都输入了!!!"<<endl<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -