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

📄 请求分页.cpp

📁 操作系统的页面置换算法,FIFO,LRU
💻 CPP
字号:
//#include "stdafx.h"

 #include   <iomanip.h>
#include <windows.h>
#include "stdio.h"
#include "iostream.h"
#include "stdlib.h"
#include "time.h"

//________________顺序栈定义_________________
#define maxsize 10	
typedef struct             
{
	int pagelistID[maxsize];
	int top;
}seqstack;
seqstack *seq;//顺序栈指针 
//_______________几个全局变量________________
int memory[8][8];//模拟内存,为后面位示图用
int backup[50][2];
int backbit[8][8];
int count=0;//backup得计数器
int pagelength;//页表长度  6
int memorylength;//块数目等于栈数目 3/4
int pagesize;//每页大小 1k/4k
/*FIFO*/		/*LRU*/
int lakepage=0,lakepageLRU=0;//缺页.lake缺**
int visit=0,visitLRU=0;;//访问次数
int hit=0,hitLRU=0;//命中次数
int replace=0,replaceLRU=0;//置换次数
//-------------扩充页表带状态标志位----------------------
typedef struct 
{
	int physical;//物理块号就是位示图中的块号
	int sign;//状态标志
	int physicalLRU;//LRU
	int signLRU;//LRU状态标志
}pagelist;
pagelist *page;//页表的指针
      
//-----------------------------------------------


void menu()
{
	cout<<"\t**********************************"<<endl;
	cout<<"\t*********请求分页实验二***********"<<endl;
	cout<<"\t*********叶相延  20063838*********"<<endl;
	cout<<"\t**********************************"<<endl;
}
void BitShow(int a[8][8])//位示图  8*8矩阵 1行为1  剩下七行随即
{
	cout<<"\n\t*******示位图******"<<endl;
	cout<<"       第0 1 2 3 4 5 6 7 列\n"<<endl;
    for(int i=0;i<8;i++)
	{
		cout<<i<<"行\t";
        for(int j=0;j<8;j++)
		{
	        cout<<" "<<a[i][j];
		}
	    cout<<endl;
	}
}

void chushihua()
{
	srand( (unsigned)time( NULL ) ); //以系统时间作为随机数种子
	int i,j;
//_________________位示图初始化______________________________________
	for(i=1;i<8;i++)//行
	{
     for(j=0;j<8;j++)//列
	 {
		 memory[0][j]=1;//0为1
	     memory[i][j]=rand()%2;//其他行为随即数
	 }
	}
				//-------------------位示图备份--------------------------------
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
		{
			backbit[i][j]=memory[i][j];
		}
	}

//____________________创建页表数据________________________________
	cout<<"\n\t初始化页表数据.......\n";
	cout<<"\n\t输入页表长度(max=10):";
	cin>>pagelength;//页表长度
	cout<<"\n\t输入内存块数:";
	cin>>memorylength;//栈长度=内存块数
	cout<<"\n\t输入页大小,单位KB:";
	cin>>pagesize;//页长度
	cout<<endl;	
//___________________动态分配空间________________
	seq=new seqstack;
	page=new pagelist[pagelength];
//____________________________________________________________
	for(i=0;i<pagelength;i++)//长度小于pagelength循环初始化
	{//页号   物理块号 状态位
		page[i].sign =0;//初始化页没有进入内存全部置为0
		page[i].physical=-1;//-1表示空,没有对应的物理块
		page[i].signLRU=0;//初始化页没有进入内存全部置为0
		page[i].physicalLRU=-1;//-1表示空,没有对应的物理块
	}	
	
	for(i=0;i<memorylength;i++)//小于栈长度,栈置空
	{   
	seq->pagelistID[i]=-1;
	}
	seq->top=-1;
}

void chushihuaLRU()
{
	int i;
	seq->top=-1;
	for(i=0;i<pagelength;i++)
	{
		page[i].signLRU=0;
		page[i].physicalLRU=-1;
	}
}

