El método de matriz de lenguaje C realiza el algoritmo de reemplazo de página OPT y FIFO

El contenido del entrenamiento del sistema operativo el semestre pasado, el código de Baidu básicamente usaba listas enlazadas en ese momento, y mi propia estructura de datos no era muy buena. Sentí que el código de Baidu era demasiado avanzado, así que me di cuenta de ello con el lenguaje C pure array. El algoritmo, el código es simple, de acuerdo con el propio nivel.

Algoritmo de reemplazo primero en entrar, primero en salir (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;
}
resultado de la operación

resultado de la operación

Algoritmo de reemplazo óptimo (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); 
}
resultado de la operación

resultado de la operación

Usado menos recientemente (LRU)

Este algoritmo es muy similar al método de implementación del algoritmo OPT, por lo que no es necesario escribir más.

Supongo que te gusta

Origin blog.csdn.net/qq_44042316/article/details/104206726
Recomendado
Clasificación