C言語の配列メソッドは、OPTおよびFIFOページ置換アルゴリズムを実現します

オペレーティングシステムトレーニングの前学期の内容、Baiduのコードは基本的にその時点でリンクリストを使用しており、私自身のデータ構造はあまり良くありませんでした。Baiduのコードは高度すぎると感じたので、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アルゴリズムの実装方法とよく似ているため、これ以上の記述はありません。

おすすめ

転載: blog.csdn.net/qq_44042316/article/details/104206726
おすすめ