页面淘汰算法

#include <iostream>
using namespace std;
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#define N 1000
#define M 20

int p[N];

char F[N];
int FF[N];

int m[M];

int mm[N][M];

float num=0;

int n,Transfer,b;
int temp;

void MakeRodom()
{
 int flag=1;
    cout<<"请输入分页的最大的页数(即为你的程序分了几页):";
    cin>>n;
    cout<<endl;
    cout<<"请输入你准备调入页的个数:"<<endl;
    cin>>Transfer;
 while(flag)
 {
  cout<<"请输入要的缓冲块的个数(为了方便,最大为可为20):";
  cin>>b;
  if(b>=M)
   cout<<"error!您输入的缓冲块数大于等于"<<M<<"请重新输入"<<endl;
  else
   flag=0;
 }
 srand((unsigned)time(NULL));//播种子,随时间的不同播不同的种子,故每次产生的随机数都不相同,由于用到time,故需要头函数time.h
 int *a=new int[Transfer],i;
    for(i=0;i<Transfer;i++)
  a[i]=rand()%n;//产生0~n间的随机数,不包括n,包括0
 cout<<"由随机函数产生的"<<Transfer<<"个数如下:"<<endl;
 for(i=0;i<Transfer;i++)
 {
  if(i%5==0)cout<<endl;//每行输出5个
  cout<<"  "<<a[i];
  p[i]=a[i];
 }
 delete []a;
 cout<<endl;
}
void FIFO()//到了最后才移位,腾出空间给新的页

{
 cout<<"这位先进先出算法,输出如下:"<<endl;
 num=0;
 for(int i=0;i<b;i++)
  m[i]=-1;
 
 for(i=0;i<Transfer;i++)
  
 {

  
  int count=0;
  
  int k=b-1;
  
  while(1)//判断是够在块中有这一页,没有找到,则F[i]做标记,然后退出
   
  {
   
  if(count==b)
    
   {F[i]='+';num++;break;}
   
   else if(p[i]!=m[count])
    
   {count++;}
   
   else break;
   
  }
  
  while(k!=0&&count==b)//如果在块中没有找到相关的页,则插入一页
   
  {
   
   
   
   m[k]=m[k-1];//总是要覆盖最后一位,因为那样的一位总是使得最后一位是最先进入的
   
   k--;
   
   if(k==0)
    
   {m[k]=p[i];}
   
   else continue;
   
  }
  
  
  
  
  for(int w=0;w<b;w++)//将数据输入到二维的数组中
   
  {
   mm[i][w]=m[w];
   
  }
  
 }
 
}

void LRU()

{
 cout<<"最近最久未使用算法,输出如下:"<<endl;
 num=0;
for(int i=0;i<b;i++)
  m[i]=-1;

 

int temp;

for(i=0;i<Transfer;i++)

{
 
 int count=0;
 
 while(p[i]!=m[count]&&count<b)
  
 {count++;}
 
 if(count==b)
  
 {
  
  m[0]=p[i];//覆盖,然后后面进行移动,是的其中的是保持一个规律(如下)
  
  for(int j=0;j<(b-1);j++)
   
  {temp=m[j];//移动使得i的值越大越是最近访问过的
  
  m[j]=m[j+1];
  
  m[j+1]=temp;}
  
  F[i]='+';
  
  num++;
  
 }
 
 else//在缓冲中找到时,也做相应的变化,使其符合规律
  
 {
 temp=m[count];

 for(int j=count;j<(b-1);j++)
 {
  m[j]=m[j+1];
 }
 m[j]=temp; 
 }
 
 for(int w=0;w<b;w++)
  
 {
  mm[i][w]=m[w];
  
 }
 
}

}
void OPT()

{
 cout<<"最佳算法,输出如下:"<<endl;
 num=0;
for(int i=0;i<b;i++)
  m[i]=-1;

for(i=0;i<Transfer;i++)
{
 for(int j=0;j<b;j++)//在缓冲中找相应的数,找到不做任何操作;但是如果找到的话,作如下的操作
 {
  if(p[i]==m[j])
   break;
 }
 if(j==b)//说明没有找到
 {
  num++;
  F[i]='+';
  for(int r=0;r<b;r++)//做相应的变化,用FF[]作为标记位
   for(int q=i+1;q<Transfer;q++)
   {
    if(m[r]==p[q])
    {
     FF[r]=q;
     break;
    }
    else if(q==Transfer-1)
    {
     FF[r]=100;//没有找到赋值一个大数,使其确定被新来的页覆盖
     break;
    }
   }
    temp=0;
    
    for(r=1;r<b;r++)
    {
     if(FF[r]>FF[temp])
      temp=r;
    }
   /* cout<<"temp="<<temp;*/
    m[temp]=p[i];
 }
 for(int w=0;w<b;w++)
  
 {
  mm[i][w]=m[w];
  FF[w]=0;
  
 }
 
 
}


}
void DISPLAY()

{
 

 cout<<"P"<<setw(6);
 for(int i=0;i<b;i++)
 {
  cout<<"M"<<i+1<<setw(5);
 }
 cout<<"F"<<endl;

 for(i=0;i<Transfer;i++)
  
 {
  
  cout<<p[i]<<setw(6);
  
  for(int j=0;j<b;j++)
   
  {cout<<mm[i][j]<<setw(6);}
  
  cout<<F[i];
  
  cout<<endl;}
 
 cout<<"缺页中断次数:"<<setw(3)<<num<<endl;
 
 cout<<"缺页率:"<<setw(3)<<num/Transfer<<endl;
 
}

void main()

{int count=1,mark=1;char ch;
cout<< " ┏━━━━━━━━━━━━━━━━━━━━━━━┓ "<<endl;
cout<< " ┃     页式内存管理系统模拟程序        ┃ "<<endl;
cout<< " ┠────────────────────—──┨ "<<endl;
cout<< " ┃选择算法: 1-FIFO 2-LRU 3-OPT 0-EXIT           ┃ "<<endl;
cout<< " ┃                                ┃ "<<endl;
cout<< " ┃ 说明:在原先的块中,-1代表没有任何页在内存中  ┃ "<<endl;
cout<< " ┗━━━━━━━━━━━━━━━━━━━━━━━┛ "<<endl;
while(1)
{ cout<<"请输入您的选择:";

int p;

cin>>p;
if(p>0 && p<4)
{
 if(count>=2)
 {
  mark=0;
  cout<<"您是否想重新生成随机数?(y/n)";
  cin>>ch;
  if(ch=='y'||ch=='Y')
  {
   MakeRodom();
  }
  
 }
 if(count==1)
  MakeRodom();
}

switch(p)

{
 
case 1:{FIFO();DISPLAY();break;}
 
case 2:{LRU();DISPLAY();break;}
 
case 3:{OPT();DISPLAY();break;}
 
case 0: {exit(1);}
 
default: {cout<<"input error,please input again/n";continue;}
}
char ch;
cout<<"您还想继续测试吗?(y/n)";
cin>>ch;
if(ch=='y'||ch=='Y')
{
 count++;
 continue;
}
else if(ch=='n'||ch=='N')
exit(1);

}

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值