页面存储管理系统

这是一个关于页面置换算法的实现,包括FIFO(先进先出)、LRU(最近最少使用)和OPT(最佳置换)算法。程序首先随机生成一个页面访问序列,然后根据选择的算法计算缺页率,并显示内存中的页面状态。通过比较不同算法的性能,展示了虚拟内存管理中的页面调度策略。

#include<stdlib.h>
#include<time.h>
#include <iostream>
#define Bsize 3                //页面块数
#define Psize 20
using namespace std;

struct pageInfor
{
 int ID;   //页面号
 int visit;  //被访问标记
};

pageInfor * block;  //物理块
pageInfor * page;  //页面号串
class SWM
{
private:
 int i;
 int count;
public: 
    //置初值 
 void BlockClear()
 {
  for(int i=0; i<Bsize; i++)
  {
   block[i].ID = -1;
   block[i].visit = 0;
  }
 }
    //初始化
 void inital()
 {
  int  QString[Psize]={0};
  srand(time(0));
  for(int  i=0;i<20;i++)
  {
   QString[i]=rand()%10;
   printf("%d",QString[i]);
  }
  cout<<endl;
  block = new pageInfor[Bsize];
  BlockClear();

  page = new pageInfor[Psize];
  for(i=0; i<Psize; i++)
  {
   page[i].ID = QString[i];
   page[i].visit = 0;
  }
 }
    //查找是否有空闲内存
 int findSpace()
 {
  for(int i=0; i<Bsize; i++)
   if(block[i].ID == -1)
      return i;//找到空闲内存,返回BLOCK中位置
  return -1;
 }
    //查找内存中是否有该页面
 int findExist(int curpage)
 {
  for(int i=0; i<Bsize; i++)
   if(block[i].ID == page[curpage].ID)
      return i;//找到内存中有该页面,返回BLOCK中位置
  return -1;
 }
    //查找应予置换的页面
 int findReplace()
 {
  int pos = 0;
  for(int i=0; i<Bsize; i++)
   if(block[i].visit >= block[pos].visit)
      pos = i;//找到应予置换页面,返回BLOCK中位置
  return pos;
 }
    //显示
 void display()
 {
  cout<<"\n";
  for(int i=0; i<Bsize; i++)
   if(block[i].ID != -1)
      cout<<block[i].ID<<" ";
  cout<<endl;
  cout<<"\n";
 }
    //FIFO算法
 void FIFO()
 {  
  count=0;
  int exist,space,position ;
  for(int i=0; i<Psize; i++)
  {
  exist = findExist(i);
  if(exist != -1)
  {
   cout<<"即将访问的是页面"<<page[i].ID<<endl;
      cout<<"内存中已存在该页"<<endl;
  }
  else
  {  
     space = findSpace();
     if(space != -1)
     {
    block[space] = page[i];
    display();
     }
     else
     {
    position = findReplace();
    cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
    block[position] = page[i];  
    display();
    count++;
     }
  }
  for(int j=0; j<Bsize; j++)
     block[j].visit++;//BLOCK中所有页面visit++
  }
  cout<<"\nFIFO算法的缺页率是:"<<(float)count/20<<endl;
 }

    //LRU算法
 void LRU()
 {
  count=0;
  int exist,space,position ;
  for(int i=0; i<Psize; i++)
  {
   exist = findExist(i);
   if(exist != -1)
   {
      cout<<"即将访问的是页面"<<page[i].ID<<endl;
         cout<<"内存中已存在该页"<<endl;;
         block[exist].visit = -1;//恢复存在的并刚访问过的BLOCK中页面visit为-1
   }
       else
     {
         space = findSpace();
         if(space != -1)
      {
    block[space] = page[i];    
    display();
      }
         else
      {
    position = findReplace();
    cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
    block[position] = page[i];  
    display();
    count++;
      }
     }
     for(int j=0; j<Bsize; j++)
     {
      block[j].visit++;
    
     }
  }
    cout<<"\n LRU算法的缺页率是:"<<(float)count/20<<endl;
 }
    //OPT算法
 void OPT()
 {
  count=0;
  int exist,space,position ;
  for(int i=0; i<Psize; i++)
  {   
    exist = findExist(i);
    if(exist != -1)
    {
      cout<<"即将访问的是页面"<<page[i].ID<<endl;
      cout<<"内存中已存在该页"<<endl;
    }
    else
    {  
     space = findSpace();
     if(space != -1)
     {
   block[space] = page[i];    
   display();
     }
     else
     {
    for(int k=0; k<Bsize; k++)
    for(int j=i; j<Psize; j++)
    {
      if(block[k].ID != page[j].ID)
      {
      block[k].visit = 1000;     
      }
      else
      {
      block[k].visit = j;
      break;
      }
    } 
   position = findReplace(); 
   cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
   block[position] = page[i];    
   display();
        }
       }
     }
   } 
};
void main()
{
  int ch;
  SWM test;
   printf("\t\t           页面置换算法        \n");
   printf("\t\t            虚拟内存            \n");
   printf("\t\t       1、产生随机序列          \n");
   printf("\t\t       2、最久未使用(LRU)       \n");
   printf("\t\t       3、先进先出(FIFO)        \n");
   printf("\t\t       4、最佳置换算法(OPT)     \n");
  // printf("\t\t       5、三种算法的比较() 
 // cout<<"计算机随机产生一组种子:";
 // test.inital();
  while(ch)
  {
   cin>>ch;
   switch(ch)
   {
   case 1:
    cout<<"计算机随机产生一组种子:";
    test.inital();
    test.BlockClear();
    cout<<endl;
 cout<<"进程块数是3"<<endl;
 cout<<"请选择算法"<<endl;
    break;
   case 2:
    cout<<"LRU:"<<endl;
    test.LRU();
    test.BlockClear();
    cout<<endl;
    break;
 case 3:
    cout<<"FIFO:"<<endl;
    test.FIFO();
    test.BlockClear();
    cout<<endl;
    break;
 case 4:
    cout<<"LRU:"<<endl;
    test.OPT();
    test.BlockClear();
    cout<<endl;
    break;
 default:
    cout<<"ERROR COMMAND!"<<endl;
 getchar();
   break;
   }

  }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙在江湖aa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值