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

📄 pages.cpp

📁 PAGES3完成了程序的 基本框架
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<iomanip.h>
#include<time.h> 
#include<ctype.h>

#define MAXpagesize  10
#define MAXmemorysize  10
#define MAXpmsize  10
#define MAXOPTnum  10

struct pagetable
{
	int pagenum; //页号 
	int memorynum;//块号 
	int state;//状态位
}pag[MAXpagesize];

struct OPTN
{
	int OPT_logicalad;//OPT中连续i输入的逻辑地址 
	int OPT_shang;//OPT中由逻辑地址求得的商
}OPTnum[MAXOPTnum];

int memory[MAXmemorysize]; //用数组表示内存
int temmap[8][8]; //定义8*8的位示图
int pagelength,memorylength,pmlength;//定义页表长度 内存长度  块长
int visit,hit,lackpage,instead; //定义访问,命中,缺页,置换 次数
int logicalad,physicalad,shang,yu;
float hitRate,lackpageRate; //命中率, 缺页率

void PagetableResult()
{
	cout<<"页表:"<<endl;
	cout<<setw(17)<<"页号"<<setw(7)<<"块号"<<setw(7)<<"状态位"<<endl;
    for(int i=0;i<pagelength;i++)
		cout<<setw(17)<<pag[i].pagenum<<setw(7)<<pag[i].memorynum<<setw(7)<<pag[i].state<<endl;
}

void MemoryResult()
{
	cout<<"内存:"<<endl;
	cout<<setw(17)<<"序号"<<setw(7)<<"页号"<<endl;
	for(int i=0;i<memorylength;i++)
     	cout<<setw(17)<<i<<setw(7)<<memory[i]<<endl;
}

void TemmapResult()
{
	cout<<"位示图:"<<endl;
	for(int i=0;i<8;i++)
		for(int j=0;j<8;j++)
			if(j/7==1)
			    cout<<setw(3)<<temmap[i][j]<<endl;
			else if(j==0)
			    cout<<setw(15)<<temmap[i][j];
			else
			    cout<<setw(3)<<temmap[i][j];
}

void PrintResult()
{
	cout<<"------------当前页面内存信息-----------"<<endl;
    PagetableResult();
	MemoryResult();
    TemmapResult();
	cout<<"---------------------------------------"<<endl;
}

void PagetableInitialize()
{
    for(int i=0;i<pagelength;i++)
	{
		pag[i].pagenum=i;
		pag[i].memorynum=-1;
		pag[i].state=0;
	}
}

void MemoryInitialize()
{
	for(int i=0;i<memorylength;i++)
     	memory[i]=-1;
}

void TemmapInitialize()
{
    srand((unsigned)time(0));;//随机数种子。   
	for(int i=0;i<8;i++)
		for(int j=0;j<8;j++)
			if(i==0)
				temmap[i][j]=1;
			else
			    temmap[i][j]=rand()%2; //随机赋予1或0
}

void Initialize() //初始化页表,内存,位示图
{
	PagetableInitialize();
    MemoryInitialize();
    TemmapInitialize();
}

void VisitMessage()
{
    cout<<"-------当前参数信息--------"<<endl;
	printf("商:%d  余数:%d\n",shang,yu);
	cout<<"10进制 逻辑地址:"<<logicalad<<"  物理地址:"<<physicalad<<endl;
    printf("16进制 逻辑地址:%x  物理地址:%x\n",logicalad,physicalad);
	cout<<"命中次数:"<<hit<<"置换次数:"<<instead<<"缺页次数:"<<lackpage<<"访问次数:"<<visit<<endl;
	cout<<"命中率:"<<hitRate<<"%"<<"            缺页率:"<<lackpageRate<<"%"<<endl;
    cout<<"---------------------------"<<endl;
}

int judge_memory() //判断内存是否已经满,满返回-1,否则返回第一个空位序号
{
	int jud;
    for(int i=0;i<memorylength;i++)
		if(memory[i]==-1)
		{
		   jud=i; break;
		}
        else
		   jud=-1;
	return jud;
}

