📄 mmanage.cpp
字号:
// MManage.cpp: implementation of the MManage class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MManage.h"
#include "iomanip"
#include "iostream"
using namespace std ;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MManage::MManage()
{
int PageTable[Psize];//页面访问顺序表
int myrand[Psize]; //存放随机生成指令序列
int i;
int IP; //指令号
bool flag=0;
cout<<"**********请输入第一条指令的指令号:*********"<<endl;
cout<<"*************指令号应在0~319之间***********"<<endl;
cin>>IP;
cout<<"**************************生成的随随机指令序列如下:***************************"<<endl;
myrand[0]=IP;
myrand[1]=IP+1;
cout.setf(ios::left,ios::adjustfield);
cout<<setw(5)<<myrand[0]<<setw(5)<<myrand[1];
for(i=1;i<Psize/2;i++) //随机生成指令序列
{
if(flag==0)
{
myrand[i*2]=rand()%IP%Psize;
myrand[i*2+1]=(myrand[i*2]+1)%Psize;
cout<<setw(5)<<myrand[i*2]<<setw(5)<<myrand[i*2+1];
flag=1;
}
else
{
myrand[i*2]=(rand()%(Psize-IP)+IP)%Psize;
myrand[i*2+1]=(myrand[i*2]+1)%Psize;
cout<<setw(5)<<myrand[i*2]<<setw(5)<<myrand[i*2+1];
flag=0;
}
}
cout<<endl;
cout<<"*******************************调页顺序如下:**********************************"<<endl;
for(i=0;i<Psize;i++)
{
PageTable[i]=myrand[i]/10;
cout<<setw(5)<<PageTable[i];
}
cout<<endl;
Block = new MPage[Bsize];
for(i=0; i<Bsize; i++)
{
Block[i].PageNum = -1;
Block[i].Sign = 0;
}
Page = new MPage[Psize];
for(i=0; i<Psize; i++)
{
Page[i].PageNum =PageTable[i];
Page[i].Sign = 0;
}
}
int MManage::SearchSpace( )
{
for(int i=0; i<Bsize; i++)
if(Block[i].PageNum == -1)
return i; //找到空闲块,返回空闲块号
return -1;
}
int MManage::SearchExist(int curpage)
{
for(int i=0; i<Bsize; i++)
if(Block[i].PageNum == Page[curpage].PageNum)
return i; //该页面已存在,返回该页面所在物理块的块号
return -1;
}
int MManage::SearchReplace( )
{
int pos = 0;
for(int i=0; i<Bsize; i++)
if(Block[i].Sign >= Block[pos].Sign)
pos = i; //找到置换页面,返回该页面所在物理块的块号
return pos;
}
void MManage::Display( )
{
for(int i=0; i<Bsize; i++)
if(Block[i].PageNum != -1)
cout<<setw(3)<<Block[i].PageNum<<" ";
cout<<endl;
}
void MManage::OPT( )
{
int Exist,Space,Position ;
int ShortPage=0;
for(int i=0; i<Psize; i++) //从第一块开始装入
{
Exist = SearchExist(i); //第一块是否存在
if(Exist != -1)
{ } //已存在
else
{
Space = SearchSpace(); //若不存在,寻找空白物理块
if(Space != -1) //若找到空白物理块,将该页调入
{
Block[Space] = Page[i];
Display();
}
else //若全部物理块已分配,进行置换
{
ShortPage++;
for(int k=0; k<Bsize; k++)
for(int j=i; j<Psize; j++)
{
if(Block[k].PageNum != Page[j].PageNum)
{ Block[k].Sign = 10000; }//将来不会用,设置Sign为一个很大数
else
{
Block[k].Sign = j;
break;
}
}
Position = SearchReplace(); //找到不会再用的或下次调用最晚的页面
Block[Position] = Page[i]; //进行置换
Display();
}
}
}
cout<<endl;
cout<<"**********最佳置换算法:**********"<<endl;
cout<<"**********换页次数为:"<<ShortPage<<endl;
cout<<"**********缺页率为:"<<float(ShortPage)/float(Psize)*100<<"%"<<endl;
}
void MManage::FIFO( )
{
int Exist,Space,Position ;
int ShortPage=0;
for(int i=0; i<Psize; i++)
{
Exist = SearchExist(i);
if(Exist != -1)
{ }
else
{
Space = SearchSpace();
if(Space != -1)
{
Block[Space] = Page[i];
Display();
}
else
{
ShortPage++;
Position = SearchReplace();
Block[Position] = Page[i];
Display();
}
}
for(int j=0; j<Bsize; j++)
Block[j].Sign++; //所有物理块的访问次数加1
}
cout<<endl;
cout<<"***************先进先出算法:***************"<<endl;
cout<<"***************换页次数为:"<<ShortPage<<endl;
cout<<"***************缺页率为:"<<float(ShortPage)/float(Psize)*100<<"%"<<endl;
}
void MManage::LRU( )
{
int Exist,Space,Position ;
int ShortPage=0;
for(int i=0; i<Psize; i++)
{
Exist = SearchExist(i);
if(Exist != -1)
{
Block[Exist].Sign = -1;//当前块已存在,本次调用后,将访问标记复位
}
else
{
Space = SearchSpace();
if(Space != -1)
{
Block[Space] = Page[i];
Display();
}
else
{
ShortPage++;
Position = SearchReplace(); //找到最近最久未使用的页面,进行置换
Block[Position] = Page[i];
Display();
}
}
for(int j=0; j<Bsize; j++)
Block[j].Sign++;
}
cout<<endl;
cout<<"*************最近最久未使用算法:*************"<<endl;
cout<<"*************换页次数为:"<<ShortPage<<endl;
cout<<"*************缺页率为:"<<float(ShortPage)/float(Psize)*100<<"%"<<endl;
}
void MManage::BlockClear(void)
{
for(int i=0; i<Bsize; i++)
{
Block[i].PageNum=-1;
Block[i].Sign = 0;
}
}
MManage::~MManage()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -