操作系统hw-4

操作系统作业四:页面置换仿真实验

实验内容:

1.设计进行页面置换管理的数据结构;
2.实现FIFO,LRU页面置换算法,支持固定分配局部置换策略的实现;
3.程序可以指定进程所分配的页框数量,可以仿真随机产生页面访问序列(rand),页面访问序列的最大页面编号可指定,伪随机数种子可设定(srand()),页面序列长度可设定;
4.A:采用伪随机数发生器产生不小于1000次页面访问的序列,统计缺页率;B: 特别指定如下设定:3个页框,最大逻辑页号为7,20个页面访问序列7 0 1 2 0 3 0 4 2 3 0 3 2 5 4 3 6 5 3 2的仿真,打印输出内存置换情况,包括当前页框中页面情况,每个页面访问是否在内存中,页面置换情况等。

#include<bits/stdc++.h>
#include<ctime>
using namespace std;
const int maxx=1e5;
int page_box;//页框数量 
int Max_logical_page;//最大逻辑页号 
int random_length;//随机序列长度 
int X[maxx];//随机序列 
int block[3][50];
bool sub[maxx];
bool lack[maxx];
int page_lack;
int ans;
int cnt;
int temp;
struct LRU
{
	int value;
	int time;
};
void init()
{
	memset(sub,0,sizeof(sub));
	memset(lack,0,sizeof(lack));
	for(int i=0;i<3;i++)
		for(int j=0;j<50;j++)
		{
			block[i][j]=0;
		}
}
void fifo(int R[])
{
	init();
	page_lack=0;
	cnt=0;
	temp=0;
	deque<int>page_set;
    deque<int>::iterator pos;
    deque<int>::iterator pre;
    for(int i=0;i<random_length;i++)
	{
		int flag=0; 
		for(pos=page_set.begin();pos!=page_set.end();pos++)
			{
				if((*pos)==R[i])
				{
					flag=1;
					//找到说明无需置换 
					if(ans==2)
					{
						lack[cnt]=0;
						sub[cnt]=0;
				    	for(int i=0;i<3;i++)block[i][cnt]=block[i][cnt-1];
						cnt++;
					}
					break;
				}
			}
		if(!flag)
			{
				if(page_set.size()>=page_box)
				{
					page_set.pop_front();//页框无空余则删除头部元素 
					if(ans==2)sub[cnt]=1;	 
				} 
				
				page_set.push_back(R[i]);
				page_lack++;
			
			   if(ans==2)
			   {
				   
					lack[cnt]=1;
					temp++;//当前占用的物理块
					temp%=3; 
					if(page_set.size()==1)
					{
						block[0][cnt]=R[i];
						temp=2;
					}
					else
					{
						for(pre=page_set.begin();pre!=page_set.end();pre++)
						{
							block[temp++][cnt]=(*pre);
							temp%=3;
						}
					}
					cnt++;
				}
			}
	}
	printf("fifo缺页中断次数为:%d\n",page_lack);
	printf("fifo缺页中断率为:%lf\n",(double)page_lack*1.0/random_length);
 	
}
void lru(int R[])
{
	init();
	page_lack=0;
	temp=0;
	deque<LRU> page_set;
	deque<LRU>::iterator pos;
	deque <LRU>::iterator pre;
	for(int i=0;i<random_length;i++)
	{
		int flag=0;
		for(pos=page_set.begin();pos!=page_set.end();pos++)//当前访问在页框中 
		{
			if((*pos).value==R[i])
			{
				flag=1;
				if(ans==2)
				{
					lack[cnt]=0;
					sub[cnt]=0;
					for(int i=0;i<3;i++)block[i][cnt]=block[i][cnt-1];
					cnt++;
				} 
				break; 
			} 
		}
		if(!flag)
		{
			bool flew=0;
			if(page_set.size()>=page_box)//无空余页框且不在页框 
			{
				int m=page_set.front().time;
				deque <LRU>::iterator mp=page_set.begin();
				for(pre=page_set.begin();pre!=page_set.end();pre++) 
				{
					if((*pre).time>m)
					{
						mp=pre;
						m=(*mp).time;
					}
				}	
				int vv=(*mp).value;
				page_set.erase(mp);//找到时间相距离最远的 
				if(ans==2)
				{
					sub[cnt]=1;
					for(int j=0;j<page_box;j++)
			    	{
						if(block[j][cnt-1]==vv)block[j][cnt]=R[i];//找到时间最远所在页框 
						else block[j][cnt]=block[j][cnt-1];
			   		}
				}
				flew=1;
			} 
			LRU new_lru;
			new_lru.value=R[i];
			new_lru.time=0;
			page_set.push_back(new_lru);
			page_lack++;
			lack[cnt]=1;
			if(flew==0)//有空余页框 
			{	
			temp=0;
			for(pre=page_set.begin();pre!=page_set.end();pre++)
						{
							block[temp++][cnt]=(*pre).value;
							temp%=3;
						}
			}
			cnt++;
			
		}
		//更新距离当前的时间
		for(pre=page_set.begin();pre!=page_set.end();pre++)	
		{
			for(int j=i;j>=0;j--)
			{
				if(R[j]==(*pre).value)
				{
					(*pre).time=i-j;
					break;
				}
			}
		}	
	}
	printf("lru缺页中断次数为:%d\n",page_lack);
	printf("lru缺页中断率为:%lf\n",(double)page_lack*1.0/random_length);
}

				
void Random()
{
	srand(int(time(0)));
	cout<<"系统随机生成的序列为"<<endl; 
	for(int i=0;i<random_length;i++)
	{
		X[i]=rand()%(Max_logical_page+1);
		cout<<X[i]<<" ";
	}
	cout<<endl;
	fifo(X);
	lru(X);

}

