题目:设计一个虚拟存储区和内存工作区,并使用下述常用页面置换算法计算缺页率,并输出每次被置换的页面。
假设页面访问序列为: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:
代码:
#includeusing namespace std; const int MAX = 105; int n; //物理块数 int m; //作业序列数 typedef struct{ int id; //页面id; vector sta; //物理块使用状态(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<<"输入不合法!!"<



