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

📄 分页式存储管理.cpp

📁 分页式存储管理 用位示图表示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				Visited++;
				As++;
			}
			if(q[num-1].PageAddress!=-1)
			{
				p[q[0].PageAddress].PhyAddress=NULL;
				p[q[0].PageAddress].Sign=0;
				for(int i=0;i<num-1;i++)
					q[i].PageAddress=q[i+1].PageAddress;
				q[num-1].PageAddress=h;
			}
			else
			{
				for(int i=0;i<num;i++)
				{
					if(q[i].PageAddress==-1)
					{
						q[i].PageAddress=h;
						break;
					}
				}
			}
		}
		else if(p[h].Sign==1)
		{
			Visited++;
			if(q[num-1].PageAddress!=-1)
				for(int k=0;k<num;k++)
				{
					if(q[k].PageAddress==h)
					{
						for(int s=k;s<num-1;s++)
							q[s].PageAddress=q[s+1].PageAddress;
						q[num-1].PageAddress=h;
					}
				}
			else 
				{
					for(int k=0;k<num-1;k++)
					{
						if(q[k].PageAddress==h)
							for(int s=k;s<num-1;s++)
								q[s].PageAddress=q[s+1].PageAddress;
					}
					for(int r=0;r<num-1;r++)
					{
						if(q[r].PageAddress==-1)
						{
							q[r].PageAddress=h;
    						break;
						}
					}
				}
		}

//************************************************************************************
//************************************************************************************输出信息
	cout<<"\n\n\t\t----------系统使用情况----------"<<endl;
	cout<<"\n输入地址:"<<w<<"\t\t页号:"<<h<<"\n偏移地址:"<<offset<<"\t\t物理地址:"<<offset+size*1024*p[h].PhyAddress<<"\n页面大小:"<<size<<"k";
	cout<<"\t\t访问数目:"<<Visited<<"\n缺页数目:"<<As;
	cout<<"\t\t缺页率:"<<(int)(As*100)/Visited<<"%"<<endl;

	cout<<"\n页表信息:"<<endl;                      //输出页表信息
	cout<<"\t------------"<<"-------"<<endl;
	cout<<"\t|          |"<<"      |"<<endl;
	if(p[0].PhyAddress!=NULL)
		cout<<"0"<<"\t|    "<<p[0].PhyAddress<<"\t   |"<<"  "<<p[0].Sign<<"\t  |"<<endl;
	else
		cout<<"0"<<"\t|    "<<"\t   |"<<"  "<<p[0].Sign<<"\t  |"<<endl;
	cout<<"\t|          |"<<"      |"<<endl;
	cout<<"\t------------"<<"-------"<<endl;
	for(int i=1;i<length;i++)
	{
		cout<<"\t|          |"<<"      |"<<endl;
		if(p[i].PhyAddress!=NULL)
			cout<<i<<"\t|    "<<p[i].PhyAddress<<"\t   |"<<"  "<<p[i].Sign<<"\t  |"<<endl;
		else
			cout<<i<<"\t|    "<<"\t   |"<<"  "<<p[i].Sign<<"\t  |"<<endl;
		cout<<"\t|          |"<<"      |"<<endl;
		cout<<"\t------------"<<"-------"<<endl;
	}

	cout<<"\n内存信息:"<<endl;                        //输出内存信息
	for(int j=num-1;j>0;j--)
	{
		cout<<"\t------------"<<endl;
		cout<<"\t|          |"<<endl;
		if(q[j].PageAddress!=-1)
			cout<<j<<"\t|    "<<q[j].PageAddress<<"\t   |"<<endl;
		else
			cout<<j<<"\t|    "<<"\t   |"<<endl;
		cout<<"\t|          |"<<endl;
	}
	    cout<<"\t------------"<<endl;
		cout<<"\t|          |"<<endl;
		if(q[0].PageAddress!=-1)
			cout<<j<<"\t|    "<<q[0].PageAddress<<"\t   |"<<endl;
		else
			cout<<j<<"\t|    "<<"\t   |"<<endl;
		cout<<"\t|          |"<<endl;
		cout<<"\t------------"<<endl;
//		cout<<"\n\n\t\t----------系统使用情况----------"<<endl;
		cout<<"\n\t\t----------输出完毕!-------------\n"<<endl;

//************************************************************************************输出信息
//************************************************************************************

	}

	do{
		cout<<"\n\n(想退出请输入'#',继续请输入'!',完全退出请输入'@',清屏请输入'c'):";
		cin>>ch;
		if(ch=='#')
		{
			cout<<"\n\n\t\t----------以下是OPT算法----------"<<endl;
	    	OPT();
     		cout<<"\n\t\t----------OPT输出完毕!----------"<<endl;
    		Found();
		}
		else if(ch=='@')
		{
			cout<<"\n\n\t\t----------以下是OPT算法----------"<<endl;
     		OPT();
    		cout<<"\n\t\t----------OPT输出完毕!----------"<<endl;
	        exit(0);
		}
		    else if(ch=='c'||ch=='C')
				Cls();
			     else
					 break;
	}while(ch);
}
}


