计算机操作系统:页面置换算法演示

目录

1 实验名称

2 实验目的

3 实验内容

4 实验原理及流程图

5 实验源代码

6 实验结果

7 实验总结


1 实验名称

       页面置换算法演示

2 实验目的

       1. 分析内存管理办法中每个页面置换算法原理;

        2. 掌握页面置换算法执行过程。 

3 实验内容

      C语言完成“OPT、FIFO、LRU”算法的演示置换过程,记录程序运行结果(置换次数和缺页率,以课本例题为例完成实验测试),比较各种置换算法的效率及优缺点,完成实验报告。

4 实验原理及流程图

       最佳置换算法、先进先出页面置换算法和最近最久未使用置换算法:

1. 最佳(Optimal)置换算法: 

       最佳置换算法是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。

2. 先进先出(FIFO)页面置换算法:

       FIFO算法是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

3. LRU(Least Recently Used)置换算法:

       最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做出决策的。

流程图:

5 实验源代码

#include <stdio.h>
#include <stdlib.h>
#define PNum 12
#define BNum 3
int Page[PNum]={0}; 
typedef struct{
	int block;
	int time;
}BLock;
typedef struct LNode{
	BLock B[3];
}Mem;
Mem M;
void CreatePage(){
	//初始化页面
	printf("页面走向:\n");
	for(int i=0;i<PNum;i++){
		Page[i]=rand()%9+1;
		printf("%d ",Page[i]);
	} 
	printf("\n");
}
int max(int a,int b,int c){
	int x,z;
	if(a>=b)
	   x=a;
	else x=b;
	if(x>=c)
	  z=x;
	else
	  z=c;
	return z;
}
void InitM(){
	for(int q=0;q<PNum;q++){
		M.B[q].block=0;
	}
	for(int q=0;q<PNum;q++){
		M.B[q].time=0;
	}
}
void FIFO(){	//先进先出页面置换算法
	printf("具体实现过程:\n");
	InitM();
	int i=0,j=0;
	int a=-1,b=-1;
	int Max=-1;
	int MaxT=0;
	int count=0;
	for(i=0;i<PNum;i++){
		for(j=0;j<BNum;j++)
	      if(M.B[j].block==0){
	    	 a=j;  //记住第一个页面为空的下标用于进入内存 
	    	 break; 
	    }
	    for(j=0;j<BNum;j++){
	    	if(M.B[j].block==Page[i])
	    	    b=j; //记住相同页面的下标不再置换 
	    }
	    for(j=0;j<BNum;j++){
	    	if(M.B[j].time>MaxT){
	    		MaxT=M.B[j].time;
	    		Max=j; //记住最先进入内存页面的下标 
	    	} 
		}
		if(b==-1){  //内存中没有相同的页 
			if(a!=-1){ //内存中还有空页面 
				M.B[a].block=Page[i];
				M.B[a].time=0;
				for(j=0;j<=a;j++)
				  M.B[j].time++ ;  //    
				a=-1; 
			}
			else{ //内存中已没有空页需进行置换 
				M.B[Max].block=Page[i];
				M.B[Max].time=0;
				for(j=0;j<BNum;j++)
				  M.B[j].time++;
				Max=-1;
				MaxT=0;
				count++; 
			}	
		}
		else{ //内存中有相同的页不再置换 
			M.B[b].block=Page[i];
			for(j=0;j<BNum;j++){
				M.B[j].time++;
			}
			b=-1; 
		}
		for(j=0;j<BNum;j++){
			printf("%d ",M.B[j].block);
		}
		printf("\n");	
	}
	float rate;
    float n=PNum-count;
	rate=(n/PNum)*100;
	printf("命中率为%.2lf%%\n",rate);
}
void LRU(){	//最近最久未使用置换算法
	printf("具体实现过程:\n");
	InitM();
	int i=0,j=0;
	int a=-1,b=-1;
	int Max=-1;
	int MaxU=0;
	int count=0;
	for(i=0;i<PNum;i++){
		for(j=0;j<BNum;j++)
	      if(M.B[j].block==0){
	    	 a=j;  //记住第一个页面为空的下标用于进入内存 
	    	 break; 
	    }
	    for(j=0;j<BNum;j++){
	    	if(M.B[j].block==Page[i])
	    	    b=j; //记住相同页面的下标不再置换 
	    }
	    for(j=0;j<BNum;j++){
	    	if(M.B[j].time>MaxU){
	    		MaxU=M.B[j].time;
	    		Max=j; //记住最先进入内存页面的下标 
	    	} 
		}
	    if(b==-1){ //内存中没有相同的页 
	    	if(a!=-1){ //内存中还有空页面 
	    		M.B[a].block=Page[i];
				M.B[a].time=0;
				for(j=0;j<=a;j++)
				  M.B[j].time++;
				a=-1;
	    	}
	    	else{//内存中已没有空页需进行置换 
	    		M.B[Max].block=Page[i];
				M.B[Max].time=0;
				for(j=0;j<BNum;j++)
				  M.B[j].time++;
				Max=-1;
				MaxU=0;
				count++; 
	    	}
	    	
	    }
		else{//内存中有相同的页不再置换
			M.B[b].block=Page[i];
			M.B[b].time=0;  //再次使用,置其为0 
			if(a!=-1){
				 M.B[a].time=0;  
			}
			for(j=0;j<BNum;j++){
				M.B[j].time++;
			}
			Max=-1;
			MaxU=0;
			b=-1;
		} 
		for(j=0;j<BNum;j++){
			printf("%d ",M.B[j].block);
		}
		printf("\n");	  
	}
	float rate;
    float n=PNum-count;
	rate=(n/PNum)*100;
	printf("命中率为%.2lf%%\n",rate);
}
void OPT(){	//最佳置换算法
	printf("具体实现过程:\n");
	for(int q=0;q<PNum;q++){
		M.B[q].block=0;
	} 
	int i=0,j=0;
	int a=-1,b=-1;
	int Max=-1;
	int count=0;
	for(i=0;i<PNum;i++){
		for(j=0;j<BNum;j++)
	      if(M.B[j].block==0){
	    	 a=j;  //记住第一个页面为空的下标用于进入内存 
	    	 break; 
	    }
	    for(j=0;j<BNum;j++){
	    	if(M.B[j].block==Page[i])
	    	    b=j; //记住相同页面的下标不再置换 
	    }
	    if(b==-1){//内存中没有相同的页
	    	if(a!=-1){ //内存中还有空页面 
	    		M.B[a].block=Page[i];
				//V[a]=0;
				a=-1;
	    	}
	    	else{  //内存中已没有空页需进行置换
			int c,d,e; 
	     	int x,y,m;
	    	for(c=i+1;c<=PNum-1;c++){
	    	  if(Page[c]==M.B[0].block){
	    		    x=c;
	    		    break;
	    		}
	    	  else{
	    			x=PNum;
	    		}		  
	    	}
			for(d=i+1;d<=PNum-1;d++){
	    		if(Page[d]==M.B[1].block){
	    		   y=d;
	    		   break;
	    		}
	    		else{
	    			y=PNum;
	    		}
	    	}
			for(e=i+1;e<=PNum-1;e++){
	    		if(Page[e]==M.B[2].block){
	    		   m=e;
	    		   break;
	    		}
	    		else{
	    			m=PNum;
	    		}
	    	}
	    	int z=max(x,y,m);
	    	if(z==x)
	    	  Max=0;
	    	if(z==y)
	    	  Max=1;
	    	if(z==m)
	    	  Max=2;
	    	M.B[Max].block=Page[i];
			Max=-1; 
			b=-1; 
			count++;	
	    	} 
		} 
		else{//内存中有相同的页不再置换
			M.B[b].block=Page[i];
		}
		for(j=0;j<BNum;j++){
			printf("%d ",M.B[j].block);
		}
		printf("\n");
    }
    float rate;
    float n=PNum-count;
	rate=(n/PNum)*100;
	printf("命中率为%.2lf%%\n",rate); 
} 
void Printf(){
	printf("***********页面置换算法******************\n");
	printf("***** 1-先进先出页面置换算法*************\n");
	printf("***** 2-最近最久未使用页面置换算法*******\n");
	printf("***** 3-最佳置换算法*********************\n");
	printf("***** 0-退出*****************************\n");
	printf("*****************************************\n");
}
int main(){
	int n;
	while(1){
		Printf();
		printf("请选择您要进行的操作:\n");
		scanf("%d",&n);
		CreatePage();
		switch(n){
			case 1:
	            FIFO();
	            break;
	        case 2:
	            LRU();
	            break;
	        case 3:
			    OPT();
			    break;
			case 0:
			     exit(0);
				 break; 
		}
	}
	return 0;
}

6 实验结果

7 实验总结

       在这次实验的三个算法中,最佳置换算法是从主存中移出永远不再需要的页面;如无这样的页面存在,则选择将来最长时间不需要访问的页面。于是所选择的被淘汰页面是将来永不在使用的,或者是在将来的最长时间内不被访问的,这样可以保证获得最低的缺页率。但是将来的会不会访问操作系统并不知道,因此该算法不能被实现,只是理想的。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茜茜西西CeCe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值