void change_temmap()   /*有问题待修改*/
{
	int judc=0,hang,lie;
	for(int i=0;i<8;i++)
		{  
		    for(int j=0;j<8;j++)
			if(temmap[i][j]==0)
			{
				hang=i;
				lie=j;
				temmap[i][j]=1;
				judc=1;
				break; //跳出第二层循环
			}
            if(judc==1)
			    break; //跳出第一层循环
		}
    if(judc==0)
		cout<<"提示:位示图全为1,更改失败!"<<endl;
	else
		cout<<"将位示图第"<<hang<<"行第"<<lie<<"列置1成功。"<<endl;
	pag[shang].memorynum=hang*7+lie+1;
}

void change_temmap0(int pag_memorynum)
{
	int hang,lie;
	hang=pag_memorynum/8;
	lie=pag_memorynum%8;
	temmap[hang][lie]=0;
	cout<<"将位示图第"<<hang<<"行第"<<lie<<"列置0成功。"<<endl;
}

void FIFO()
{
	char flag='Y';
	logicalad=0;
	physicalad=0;
	shang=0;
	yu=0;
	hit=0;
	lackpage=0;
	instead=0;  //初始化各参数状态
	visit=0;
    hitRate=0;
	lackpageRate=0;
	Initialize(); //初始化页表,内存,位示图
    PrintResult();
    cout<<"---------FIFO页面置换算法---------"<<endl;
	while((flag!='N')&&(flag!='n'))
	{
	printf("请输入逻辑地址:");
	    scanf("%x",&logicalad);
	shang=logicalad/(pmlength*1024);
	yu=logicalad%(pmlength*1024);
	if(shang<pagelength)
	{
		if(pag[shang].state==0) //如果状态位为0
		{
           if(judge_memory()!=-1) //一直缺页状态,判断内存存在空,否则满
		   {
			   pag[shang].state=1;
			   memory[judge_memory()]=pag[shang].pagenum;
			   change_temmap();
			   physicalad=pag[shang].memorynum*pmlength+yu;
		   }
		else  //置换状态
		{
			pag[memory[0]].state=0;
			change_temmap0(pag[memory[0]].memorynum);//将页表块号中对应的位示图置0
			pag[memory[0]].memorynum=-1;
			for(int i=0;i<memorylength;i++)
				if(i==memorylength-1)
                   memory[i]=pag[shang].pagenum; 
				else
				   memory[i]=memory[i+1];
			pag[shang].state=1;
			change_temmap();
			instead++;
			physicalad=pag[shang].memorynum*pmlength+yu;
		}
        lackpage++;
		visit++;
		hitRate=(float)hit/visit*100;
		lackpageRate=(float)lackpage/visit*100;
		}
	    else //状态位为1即命中一次
		{
		    hit++;
		    visit++;
		    hitRate=(float)hit/visit*100;
		    lackpageRate=(float)lackpage/visit*100;
		}
	}
	else
		cout<<"提示:输入的逻辑地址溢出。"<<endl;
	PrintResult();
	VisitMessage();
	cout<<"是否继续FIFO?(Y/N)";
	cin>>flag;
	}
}

