小言_互联网的博客

操作系统实验3 请求调页

286人阅读  评论(0)
//实验3-请求调页 
#include<iomanip>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
double cnt1,cnt2,cnt3;
double r1,r2,r3;
int a[4][2],b[320][2],c[320];
int f;
int opt()
{//opt算法 
	cnt1=0;
	f=0;
	int max[2];
	for(int t=0;t<4;t++)
	{
		a[t][1]=1;	
	} 
	for(int i=0;i<320;i++)
	{
		for(int t=0;t<4;t++)
		{
			if(a[t][1]<=0)
			{
				for(int m=i+1;m<320;m++)
				{
					if(a[t][0]==b[m][1])
					{
						a[t][1]=m-i;
						break;
					}	
				}	
			}	
		} 
		if(f<4)
		{
			int l=0;
			if(f>0)
			{
				for(int j=0;j<f;j++)
				{
					if(a[j][0]==b[i][1])
					{//内存中有该页
						l++;
						a[j][1]=0;
						break;
					}
				}	
			}
			if(l==0)
			{
				a[f][0]=b[i][1];
				for(int j=i+1;j<320;j++)
				{
					if(b[j][1]==b[i][1])
					{
						a[f][1]=j-i;
						break;
					}
				}
				f++;
			}
		}
		else
		{
			int e=0;
			for(int j=0;j<4;j++)
			{
				if(a[j][0]==b[i][1])
				{//内存中有该页
					e++;
					break;
				}
			}
			if(e==0)
			{
				cnt1++;
				cout<<"\nOPT第"<<cnt1<<"次缺页..."<<endl;
				cout<<"当前缺页的页号为:"<<b[i][1]<<endl;
				cout<<"当前内存的情况为:"<<endl;
				for(int j=0;j<4;j++)
				{
					cout<<setw(5)<<a[j][0];
				} 
				cout<<endl;
				for(int j=0;j<4;j++)
				{
					cout<<setw(5)<<a[j][1];
				} 
				cout<<endl;  
				max[1]=-10;
				for(int j=0;j<4;j++)
				{
					if(a[j][1]<0)
					{
						max[1]=a[j][1];
						max[0]=j;
						break;
					}
					else
					{
						if(a[j][1]>=max[1])
						{
							max[1]=a[j][1];
							max[0]=j;
						}
					}
				}
				a[max[0]][0]=b[i][1];
				for(int j=i+1;j<320;j++)
				{
					if(b[j][1]==b[i][1])
					{
						a[max[0]][1]=j-i;
						break;
					}
				}
			}	
		}
		for(int i=0;i<4;i++)
		{
			a[i][1]--;
		}
	}
	return 0;
}
int fifo()
{//先进先出FIFO算法 
	cnt2=0;
	f=0;
	int max[2];
	for(int i=0;i<320;i++)
	{
		if(f<4)
		{
			int l=0;
			if(f>0)
			{
				for(int j=0;j<f;j++)
				{
					if(a[j][0]==b[i][1])
					{//内存中有该页
						l++;
						break;
					}
				}	
			}
			if(l==0)
			{
				a[f][0]=b[i][1];
				a[f][1]=0;
				f++;
			}
		}
		else
		{
			int e=0;
			for(int j=0;j<4;j++)
			{
				if(a[j][0]==b[i][1])
				{//内存中有该页
					e++;
					break;
				}
			}
			if(e==0)
			{
				cnt2++;
				max[1]=0;
				cout<<"\nFIFO第"<<cnt2<<"次缺页..."<<endl;
				cout<<"当前缺页的页号为:"<<b[i][1]<<endl;
				cout<<"当前内存的情况为:"<<endl;
				for(int j=0;j<4;j++)
				{
					cout<<setw(5)<<a[j][0];
				} 
				cout<<endl;
				for(int j=0;j<4;j++)
				{
					cout<<setw(5)<<a[j][1];
				}
				cout<<endl; 
				for(int j=0;j<4;j++)
				{
					if(a[j][1]>=max[1])
					{
						max[1]=a[j][1];
						max[0]=j;
					}
				}
				a[max[0]][0]=b[i][1];
				a[max[0]][1]=0;
			}	
		}
		for(int i=0;i<4;i++)
		{
			a[i][1]++;
		}
	}
	return 0;
}
int lru()
{//最近最久未使用LRU算法 
	cnt3=0;
	f=0;
	int max[2];
	for(int i=0;i<320;i++)
	{
		if(f<4)
		{
			int l=0;
			if(f>0)
			{
				for(int j=0;j<f;j++)
				{
					if(a[j][0]==b[i][1])
					{//内存中有该页
						l++;
						a[j][1]=0;
						break;
					}
				}	
			}
			if(l==0)
			{
				a[f][0]=b[i][1];
				a[f][1]=0;
				f++;
			}
		}
		else
		{
			int e=0;
			for(int j=0;j<4;j++)
			{
				if(a[j][0]==b[i][1])
				{//内存中有该页
					e++;
					a[j][1]=0;
					break;
				}
			}
			if(e==0)
			{
				cnt3++;
				max[1]=0;
				cout<<"\nLRU第"<<cnt3<<"次缺页..."<<endl;
				cout<<"当前缺页的页号为:"<<b[i][1]<<endl;
				cout<<"当前内存的情况为:"<<endl;
				for(int j=0;j<4;j++)
				{
					cout<<setw(5)<<a[j][0];
				} 
				cout<<endl;
				for(int j=0;j<4;j++)
				{
					cout<<setw(5)<<a[j][1];
				} 
				cout<<endl; 
				for(int j=0;j<4;j++)
				{
					if(a[j][1]>=max[1])
					{
						max[1]=a[j][1];
						max[0]=j;
					}
				}
				a[max[0]][0]=b[i][1];
				a[max[0]][1]=0;
			}	
		}
		for(int i=0;i<4;i++)
		{
			a[i][1]++;
		}
	}
	return 0;
}
void suijishu()
{//产生随机数  
	cout<<"输入一个随机数: ";
	for(int i=0;i<320;i++)
	{
		c[i]=0;
	}
	int m,m1;
	int count;
	cin>>m;
	b[0][0]=m;
	b[1][0]=m+1;
	c[m]=1;
	c[m+1]=1;
	srand(time(0));
	for(int i=2;i<320;i=i+4)
	{
		int m1=rand()%m;
		count=0;
		while(c[m1]==1||c[m1+1]==1)
		{
			m1=rand()%m;
			count++;
			if((c[m1]==0||c[m1+1]==0)&&count>=50)
			{
				break;
			}
		}	
		b[i][0]=m1;
		b[i+1][0]=m1+1;
		c[m1]=1;
		c[m1+1]=1;
		int m=rand()%(318-m1)+m1+2;
		count=0;
		while(c[m]==1||c[m+1]==1)
		{
			m=rand()%(318-m1)+m1+2;
			count++;
			if((c[m]==0||c[m+1]==0)&&count>=50)
			{
				break;
			}
		}
		b[i+2][0]=m;
		b[i+3][0]=m+1;
		c[m]=1;
		c[m+1]=1;
	}
	int hh=0;
	for(int i=0;i<320;i++)
	{
		if(c[i]==1)
		hh++;
	}
	cout<<"所覆盖的指令条数: "<<hh<<"\n\n";
}
int main()
{
	suijishu();
	for(int i=0;i<320;i++)
	{
		b[i][1]=b[i][0]/10;
	}
	cout<<"********************************************* OPT"<<endl;
	opt();
	cout<<"********************************************* FIFO"<<endl;
	fifo();
	cout<<"********************************************* LRU"<<endl;
	lru();
	cout<<"\n\npage default rate..."<<endl;
	r1=cnt1/320*100;
	cout<<"OPT :"<<r1<<"%"<<endl;
	r2=cnt2/320*100;
	cout<<"FIFO:"<<r2<<"%"<<endl;
	r3=cnt3/320*100;
	cout<<"LRU :"<<r3<<"%"<<endl;
	return 0;
}

转载:https://blog.csdn.net/enazh/article/details/100989004
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场