/*设计模拟实现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;
}
学技术的别来沾边