南邮页面替换算法

题目;
一个页面存储系统使用``FIFO,OPT和LRU页面替换算法,如果一个页面的走向为:2,3,2,1,5,2,4,5,3,2,5,2。当分配给该作业的物理页框块数为3时,试计算访问过程中发生的缺页中断次数和终端率。
代码

#include<stdio.h>
int ncc[3]={0,0,0}; 
int ncc0[3]={0,0,0};                     //内存空间
int ncc1[3]={0,0,0}; 					//opt算法的内存页面在将来使用的次数
int ncc2[3]={0,0,0}; 

int nczx0[12]={2,3,2,1,5,2,4,5,3,2,5,2};  //页面走向 
int nczx1[12]={2,3,2,1,5,2,4,5,3,2,5,2};   
int nczx2[12]={2,3,2,1,5,2,4,5,3,2,5,2};   
                    
int bs0[3][12];
int bs1[3][12];
int bs2[3][12];  //表示出计算过程的数组
int zdcs0=0;
int zdcs1=0;
int zdcs2=0; //每个算法的中断次数
int zdl0=0,zdl1=0,zdl2=0;             //中断率 
void optsf(int x)    //最佳置换方法算法,计算ncc数组中谁该被替换出来
{
	int i,k; 
	int c=0;
	int ncc1[3]={0,0,0};                   //opt算法的内存页面在将来使用的次数
	for( i=x+1; i<12 ; i++)    //将当前内存中的页面与nczx中的i页面以后的页面作比较,计算第i次ncc中页面在未来出现的次数
	{
		if(nczx0[i]==ncc[0] && ncc1[0]<2) 
		{
			ncc1[0]++;
			c++;	
		}
		if(nczx0[i]==ncc[1] && ncc1[1]<2) 
		{	
			ncc1[1]++;
			c++;
		}
		if(nczx0[i]==ncc[2] && ncc1[2]<2) 
		{
			ncc1[2]++;
			c++;	
		}
		if(c==2) break;
	}
	for(k=0;k<3;k++)    //将未来出现最少次数的元素置零
		if(ncc1[k]==0) 
		{
			ncc[k]=0;
			break;
		}
}
void opt()   //最佳置换
{
	int i;
	for(i=0; i<12; i++)
	{
		if( ncc[0]!=nczx0[i] && ncc[1]!=nczx0[i] && ncc[2]!=nczx0[i] )  //判断该改页面是否在内存中
		{
			zdcs0++;      //当前页面不在内存,中断次数加1
			if( ncc[0]==0 ) ncc[0]=nczx0[i];         //当内存中有空闲区域
			else if( ncc[1]==0 ) ncc[1]=nczx0[i];
			else if( ncc[2]==0 )ncc[2]=nczx0[i];
			else                                          //当内存中没有空闲区域就需要将未来最久不使用页面替换出来
			{
				optsf(i);                      //调用optsf函数计算下个未来最久不使用	
				if( ncc[0]==0 ) 
					ncc[0]=nczx0[i];         //将未来最久不使用页面从内存中找出后用当前页面替换
			    if( ncc[1]==0 ) 	
					ncc[1]=nczx0[i];
				if( ncc[2]==0 ) 
					ncc[2]=nczx0[i];
			}
		}
		bs0[0][i]=ncc[0];
		bs0[1][i]=ncc[1];
		bs0[2][i]=ncc[2];
	}
	zdl0=zdcs0*100/12;     //计算页面中断率
	int o,u;
	for(o=0;o<3;o++)
	{
		for(u=0;u<12;u++)
			printf("%d ",bs0[o][u]);        //将页面置换过程表示出来
		printf("\n");
	}
}
void fifo()    //先进先出置换算法
{
	int a=0;   //最早页面指针 
	int zzjc=nczx1[0];
	int i,o,u,j;
	for(i=0;i<12;i++)
	{
		if( ncc1[0]!=nczx1[i] && ncc1[1]!=nczx1[i] && ncc1[2]!=nczx1[i] )   //判断将要访问的页面是否内存中
		{
			zdcs1++;     //该页面不在内存中发生一次页面中断
			if(ncc1[0]==0) ncc1[0]=nczx1[i];   //如果内存中存在空内存,则直接插入
			else if(ncc1[1]==0) ncc1[1]=nczx1[i];
			else if(ncc1[2]==0) ncc1[2]=nczx1[i];
			else               //如果内存中无空内存,则用要存入的页面替换最早页面
			{
			
				if( ncc1[0]==zzjc ) ncc1[0]=nczx1[i];
				if( ncc1[1]==zzjc ) ncc1[1]=nczx1[i];
				if( ncc1[2]==zzjc ) ncc1[2]=nczx1[i];       //替换完成 
				a++;
				if(nczx1[a]==nczx1[i])            //
			    {
					for(j=a; j<i; j++)
					{
						if(nczx1[j]==nczx1[i])
							a++;
					}
				}
				if( nczx1[a]==ncc1[0] || nczx1[a]==ncc1[1] || nczx1[a]==ncc1[2]) 
					zzjc=nczx1[a];
				else
				{
					while(nczx1[a]!=ncc1[0] ||nczx1[a]!=ncc1[1] ||nczx1[a]!=ncc1[2])
					{
						zzjc=nczx1[a++];
					}
				}		 
			}
		}
		bs1[0][i]=ncc1[0];     //将置换过程记录下来
		bs1[1][i]=ncc1[1];
		bs1[2][i]=ncc1[2];
	}
	zdl1=zdcs1*100/12;
	for(o=0;o<3;o++)
	{
		for(u=0;u<12;u++)
		printf("%d ",bs1[o][u]);        //将页面置换过程表示出来
		printf("\n");
	}	
}
void lru()    //过去最久未使用算法,过去最久未被使用的页面就是距离被此页面调度最远的nczx数组元素
{
	int i,o,u;
	int  a=0;    //最久未使用页面指针
	for(i=0; i<12; i++)
	{
		int zjwsyjc=nczx2[a];     //最久未使用的页面是nczx[a],默认nczx[0]
		if( ncc2[0]!=nczx2[i] && ncc2[1]!=nczx2[i] && ncc2[2]!=nczx2[i] )  //将下一个元素放在在optsf中被置零的位置
		{

			zdcs2++;   //该页面不在内存中发生一次页面中断
			if(ncc2[0]==0) ncc2[0]=nczx2[i];         //内存中有空闲区
			else if(ncc2[1]==0) ncc2[1]=nczx2[i];
			else if (ncc2[2]==0) ncc2[2]=nczx2[i];
			else                   //内存中不存在空闲区,用现在的页面替换过去最久未使用的页面
			{
				
				if(ncc2[0]==zjwsyjc) ncc2[0]=nczx2[i];
				if(ncc2[1]==zjwsyjc) ncc2[1]=nczx2[i];
				if(ncc2[2]==zjwsyjc) ncc2[2]=nczx2[i];
				a++;                //已用nczx[i]页面替换最久未使用页面后不再是最久未使用页面,需计算下个最久未使用页面
			}
		}	
		else    //nczx[i]页面已经在内存中,已经被使用一次,不再是最久未使用的页面,计算新的最久未使用页面
		{
			a++;      
		}
		bs2[0][i]=ncc2[0];
		bs2[1][i]=ncc2[1];
		bs2[2][i]=ncc2[2];
		zdl2=100*zdcs2/12;
	}
	for(o=0;o<3;o++)
	{
		for(u=0;u<12;u++)
		printf("%d ",bs2[o][u]);        //将页面置换过程表示出来
		printf("\n");
	}	
}
void print()
{
	int i;
	printf("页面走向为:");
	for(i=0;i<12;i++)
	{
		printf("%d ",nczx0[i]);
	}
	printf("\n");
}
prin()
{
	printf("中断次数为 ");	
} 
void main()
{
	print();
	opt();
	prin();
	printf("%d",zdcs0);
	printf("次  "); 
	printf("最佳置换算法的中断率:");
	printf("%d%c",zdl0,'%');
	printf("\n");

	print();
	fifo();
	prin();
	printf("%d",zdcs1);
	printf("次  ");
	printf("先进先出置换算法的中断率:");
	printf("%d%c",zdl1,'%');
	printf("\n");

	print();
	lru();
	prin();
	printf("%d",zdcs2);
	printf("次  ");
	printf("最久未使用置换算法的中断率:");
	printf("%d%c",zdl2,'%');
}

运行结果如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值