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

📄 fifo.cpp

📁 操作系统实践课程实验
💻 CPP
字号:
#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
#define  M  320

int N;
struct Pro
{
	int num,time;
};
void Input(Pro p[M])
{   
	int count=0;
	srand((unsigned)time(0));
	int i=0,nrand=0,n=0;
	int num[1000];
	int page1[1000];
	int offset[1000];
	nrand=rand()%32767;
	n=(float)319*nrand/32767+1;
	for(i=0;i<320;i+=4)
	{
		num[i]=n;
		num[i+1]=num[i]+1;
		nrand=rand()%32767;
		num[i+2]=(float)num[i]*nrand/32767;
		num[i+3]=num[i+2]+1;
		nrand=rand()%32767;
		n=(float)nrand*(318-num[i+2])/32767+num[i+2]+2;
	}
	for(i=0;i<320;i++)
	{
		page1[i]=num[i]/10;
		offset[i]=num[i]%10;
		page1[i]%=32;
	}
	for(i=0;i<320;i++)
	{
		p[i].num=offset[i];
		p[i].time=0;
	}
}

int  Search(int e,Pro *page1  )
{
	int i=0;
	Pro *page=new Pro[N];
	page=page1;
	for(i=0;i<N;i++)
		if(e==page[i].num)
			return i;
	return -1;
}

int Max(Pro *page1)
{
	Pro *page=new Pro[N];
	page=page1;
	int e=page[0].time,i=0;
	while(i<N)//找出离现在时间最长的页面
	{
		if(e<page[i].time)
			e=page[i].time;
			i++;
	}
    for( i=0;i<N;i++)
		if(e==page[i].time)
			return i;
	
	return -1;
}

int Compfu(Pro *page1,int i,int t,Pro p[M])
{
	Pro *page=new Pro[N];
	page=page1;
	
	int count=0;
	for(int j=i;j<M;j++)
	{
		if(page[t].num==p[j].num )
			break;
		else 
			count++;
	}
	return count;
	
}

int main()
{
    
	cout<<"可用内存页面数"<<endl;
	cin>>N;	
	Pro p[M];
	Pro *page=new Pro[N];
	char c;
	int m=0,t=0;
	float n=0;
	Input(p);
	int i=0;
	do{
		
		for(i=0;i<N;i++)//初试化页面基本情况
		{
			page[i].num=0;
			page[i].time=2-i;
		}
        i=0;		
        cout<<"f:FIFO页面置换"<<endl;
		cout<<"l:LRU页面置换"<<endl;
		cout<<"o:OPT页面置换"<<endl;
		cout<<"按其它键结束"<<endl;
		cin>>c;
		
		if(c=='f')//FIFO页面置换
		{
			n=0;
			while(i<m)
			{
				if(Search(p[i].num,page)>=0)
					i++;//找到相同的页面
				else 
				{  
					if(t==N)
						t=0;
					else 
					{
						n++;//
						page[t].num=p[i].num;
						t++;
					}
				}
			}
			cout<<"缺页次数:"<<n<<"    命中率:"<<1-n/m<<endl;      
			
		}
		if(c=='l')//LRU页面置换
		{    
			n=0;
			while(i<m)
			{    
				int k;
				k=t=Search(p[i].num,page);
				if(t>=0)				
					page[t].time=0;
				else
				{  
					n++; 
					t=Max(page);
					
					page[t].num=p[i].num;
					page[t].time=0;
				}
				if(t==0)
				{
					page[t+1].time++;
					page[t+2].time++;
				}
				if(t==1)
				{
					page[2].time++;
					page[0].time++;
				}
				if(t==2)
				{
					page[1].time++;
					page[0].time++;
				}
				if(k==-1)  				
					i++;
			}
			cout<<"缺页次数:"<<n<<"    命中率:"<<1-n/m<<endl; 
			}
			if(c=='o')//OPT页面置换
			{
				n=0;
				while(i<m)
				{
					if(Search(p[i].num,page)>=0)
						i++;
					else
					{
						int temp=0,cn;
						for(t=0;t<N;t++)
						{
							if(temp<Compfu(page,i,t,p))
							{
								temp=Compfu(page,i,t,p);
								cn=t;
							}
						}
						page[cn]=p[i];
						n++;
						i++;
					}
				}
				cout<<"缺页次数:"<<n<<"    命中率:"<<1-n/m<<endl; 
			}		
		}while(c=='f'||c=='l'||c=='o');	
	return 0;
}

⌨️ 快捷键说明

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