操作系统实验(四)——页面置换算法(附C语言代码)

实验4 页面置换算法

一、实验目的

理解页面置换算法,实现先进先出(FIFO)置换算法和最久未使用(LRU)置换算法,给出任意的输入流,计算置换次数

二、实验要求

给出任意的输入流,计算置换次数。物理块大小可定制,0~9数字任意排序的数字流。

三、实验代码-页面置换算法.cpp

1.初始化队列

#include <stdio.h>

void initial(int list[],int number){//初始化队列 
	for(int i=0;i<number;i++){
		list[i]=-1;
	}
} 

2.FIFO算法

void FIFO(int memorylist[],int phynum,int strlist[],int pagenum){
	int replacecount=0;
	int earliest=0;//记录当前最早进入内存的下标
	int isvisited=0;//记录当前页面访问情况
	for(int i=0;i<pagenum;i++){
		isvisited=0;
		//判断是否需要置换(内存已满且需要访问的页面不在内存中)
		for(int j=0;j<phynum;j++){
			if(memorylist[j]==strlist[i]){
				//页面已经再内存中
				isvisited=1;//修改访问情况
				break; 
			}
			if(memorylist[j]==-1){
				//页面不在内存中且内存未满(直接存入)
				memorylist[j]=strlist[i];
				isvisited=1;//修改访问情况
				break; 
			}
		}
		if(!isvisited){
			//当前页面未被访问(进行页面置换)
			memorylist[earliest]=strlist[i];
			//下标指向下一个
			earliest++;
			//若到了最后一个,下标归零
			if(earliest>phynum-1){
				earliest=0;
			}
			replacecount++; 
		} 
	}
	printf("置换次数:%d\n",replacecount);
}

3.LRU算法

void LRU(int memorylist[],int phynum,int strlist[],int pagenum){
	int replacecount=0;//置换次数
	//记录内存中最近一次访问至今的时间
	int timerecord[phynum];
	initial(timerecord,phynum);
	//记录当前页面的访问情况
	int isvisited=0;
	
	//记录已经在内存中的页面数量
	int pagecount=0;
	for(int i=0;i<pagenum;i++){
		isvisited=0;
		
		//将已经在内存的页面时间加1
		for(int p=0;p<pagecount;p++){
			if(memorylist[p]!=-1){
				timerecord[p]++;
			}
		}
		
		//是否需要置换
		for(int j=0;j<phynum;j++){
			if(memorylist[j]!=-1){
				timerecord[j]++;
			}
			if(memorylist[j]==strlist[i]){
				//该页面已经在内存中,修改访问情况
				isvisited=1;
				//重置访问时间
				timerecord[j]=-1;
				break; 
			}
			if(memorylist[j]==-1){
				//页面不在内存中且内存未满(直接存入)
				memorylist[j]=strlist[i];
				pagecount++;
				//修改访问情况
				isvisited=1;
				//修改访问时间
				timerecord[j]++;
				break; 
			}
		}
		if(!isvisited){
			//需要置换,寻找最久未访问的页面所在内存下标
			int max=0;
			//即找数组最大值 
			for(int k=0;k<phynum;k++){
				if(timerecord[max]<timerecord[k]){
					max=k; 
				}
			}
			//将该位置的页面换出
			memorylist[max]=strlist[i];
			timerecord[max]=-1;
			replacecount++; 
		} 
	}
	printf("置换次数:%d\n",replacecount);
}

4.主函数

int main(){
	//物理块的数量
	int phyblocknum;
	printf("请输入物理块的数量:\n");
	scanf("%d",&phyblocknum);
	
	//内存队列
	int memorylist[phyblocknum];
	//初始化内存状态
	initial(memorylist,phyblocknum);
	
	//页面数量
	int pagenum;
	printf("请输入要访问的页面数量:\n");
	scanf("%d",&pagenum); 
	
	int pagenumstrlist[pagenum];
	printf("请输入要访问的页面号:\n");
	for(int i=0;i<pagenum;i++){
		scanf("%d",&pagenumstrlist[i]);
	}

	int choose;//需要选择的置换算法
	while(1){
	
	printf("请选择所需的置换算法:\n");
	printf("1:FIFO 2.LRU 3.退出 ");
	scanf("%d",&choose);
	
	switch(choose){
		case 1:
			FIFO(memorylist,phyblocknum,pagenumstrlist,pagenum);
			initial(memorylist,phyblocknum);
			break;
		case 2:
			LRU(memorylist,phyblocknum,pagenumstrlist,pagenum);
			initial(memorylist,phyblocknum);
			break;
		default:
			return 0;
			break;
	}
}
	return 0; 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

京海第一深情xin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值