C语言数组方法实现OPT和FIFO页面置换算法

上学期操作系统实训中的内容,当时百度的代码基本都用了链表,自己数据结构学的又不太好,感觉直接用百度的代码太过高级,自己就用C语言纯数组实现了这些算法,代码简单,符合自己的水平。

先进先出置换算法(FIFO)
#include<stdio.h>
void doit(int a[],int b[]){	//实现先进先出置换算法的方法
 	int i,j,k,z,temp;
	for(i=0;i<15;i++){	//遍历15个页面
		for(j=0;j<3;j++){	//遍历3个物理块
			if(a[i]==b[j]){	//判断物理块中是否存在该页面
				break;
			}
		}
		if(j==3){	//如果物理块中不存在该页面
			temp=a[i];
			for(k=0;k<2;k++){
				b[k]=b[k+1];		
			}
			b[k]=temp;//替换最先进物理块的页面,即数组索引为0的页面
		}
		//打印
		printf("\t第%d次\t",i+1);
		for(z=0;z<3;z++){	
			printf("%d",b[z]);
		}
		if((i-1)%2==0){
			printf("\n");
		}
	}
}
int main(){
	int a[] = {1,5,4,8,5,6,9,7,4,0,2,1,2,5,3};	//页面数组
	int b[3] ={0,0,0};	//物理块数组
	doit(a,b);	
	return 0;
}
运行结果

运行结果

最佳置换算法(OPT)
#include<stdio.h>
int main(){
	int resource[] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};	//页面资源
	//物理块在这里运用二维数组,第一列代表页号,第二列代表往后所需的位置,即索引号
	int storge[3][2] = {{7,0},{0,0},{1,0}};	
	int i,j,k,s,count=0;
	double result; 
	int flag_one=1,flag_two=1,flag_three=1;
	//遍历物理块中是否存在所需的页面
	for(i=0;i<20;i++){
		for(j=0;j<3;j++){
			if(resource[i]==storge[j][0]){
				break;
			}
		}
		//如果不存在
		if(j==3){
			count++; //计算缺页率会用到
			//遍历往后所需该页号的位置,记录索引号,并更改标识
			for(k=i+1;k<20;k++){
				if(flag_one){
					if(resource[k]==storge[0][0]){
						storge[0][1]=k;
						flag_one=0;
					}
				}
				if(flag_two){
					if(resource[k]==storge[1][0]){
						storge[1][1]=k;
						flag_two=0;
					}
				}
				if(flag_three){
					if(resource[k]==storge[2][0]){
						storge[2][1]=k;
						flag_three=0; 
					}
				}
				
			}
			//选择应该替换的页面
			if(storge[0][1]==0) {
				storge[0][0]=resource[i];
			} 
			else if(storge[1][1]==0) {
				storge[1][0]=resource[i];
			} 
			else if(storge[2][1]==0){
				storge[2][0]=resource[i];
			} 
			else{ 
				if(storge[0][1]>storge[1][1]&&storge[0][1]>storge[2][1]){
					storge[0][0]=resource[i];
				}	
				else if(storge[1][1]>storge[0][1]&&storge[1][1]>storge[2][1]){
					storge[1][0]=resource[i];
				}
				else if(storge[2][1]>storge[0][1]&&storge[2][1]>storge[1][1]){
					storge[2][0]=resource[i];
				}
			} 
			//更改标识
			storge[0][1]=0;
			storge[1][1]=0;
			storge[2][1]=0;
			flag_one=1;
			flag_two=1;
			flag_three=1;
		}
		//打印
		printf("\t第%d次\t",i+1);
		for(s=0;s<3;s++){	
			printf("%d",storge[s][0]);
		}
		if((i-1)%2==0){
			printf("\n");
		} 
	}
	result=(double)count/20*100; 
	printf("缺页率:%.2f%%",result); 
}
运行结果

运行结果

最近最久未使用(LRU)

此算法和OPT算法实现方法很类似,就没有再写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值