void displaym()//内存和页表,显示函数
{
	cout<<"\n******************************\n";
	cout<<"\t页表\t\n";
	cout<<"**********************************\n";
	cout<<"页号"<<"\t"<<"物理块号"<<"\t"<<"状态位"<<"\t"<<endl;	
	for(int i=0;i<pagelength;i++)
	{
		cout<<i<<"\t"<<dec<<page[i].physical<<"\t\t"<<dec<<page[i].sign <<endl;
	}
	cout<<"\n******************************\n";
	cout<<"内存/栈内"<<endl;
	cout<<"  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄"<<endl;
	cout<<"|   栈号   |   页号   |"<<endl;
	for(i=seq->top;i>=0;i--)
	{
	cout<<"|__________|__________|"<<endl;
	cout<<"|     "<<i<<"    |     "<<dec<<seq->pagelistID[i]<<"    |\n";
	}
	cout<<"|__________|__________|"<<endl;
}

void displaymLRU()//内存和页表,显示函数LRU
{
	cout<<"\n******************************\n";
	cout<<"\t LRU页表\t\n";
	cout<<"**********************************\n";
	cout<<"页号"<<"\t"<<"物理块号"<<"\t"<<"状态位"<<"\t"<<endl;	
	for(int i=0;i<pagelength;i++)
	{
		cout<<i<<"\t"<<dec<<page[i].physicalLRU<<"\t\t"<<dec<<page[i].signLRU<<endl;
	}
	cout<<"******************************\n";
	cout<<"内存/栈内"<<endl;
	cout<<"  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄"<<endl;
	cout<<"|   栈号   |   页号   |"<<endl;
	for(i=seq->top;i>=0;i--)
	{
	cout<<"|__________|__________|"<<endl;
	cout<<"|     "<<i<<"    |     "<<dec<<seq->pagelistID[i]<<"    |\n";
	}
	cout<<"|__________|__________|"<<endl;
}

void displays(int ps,int pl,int ml,int lp,int vt,int ht,int rep)//缺页等显示函数
{
	cout<<"\n******FIFO页表状态*********\n";
	cout<<"页(内存块)大小KB:"<<ps;
	cout<<"\n页表长度:"<<pl;
	cout<<"\n内存栈个数:"<<ml;
	cout<<"\n缺页数:"<<lp;
	cout<<"\n访问次数:"<<vt;
	cout<<"\n命中次数:"<<ht;
	cout<<"\n置换次数: "<<rep;
	cout<<"\n缺页率:"<<lp*100/vt<<"."<<lp*100%vt<<"%";
	cout<<"\n命中率:"<<ht*100/vt<<"."<<ht*100%vt<<"%";
}
int changBitShow(int a[8][8])//修改位示图
{
	int i,j;
	for(i=0;i<8;i++)//修改位示图
	{
		for(j=0;j<8;j++)
		{
			if(a[i][j]==0)
			{
				a[i][j]=1;
			    return i*8+j+1;	
			}
		}
	}
     return -1;
}


