栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

JXNU操作系统实验八 页面置换算法模拟

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JXNU操作系统实验八 页面置换算法模拟

JXNU操作系统实验八 页面置换算法模拟

题目:设计一个虚拟存储区和内存工作区,并使用下述常用页面置换算法计算缺页率,并输出每次被置换的页面。
假设页面访问序列为:7、0、1、2、0、3、0、4、2、3、0、3、2、1、2、0、1、7、0、1
(1)先进先出算法(FIFO)
(2)最近最少使用算法(LRU)
(3)最优置换算法(OPT)
请上传实验源代码和运行结果截图。

以下为个人代码,仅供参考,请勿复制粘贴

FIFO:

LRU:

OPT:

代码:

#include
using namespace std;

const int MAX = 105;

int n; //物理块数
int m; //作业序列数 
typedef struct{
	int id;              //页面id;
	vectorsta;     //物理块使用状态(id,time)
	bool ok;			//是否需要置换	 	 
}node;

typedef struct{
	int id;				//存放的页面号	
	bool sta;           //是否已经使用									
	int time;			//时间 
}Block;


node work[MAX];     
Block block[MAX];       


void FIFO(){
	for(int i=1;i<=m;i++){   //处理第i个页面 
		
		bool f = true;  
		for(int j=1;j<=n;j++){   //如果已经在物理块里面 
			if(block[j].sta == true && block[j].id == work[i].id){
				for(int j=1;j<=n;j++){
					work[i].sta[j] = block[j].id;
				}
				f = false;
				break ;
			}
		}
		if(!f) continue;    //如果已经在物理块里了,不需要置换 
		
		bool flag = false;    //是否有空闲块 
		for(int j=1;j<=n;j++){
			if(block[j].sta == false){
				block[j].id = work[i].id;
				block[j].sta = true;
				block[j].time = i; 
				flag = true; 
				break;
			}
		}
		

		if(!flag){           //无空闲块,找最先来的置换 
			int t = MAX;
			int idx = 0;
			for(int j=1;j<=n;j++){
				if(block[j].time < t){
					idx = j;
					t = block[j].time;
				}
			}
			block[idx].id = work[i].id;
			block[idx].time = i;
		}
		
		work[i].ok = true;
		for(int j=1;j<=n;j++){
			work[i].sta[j] = block[j].id;
		}
		
		
	}
}

void LRU(){
	for(int i=1;i<=m;i++){   //处理第i个页面 
		
		bool f = true;  
		for(int j=1;j<=n;j++){   //如果已经在物理块里面 
			if(block[j].sta == true && block[j].id == work[i].id){
				block[j].time = i; 
				for(int j=1;j<=n;j++){
					work[i].sta[j] = block[j].id;
				}
				f = false;
				break ;
			}
		}
		if(!f) continue;    //如果已经在物理块里了,不需要置换 
		
		bool flag = false;    //是否有空闲块 
		for(int j=1;j<=n;j++){
			if(block[j].sta == false){
				block[j].id = work[i].id;
				block[j].sta = true;
				block[j].time = i; 
				flag = true; 
				break;
			}
		}
		

		if(!flag){           //无空闲块,找最久未使用的 
			int t = MAX;
			int idx = 0;
			for(int j=1;j<=n;j++){
				if(block[j].time < t){
					idx = j;
					t = block[j].time;
				}
			}
			block[idx].id = work[i].id;
			block[idx].time = i;
		}
		
		work[i].ok = true;
		for(int j=1;j<=n;j++){
			work[i].sta[j] = block[j].id;
		}
	}
}

void OPT(){
	for(int i=1;i<=m;i++){   //处理第i个页面 
		bool f = true;  
		for(int j=1;j<=n;j++){   //如果已经在物理块里面 
			if(block[j].sta == true && block[j].id == work[i].id){
				block[j].time = i; 
				for(int j=1;j<=n;j++){
					work[i].sta[j] = block[j].id;
				}
				f = false;
				break ;
			}
		}
		if(!f) continue;    //如果已经在物理块里了,不需要置换 
		
		bool flag = false;    //是否有空闲块 
		for(int j=1;j<=n;j++){
			if(block[j].sta == false){
				block[j].id = work[i].id;
				block[j].sta = true;
				flag = true; 
				break;
			}
		}
		

		if(!flag){           //无空闲块,找最久不会被访问的 
			
			for(int j=1;j<=n;j++){
				block[j].time = MAX;
			}
		
			for(int j=m;j>=i;j--){        
				for(int x=1;x<=n;x++){
					if(work[j].id == block[x].id){
						block[x].time = j;
					} 
				}
			} 
			
			int t = -1;
			int idx = 0;
			for(int j=1;j<=n;j++){
				if(block[j].time > t){
					idx = j;
					t = block[j].time;
				}
			}
			block[idx].id = work[i].id;
			block[idx].time = i;
		}
		
		work[i].ok = true;
		for(int j=1;j<=n;j++){
			work[i].sta[j] = block[j].id;
		}
	}
}

void init(){
	cout<<"请输入物理块数: ";
	cin>>n;
	
	for(int i=1;i<=n;i++){
		block[i].id = -1;
		block[i].sta = false;
		block[i].time = 0;
	} 
	
	
	cout<<"请输入页面访问序列:(输入-1停止输入) "<>x;
	while(x!=-1){
		work[++m].id = x;
		work[m].sta.resize(n+1,-1);
		work[m].ok = false;
		cin>>x;
	} 
	
	cout<<"物理块数:"<
	cout<<"作业序列: ";
	for(int i=1;i<=m;i++)  printf("%5d",work[i].id) ;
	cout<
		cout<<"物理块"<
		if(work[j].ok){
			printf("%5c",'Y') ;
			sum++;
		} else{
			printf("%5c",' ') ;
		} 
	}
	printf("n缺页率:%.2lfn",sum*1.0/m); 
}

int main(){
	int op;
	init();
	cout<<"1:FIFO  2:LRU  3.OPT "<>op;
	if(op == 1){
		cout<<"FIFO"<
		cout<<"LRU"<
		cout<<"OPT"<
		cout<<"输入不合法!!"<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928192.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号