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

📄 mmanage.cpp

📁 操作系统课程设计《页面置换算法》
💻 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 + -