void Found()
{
	int bitmap[8][8]={{1,1,1,1,1,1,1,1},         //位示图
	{0,1,0,1,0,1,0,1},
	{0,0,0,1,1,0,1,0},
	{1,1,0,0,1,0,1,0},
	{0,1,0,1,1,1,0,1},
	{0,0,0,1,1,1,0,0},
	{1,1,1,1,1,0,0,0},
	{0,0,0,1,1,1,0,0}};
	char ch;
 //   OPT();
	Help();
	cout<<"\n请输入页表长度:";
    cin>>length;
	cout<<"请输入内存块数:";
	cin>>num;

	//****************************************************************动态申请数组,结构体
	p=new PageTable[length];        //申请页表空间长度
	p2=new PageTable[length];        //申请页表空间长度
	q=new Memory[num];            //申请内存长度
	q2=new Memory[num];            //申请内存长度
	buffer=new int[length];
	max=new int[num];
	//****************************************************************

	for(int i=0;i<length;i++)
	{
		p[i].Sign=0;               //将页表的标志位全部置0
		p[i].PhyAddress=NULL;
		p2[i].Sign=0;               //将页表的标志位全部置0
		p2[i].PhyAddress=NULL;
		buffer[i]=-1;
	}
	for(int j=0;j<num;j++)
	{
		q[j].PageAddress=-1;          //初始化内存中的值
		q2[j].PageAddress=-1;          //初始化内存中的值
		max[j]=0;
	}
	cout<<"请输入内存空间大小(该内存空间单位为K)";
	cin>>size;
	cout<<"请选择您所使用的算法(F为FIFO算法,L为LRU算法):";
	cin>>ch;
	while(ch)
	{
	if(ch=='f'||ch=='F')
		FIFO(length,num,size,bitmap);
		else if(ch=='l'||ch=='L')
			LRU(length,num,size,bitmap);
		     else
			 {
			 cout<<"\n输入错误,请重新输入!"<<endl;
            	cout<<"请选择您所使用的算法(F为FIFO算法,L为LRU算法):";
                 	cin>>ch;
			 }
	}
}



void Cls()
{
	system("cls");
}


void OPT()
{
	int lack3=0;
    int m3=0;
	int f3=0;
	bool fig3=true;
	cout<<"页表序列:"<<endl;
	for(int i=0;i<Visited;i++)
	{
/*		if(buffer[i]==-1)
			break;
			*/
		cout<<buffer[i]<<"\t";           //显示页号序列
	}
	cout<<endl;
	cout<<"栈的变化情况:"<<endl;
//	cout<<endl;
	cout<<"(栈底--->栈顶)"<<endl;                                        
	for(int j=0;j<Visited;j++)         //对每个页面 buffer[j] 作同样处理          
	{
	
         int sign=0;                           
		 int k=0;
		 int c;
		 int value=0;
		 
		int n=0;
		int flag=0;
		while(n<num)              // 查找,是否命中         
		{
				if(buffer[j]==q2[n].PageAddress)
				{
					flag=1;
				    break;
				}
				n++;
		}
		if(flag==0)            //没有命中
		{
			lack3++;

			 while(k<num)           // 先看内存堆栈是否满
			 {
				 if(q2[k].PageAddress==-1)
				 {
					 sign=1;
					 break;
				 }
				 k++;
			 }
			 if(sign==1)              //栈未满(只执行前几次)
			 {
				 q2[m3].PageAddress=buffer[j];
					 m3++;

//------------------------------------------------------------------------------
				 p2[buffer[j]].PhyAddress= p[f3].PhyAddress;
//------------------------------------------------------------------------------
				 p2[buffer[j]].Sign=1;
				 f3++;
				
			 }
			 else                   //栈满
			 {		
					cout<<"要换入的页号: "<<buffer[j]<<endl;
					int tag=0;              
					
					for(int s=0;s<num;s++)             //查找要置换的那一页 memory3[s]
					{
						for(int t=j;t<Visited;t++)          //从此页号开始查找
						{
							if(buffer[t]==q2[s].PageAddress)   
							{
								max[s]=t;	           //记录此页号要出现的位置
							    break;
							}
								
							if(t==Visited-1)   //此页 memory3[s] 再也不会出现					
							{	
								max[s]=Visited;
							
							}
						}
									   
					}								
								 
					
						int a=max[0];       //比较现在在内存中的页号的查找结果
						for(int v=0;v<num;v++)
						{
							          
							if(a<max[v])
							{
								value=1;      //标记是否进入此条件语句
							 	a=max[v];
								c=v;         //要换出的堆栈的号(最大值)
                               
							}	
						
						                   
						}
						if(value==1)   
							s=c;
						else 
							s=0;
					cout<<"要换出的页号: "<<q2[s].PageAddress<<endl;
					p2[buffer[j]].PhyAddress=p2[q2[s].PageAddress].PhyAddress;
					p2[buffer[j]].Sign=1;
					p2[q2[s].PageAddress].PhyAddress=NULL;
					p2[q2[s].PageAddress].Sign=0;
					q2[s].PageAddress=buffer[j];					
				
				}
					
		} 
		  if(fig3==true)
		  {
			for(int b=0;b<num;b++)
			{
				if(b==0)
					cout<<"\t--------";
				else
					cout<<"--------";
			}
			cout<<endl;
		  }
			 for(int d=0;d<num;d++)
			/*
				 cout<<"-----"<<endl;
				 cout<<"|  "<<q2[l].PageAddress<<"   ";*/
				 cout<<"\t|     ";
			     cout<<"\t|"<<endl;
		    for(int l=0;l<num;l++)
			{
				if(q2[l].PageAddress==-1)
			     cout<<"\t|  ";
				else
				 cout<<"\t|  "<<q2[l].PageAddress;
			}
			     cout<<"\t|"<<endl;
			for(int g=0;g<num;g++)
				 cout<<"\t|     ";
			     cout<<"\t|"<<endl;
			for(int b=0;b<num;b++)
			{
				if(b==0)
					cout<<"\t--------";
				else
					cout<<"--------";
			}
  			 cout<<endl;
			 fig3=false;
		}
			    cout<<"\n缺页数:"<<lack3<<"\t缺页率:"<<(lack3*100)/Visited<<"%"<<endl;			
}

⌨️ 快捷键说明

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