void FIFO(int pagep,int paged)
{

	int i=0;	

		visit++;//访问增加一次
		if(page[pagep].sign==1)
		{
			cout<<"\t**********\n";
			cout<<"\t***命中***\n";
			cout<<"\t**********\n";
			hit++;
		}//命中+1
		else 
		{	
			cout<<"\n**************\n";
			cout<<"***发生缺页***\n";
			cout<<"**************\n";
			lakepage++;
			page[pagep].sign=1;//修改占用标志
			if(seq->top<memorylength-1)//栈不满
			{
				seq->top++;
				seq->pagelistID[seq->top]=pagep;//页号入栈
				page[pagep].physical=changBitShow(memory);
				BitShow(memory);//改位示图
			}
			else 
			{
				replace++;
				page[seq->pagelistID[0]].sign =0;
				int x;
				x=page[seq->pagelistID[0]].physical;
				page[seq->pagelistID[0]].physical=-1;
				for(i=0;i<seq->top;i++)
				{seq->pagelistID [i]=seq->pagelistID[i+1];}
				page[pagep].physical=x;				
				seq->pagelistID [seq->top]=pagep;								
			}
		}
		cout<<"*****逻辑地址:"<<hex<<pagesize*1024*pagep+paged;		
		cout<<"\n*****物理地址:"<<hex<<pagesize*1024*(page[pagep].physical)+paged;
		displaym();
		return;
	
}
void LRU(int pagep,int paged)
{
	int temp;

		visitLRU++;//访问增加一次
		if(page[pagep].signLRU==1)//在内存
		{
			cout<<"\n***********\n";
			cout<<"***命中***\n";
			cout<<"**********\n";
			hitLRU++;
			int i=0;
			while(i<=seq->top)
			{
				if(seq->pagelistID[i]==pagep)break;
				i++;
			}
			while(i<seq->top)
			{
				temp=seq->pagelistID[i];
				seq->pagelistID[i]=seq->pagelistID[i+1];
				seq->pagelistID[i+1]=temp;
				i++;
			}
		}
		else//不在内存
		{
			cout<<"\n**************\n";
			cout<<"***发生缺页***\n";
			cout<<"**************\n";
			lakepageLRU++;
			page[pagep].signLRU=1;//修改占用标志
			if(seq->top<memorylength-1)//栈不满
			{
				seq->top++;
				seq->pagelistID[seq->top]=pagep;//页号入栈
				page[pagep].physicalLRU=changBitShow(backbit);//改位示图
				BitShow(backbit);
			}
			else
			{
				replaceLRU++;
				page[seq->pagelistID[0]].signLRU=0;
				int x,i;
				x=page[seq->pagelistID[0]].physicalLRU;
				page[seq->pagelistID[0]].physicalLRU=-1;
				for(i=0;i<seq->top;i++)
				{seq->pagelistID[i]=seq->pagelistID[i+1];}
				page[pagep].physicalLRU=x;				
				seq->pagelistID[seq->top]=pagep;								
			}
		}		
		cout<<"逻辑地址:\n"<<hex<<pagesize*1024*pagep+paged;		
		cout<<"\n物理地址:\n"<<hex<<pagesize*1024*(page[pagep].physicalLRU)+paged;
		displaymLRU();
		return;

}
void main()
{


	menu();
//	
	char c='0';
	int logicadd;//逻辑地址
	int pagep,p;//页号
	int paged,d;//页内地址
	while(c!='#')
	{
	chushihua();
	char s='0';


	while(s!='#')
	{
		cout<<"输入逻辑地址(16位):";
		cin>>hex>>logicadd;
		cin.get();
		pagep=logicadd/(pagesize*1024);//页号
		paged=logicadd%(pagesize*1024);//偏移量
		while(pagep>pagelength-1)
		{
			cout<<"输入逻辑地址*越界*,重新输入........\n";
			goto loop;
		}
		backup[count][0]=pagep;//保存页号
		backup[count][1]=paged;//页内偏移地址
		count++;		
loop:	cout<<"按#结束输入,按其他键继续.....................\n";

	s=cin.get();   
	}
	BitShow(memory);
	cout<<"输入的逻辑地址,将要访问页号为:\n";
	for(int i=0;i<count;i++)
	{
		cout<<backup[i][0]<<"\t";
	}
	cout<<"\n*************************FIFO算法显示*******************************\n";
	for(i=0;i<count;i++)
	{
		p=backup[i][0];
		d=backup[i][1];
		FIFO(p,d);
		system("pause");
	}
	displays(pagesize,pagelength,memorylength,lakepage,visit,hit,replace);	
	cout<<"\n***********FIFO算法显示完毕,按任意键继续LRU************************\n";
	cout<<"\n***************************LRU算法显示*********************************\n";
	chushihuaLRU();
	system("pause");
	for(i=0;i<count;i++)
	{
		p=backup[i][0];
		d=backup[i][1];
		LRU(p,d);
		system("pause");
	}
	displays(pagesize,pagelength,memorylength,lakepageLRU,visitLRU,hitLRU,replaceLRU);
	cout<<"运算完毕,本次请求分页即将结束,如继续进行,请按任意键.....\n退出请按'#'.......\n";

	cin>>c;   
	system("cls");
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -