设计模拟实现OPT页面置换算法(c++)

/*设计模拟实现OPT页面置换算法。OPT算法:需要发生页面置换时,
算法总是选择在将来最不可能访问的页面进行置换。
要求用户动态输入一组页面序列,该序列顺序默认是已知,
页面个数至少是6个,系统分配的物理块数为3,
计算最终缺页次数和缺页率(默认仅采用请求调页策略)。*/

#include <stdio.h>
#include <iostream>
#include<algorithm>
using namespace std;
struct OPT {
	float Physical_blocks;//物理块
	bool Physical_blocks_state;//物理块是否为空 
	float Original_page;//原页面 
	bool page_breaks;//是否页面中断 
	int missing_pages;//缺页次数 
	float Physical_blocks_wait;//物理块是否待转 
};
void input(OPT *p, int N) {//输入函数
		printf("\n页面走向\n");
		for(int i =0;i<N;i++){
			scanf("%f", &p[i].Original_page);
		}
}

void print_Memory(OPT *p,int N) {//内存空间打印函数
	p[0].missing_pages=0;
	for(int i=0;i<N;i++){
		printf("%f,",p[i].Original_page);
	} 
	printf("\n");
	for(int i=0;i<N;i++){
		if(p[i].page_breaks==0){
			p[0].missing_pages++;
		}
	}
	float xx = (float)p[0].missing_pages;
	float yy = (float)N;
	
	printf("马冲我ce尼玛,缺页次数%d,缺页率%.2f%%",p[0].missing_pages,xx/yy*100) ;
}

void run(OPT *p,int N,int Y) {
//因为最佳页面置换算法你无法预知那个在之后没出现过,所以需要使用完整遍历每一个元素来查看 
	for(int i =0;i<N;i++){//对每个页面进行分配 
	int xx;
	int yy=0;
	p[i].page_breaks=0;
			while(p[xx].Physical_blocks_state==0&&xx<Y){//放入物理块 
				p[xx].Physical_blocks=p[i].Original_page;
				p[xx].Physical_blocks_state=1;
				printf("放入物理块%f\n",p[xx].Physical_blocks); 
				xx++;
				i++;
			}
			for(xx=0;xx<Y;xx++){//物理块循环检测
			p[xx].Physical_blocks_wait=0;
				printf("物理块%d,%f\n",xx,p[xx].Physical_blocks) ;
				for(int j=N;j>i;j--){//之后的页面检测 今后不使用的则淘汰
					if(p[xx].Physical_blocks==p[j].Original_page){
						printf("物理块%f非待转\n ",p[xx].Physical_blocks); 
						p[xx].Physical_blocks_wait=1;//非待转 
					}
					else{
						printf("物理块%f待转\n ",p[xx].Physical_blocks);
						
					}
			}
			if(p[xx].Physical_blocks==p[i].Original_page){//判断之后是否有相同页面 有则不进行页面置换
						p[i].page_breaks=1;//记录此处不缺页 
						printf("\n%d号位不缺页\n",i+1);
					}
			if(p[i].page_breaks!=1&&p[xx].Physical_blocks_wait==0&&yy<1){//
						p[xx].Physical_blocks_wait=0;
						printf("物理块%d中的页面%f被页面%f置换\n",xx+1,p[xx].Physical_blocks,p[i].Original_page);
						p[xx].Physical_blocks=p[i].Original_page;
						p[i].page_breaks=0;
						yy++;}
		}
	}
}
void OPT_MAIN() {
	int N;
	int Y;
	printf("请输入时刻的数量:\n");
	scanf("%d",&N);
	printf("请输入物理块的数量:\n");
	scanf("%d",&Y);
	OPT *p = new OPT[N];
	input(p, N);
	run (p,N,Y);
	print_Memory(p,N);
}
int main() {
	OPT_MAIN();
	return 0;
}

学技术的别来沾边

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值