void show(int R[])
{
	cout<<"页面访问序列 "; 
	for(int i=0;i<20;i++)cout<<"  "<<R[i]<<" ";
	cout<<endl;
	cout<<"页面置换过程 "<<endl; 
	cout<<"物理块1      ";
	for(int i=0;i<20;i++)cout<<"| "<<block[0][i]<<" ";
	cout<<endl;
	cout<<"物理块2      ";
	for(int i=0;i<20;i++)cout<<"| "<<block[1][i]<<" ";
	cout<<endl;
	cout<<"物理块3      "; 
	for(int i=0;i<20;i++)cout<<"| "<<block[2][i]<<" ";
	cout<<endl;
	cout<<"--------------------------------------------------------------------------------------------"<<endl;
	cout<<"页面置换标志 "; 
	for(int i=0;i<20;i++)cout<<"| "<<sub[i]<<" ";
	cout<<endl;
	cout<<"页面中断标志 ";
	for(int i=0;i<20;i++)cout<<"| "<<lack[i]<<" ";
	cout<<endl;
}

int main()
{
	cout<<"请选择功能(1/2)"<<endl;
	cout<<"功能1:指定页框,最大逻辑页,随机生成指定长度(大于1000)的访问序列,并计算其FIFO LRU缺页率"<<endl;
	cout<<"功能2:进行3个页框,最大逻辑页号为7,20个页面访问序列7 0 1 2 0 3 0 4 2 3 0 3 2 5 4 3 6 5 3 2的仿真,打印输出内存置换情况" <<endl;
	cin>>ans;
	if(ans==1) 
	{
		cout<<"请输入页框数量、最大逻辑页号"<<endl;
		cin>>page_box>>Max_logical_page; 
		cout<<"请输入一个不小于1000的数,以采用伪随机数发生器产生相应次页面访问的序列,统计缺页率"<<endl;
		cin>>random_length;
		Random();
	}
	else
	{
		page_box=3;
		Max_logical_page=7;
		random_length=20;
	 	int S[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,5,4,3,6,5,3,2};
	 	cout<<"LRU页面置换过程如下: "<<endl; 
	 	lru(S);
		show(S);
		cout<<"FIFO页面置换过程如下:"<<endl;
	 	fifo(S);
		show(S);
	}
	
}







 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chococolate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值