C language array method realizes OPT and FIFO page replacement algorithm

The content of the operating system training last semester, Baidu's code basically used linked lists at that time, and my own data structure was not very good. I felt that Baidu's code was too advanced, so I realized it with C language pure array. The algorithm, the code is simple, accord with own level.

First-in-first-out replacement algorithm (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;
}
operation result

operation result

Optimal Replacement Algorithm (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); 
}
operation result

operation result

Least recently used (LRU)

This algorithm is very similar to the OPT algorithm implementation method, so there is no further writing.

Guess you like

Origin blog.csdn.net/qq_44042316/article/details/104206726