void LRU()
{
	char flag='Y';
	logicalad=0;
	physicalad=0;
	shang=0;
	yu=0;
	hit=0;
	lackpage=0;
	instead=0;  //初始化各参数状态
	visit=0;
    hitRate=0;
	lackpageRate=0;
	Initialize(); //初始化页表,内存,位示图
    PrintResult();
    cout<<"---------LRU页面置换算法---------"<<endl;
	while((flag!='N')&&(flag!='n'))
	{
	printf("请输入逻辑地址:");
	    scanf("%x",&logicalad);
	shang=logicalad/(pmlength*1024);
	yu=logicalad%(pmlength*1024);
	if(shang<pagelength)
	{
		if(pag[shang].state==0) //如果状态位为0
		{
           if(judge_memory()!=-1) //一直缺页状态,判断内存存在空,否则满
		   {
			   pag[shang].state=1;
			   memory[judge_memory()]=pag[shang].pagenum;
			   change_temmap();
			   physicalad=pag[shang].memorynum*pmlength+yu;
		   }
		else  //置换状态
		{
			pag[memory[0]].state=0;
			change_temmap0(pag[memory[0]].memorynum);//将页表块号中对应的位示图置0
			pag[memory[0]].memorynum=-1;
			for(int i=0;i<memorylength;i++)
				if(i==memorylength-1)
                   memory[i]=pag[shang].pagenum; 
				else
				   memory[i]=memory[i+1];
			pag[shang].state=1;
			change_temmap();
			instead++;
			physicalad=pag[shang].memorynum*pmlength+yu;
		}
        lackpage++;
		visit++;
		hitRate=(float)hit/visit*100;
		lackpageRate=(float)lackpage/visit*100;
		}
	    else //状态位为1即命中一次
		{
			int memorytemp;
			memorytemp=memory[0];
			for(int i=0;i<memorylength;i++)  //将命中页置顶
				if(i==memorylength-1)
                   memory[i]=memorytemp; 
				else
				   memory[i]=memory[i+1];
		    hit++;
		    visit++;
		    hitRate=(float)hit/visit*100;
		    lackpageRate=(float)lackpage/visit*100;
		}
	}
	else
		cout<<"提示:输入的逻辑地址溢出。"<<endl;
	PrintResult();
	VisitMessage();
	cout<<"是否继续LRU?(Y/N)"; 
	cin>>flag;
	}
}

int MaxOPTmi(int OPTmi[MAXmemorysize])  //返回数组最大值的下标
{
    int MaxOPTmi=OPTmi[0],maxj=0;
	for(int i=0;i<memorylength;i++)
		if(MaxOPTmi<OPTmi[i])
		{
			MaxOPTmi=OPTmi[i];
			maxj=i;
		}

	return maxj;
}

