操作系统课程设计-页面置换算法

程序代码:

#include <iostream>
#include <time.h>
#define Bsize 3
#define Psize 12
using namespace std;
int QString[Psize];
void P_String()
{
 int i;
 srand((unsigned)time(NULL));  
 for(i=0;i<Psize;i++)
 {
  QString[i]=rand()*9/RAND_MAX+1;
 }
 cout<<"页面走向:";
 for(i=0;i<Psize;i++)
 {
  cout<<QString[i]<<" ";
 }
 cout<<endl;
}
struct pageInfor
{
 int content;//页面号
 int timer;//被访问标记
};

class Fifo_replace
{
public:
    Fifo_replace(void);  //构造函数
 ~Fifo_replace(void); //析构函数
 int findSpace(void); //查找是否有空闲内存
 int findExist(int curpage);  //查找内存中是否有该页面
 int findReplace(void);  //查找应予置换的页面
 void FIFO(void);   //FIFO算法
 void BlockClear(void);  //BLOCK恢复
 pageInfor *block;  //物理块
 pageInfor *page;  //页面号串
 int memory_state[Bsize][Psize];
 int s;
private:
};

Fifo_replace::Fifo_replace(void)
{
 int j;
 P_String();
 s=0;
 block = new pageInfor[Bsize];
 for(int i=0; i<Bsize; i++) //初始化Block
 {
  block[i].content = -1;
  block[i].timer = 0;
 }
 page = new pageInfor[Psize];
 for(i=0; i<Psize; i++)
 {
  page[i].content = QString[i];
  page[i].timer = 0;
 }
 for(i=0;i<Psize;i++)
  for(j=0;j<Bsize;j++)
   memory_state[j][i]=0;
}

Fifo_replace::~Fifo_replace()
{
 s=0;
}

int Fifo_replace::findSpace(void)
{
 for(int i=0; i<Bsize; i++)
  if(block[i].content == -1)
   return i;//找到空闲内存,
 return -1;
}

int Fifo_replace::findExist(int curpage)
{
 for(int i=0; i<Bsize; i++)
 if(block[i].content == page[curpage].content)
  return i;//找到内存中有该页面,返回BLOCK中位置
 return -1;
}

int Fifo_replace::findReplace(void)
{
 int pos = 0;
 for(int i=0; i<Bsize; i++)
  if(block[i].timer >= block[pos].timer)
   pos = i;//找到应予置换页面,返回BLOCK中位置
 return pos;
}

void Fifo_replace::FIFO(void)
{
 int exist,space,position ;
 for(int i=0; i<Psize; i++)
 {
  exist = findExist(i);
  if(exist != -1)
  {
   for(int b=0; b<Bsize; b++)
   {
    memory_state[b][i]=memory_state[b][i-1];
   }
   s++;
  }
  else
  { 
   space = findSpace();
   if(space != -1)
   {
    for(int b=0; b<Bsize; b++)
    {
     memory_state[b][i]=memory_state[b][i-1];
    }
    block[space] = page[i];
    memory_state[space][i]=block[space].content;
    if(space==1)
    {
     memory_state[1][0]=0;
     memory_state[2][0]=0;
    }
    else
    {
     memory_state[2][1]=0;
    }
   }
   else
   {
    for(int b=0; b<Bsize; b++)
    {
        memory_state[b][i]=memory_state[b][i-1];
    }
    position = findReplace();
    block[position] = page[i];
    memory_state[position][i]=block[position].content;
   }
  }
  for(int j=0; j<Bsize; j++)
   block[j].timer++;//BLOCK中所有页面TIMER++
 }
}

void Fifo_replace::BlockClear(void)
{
 for(int i=0; i<Bsize; i++)
 {
  block[i].content = -1;
  block[i].timer = 0;
 }
}

typedef struct page
{
 int num;   /*记录页面号*/
 int time;   /*记录调入内存时间*/
}Page;     /* 页面逻辑结构,结构为方便算法实现设计*/

Page b[Bsize];    /*内存单元数*/
int c[Bsize][Psize];   /*暂保存内存当前的状态:缓冲区*/
int queue[100];   /*记录调入队列*/
int K;     /*调入队列计数变量*/
      /*初始化内存单元、缓冲区*/
void Init(Page *b,int c[Bsize][Psize])
{
 int i,j;
 for(i=0;i<Bsize;i++)
 {
  b[i].num=-1;
  b[i].time=Psize-i-1;
 }
 for(i=0;i<Bsize;i++)
  for(j=0;j<Psize;j++)
   c[i][j]=-1;
}

/*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/

int GetMax(Page *b)
{
 int i;
 int max=-1;
 int tag=0;
 for(i=0;i<Bsize;i++)
 {
  if(b[i].time>max)
  {
   max=b[i].time;
   tag=i;
  }
 }
 return tag;
}

/*判断页面是否已在内存中*/

int Equation(int fold,Page *b)
{
 int i;
 for(i=0;i<Bsize;i++)
 {
  if (fold==b[i].num)
  return i;
 }
 return -1;
}

/*LRU核心部分*/

void Lru(int fold,Page *b)
{
 int i;
 int val;
 val=Equation(fold,b);
 if (val>=0)
 {
  b[val].time=0;
  for(i=0;i<Bsize;i++)
   if (i!=val)
    b[i].time++;
 }
 else
 {
  queue[++K]=fold;/*记录调入页面*/
  val=GetMax(b);
  b[val].num=fold;
  b[val].time=0;
  for(i=0;i<Bsize;i++)
   if (i!=val)
    b[i].time++;
 }
}

void main(void)
{
 cout<<"|----------页 面 置 换 算 法----------|"<<endl;
 cout<<"|-------------------------------------|"<<endl;
 cout<<"选 <1>应用FIFO算法"<<endl;
 cout<<"选 <2>应用LRU算法"<<endl;
 cout<<"选择<0>退出"<<endl;
 int select,p,q;
 Fifo_replace test;
 while(select)
 {
  cin>>select;
  cout<<"你选择的是菜单:"<<select<<endl<<endl;
  switch(select)
  {
   case 0:
    cout<<"完成退出。"<<endl;
    break;
   case 1:
    cout<<"FIFO算法状态:"<<endl;
    test.FIFO();
    test.BlockClear();
    cout<<"----------------------"<<endl;
    for(p=0;p<Bsize;p++)
    {
     for(q=0;q<Psize;q++)
      cout<<test.memory_state[p][q]<<" ";
     cout<<endl;
    }
    cout<<"----------------------"<<endl;
    cout<<"缺页率:"<<Psize-test.s<<"/"<<Psize<<endl<<endl;
    test.~Fifo_replace();
    cout<<"请选择菜单:"<<endl;
    break;
   case 2:
    int i,j;
    char y1;
    K=-1;
    Init(b, c);
    for(i=0;i<Psize;i++)
    {
     Lru(QString[i],b);
     c[0][i]=QString[i];
     /*记录当前的内存单元中的页面*/
     for(j=0;j<Bsize;j++)
      c[j][i]=b[j].num;
    }
   /*结果输出*/
    cout<<"LRU算法状态:"<<endl;
    cout<<"----------------------"<<endl;
    for(i=0;i<Bsize;i++)
    {
     for(j=0;j<Psize;j++)
     {
      if(c[i][j]==-1)
       cout<<" 0";
      else
       cout<<" "<<c[i][j];
     }
     cout<<" "<<endl;
    }
    cout<<"----------------------"<<endl;
    cout<<"缺页率:"<<K+1<<"/"<<Psize;
    cout<<endl;
    break;
   default:
    cout<<"请输入正确菜单号。"<<endl;
    break;
  }
 }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值