void OPT()
{
    cout<<"---------OPT页面置换算法---------"<<endl;
    cout<<" 实际应用中无法实现,仅供参数比较 "<<endl;
    cout<<"---------------------------------"<<endl;
	char flag='Y',OPTflag='Y';
	int find=0; //如果OPTmi[]在后面的OPTnum[OPTi].OPT_shang中则置1
	int OPTi=0,MaxOPTi,OPTmi[MAXmemorysize],MaxOPTmor; //MaxOPTmor 存储要替换的memory[]的数组下标
	logicalad=0;
	physicalad=0;
	shang=0;
	yu=0;
	hit=0;
	lackpage=0;
	instead=0;  //初始化各参数状态
	visit=0;
    hitRate=0;
	lackpageRate=0;
	Initialize(); //初始化页表,内存,位示图
    PrintResult();
	while((OPTflag!='N')&&(OPTflag!='n'))
	{
	    printf("请输入逻辑地址:");
	       scanf("%x",&OPTnum[OPTi].OPT_logicalad);
		OPTnum[OPTi].OPT_shang=OPTnum[OPTi].OPT_logicalad/(pmlength*1024);
		MaxOPTi=OPTi;
		if(OPTi<MAXOPTnum)
		{ 
			cout<<"还可以输入"<<MAXOPTnum-OPTi-1<<"个逻辑地址。"<<endl;
			cout<<"是否继续输入?(Y/N)";
	        cin>>OPTflag;
		}
		else
			OPTflag='N';
		OPTi++;
	}
	OPTi=0;
	while((flag!='N')&&(flag!='n'))
	{
	logicalad=OPTnum[OPTi].OPT_logicalad;
	shang=OPTnum[OPTi].OPT_shang;
	yu=logicalad%(pmlength*1024);
	if(shang<pagelength)
	{
		if(pag[shang].state==0) //如果状态位为0
		{
           if(judge_memory()!=-1) //一直缺页状态,判断内存存在空,否则满
		   {
			   pag[shang].state=1;
			   memory[judge_memory()]=pag[shang].pagenum;
			   change_temmap();
			   physicalad=pag[shang].memorynum*pmlength+yu;
		   }
		else  //置换状态
		{			
            for(int i=0;i<memorylength;i++)
			{
				for(int j=OPTi+1;j<MaxOPTi;j++)
					if(memory[i]==OPTnum[j].OPT_shang)
					{
						find=1;
						OPTmi[i]=j;
						break;
					}
					else if((j==MaxOPTi-1)&&(memory[i]!=OPTnum[j].OPT_shang))
					{ 
                        find=0;
                        MaxOPTmor=i;
						break;
					}
					else  find=0;
			}
			if(find==1)
               MaxOPTmor=MaxOPTmi(OPTmi);  //求出将来最久要访问的memory[i];即最大OPTmi
			pag[memory[MaxOPTmor]].state=0;
			change_temmap0(pag[memory[MaxOPTmor]].memorynum);//将页表块号中对应的位示图置0
			pag[memory[MaxOPTmor]].memorynum=-1;
			memory[MaxOPTmor]=pag[shang].pagenum;  //内存置换
			pag[shang].state=1;
			change_temmap();
			instead++;
			physicalad=pag[shang].memorynum*pmlength+yu;
		}
        lackpage++;
		visit++;
		hitRate=(float)hit/visit*100;
		lackpageRate=(float)lackpage/visit*100;
		}
	    else //状态位为1即命中一次
		{
		    hit++;
		    visit++;
		    hitRate=(float)hit/visit*100;
		    lackpageRate=(float)lackpage/visit*100;
		}
	}
	else
		cout<<"提示:输入的逻辑地址溢出。"<<endl;
	PrintResult();
	VisitMessage();
	if(OPTi<MaxOPTi)
	{
		cout<<"剩余"<<MaxOPTi-OPTi<<"个逻辑地址。"<<endl;
	    cout<<"是否继续OPT?(Y/N)";
	    cin>>flag;
	}
	else
		flag='N';
	OPTi++;
	}
}

void main()
{
	int sel;
	char ch='Y';
	cout<<"--------------存储管理模拟系统--------------"<<endl;
	cout<<"模拟存储管理,输出页表,内存和位示图"<<endl;
	cout<<"              作者:billdong  时间:2006.10"<<endl;
	cout<<"--------------------------------------------"<<endl;
	for(;;)
	{
	    cout<<"请输入页表长度: ";
	    cin>>pagelength; cout<<endl;
		if(pagelength>MAXpagesize)
			cout<<"提示:页表长度大了,请重新输入!"<<endl;
		else break;
	}
	for(;;)
	{
	    cout<<"请输入内存长度: ";
	    cin>>memorylength; cout<<endl;
		if(memorylength>MAXmemorysize)
			cout<<"提示:内存长度大了,请重新输入!"<<endl;
		else break;
	}
	for(;;)
	{

	    cout<<"请输入页块长度(KB): ";
	    cin>>pmlength; cout<<endl;
		if(pmlength>MAXpmsize)
			cout<<"提示:页块长度大了,请重新输入!"<<endl;
		else break;
	}
	while((ch!='N')&&(ch!='n'))
	{
	cout<<"--------------请选择页面置换算法--------------"<<endl;
	cout<<"1.FIFO            2.LRU           3.OPT       "<<endl;
	cout<<"----------------------------------------------"<<endl;
	cin>>sel; cout<<endl;
    switch(sel)
	{
	case 1: FIFO();
		    break;
	case 2: LRU();
		    break;
	case 3: OPT();
		    break;
	default:cout<<"提示:输入错误!"<<endl;
			break;
	}
	cout<<"是否切换置换算法以继续(Y/N)";
	cin>>ch;
	}
}

⌨️ 快捷键说明

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