首页 > 代码库 > 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
虚存管理页面置换算法 — FIFO和RUL算法模拟实现
本篇博文为追忆曾经写过的算法系列第一篇(20081021)
温故知新
目的: 为了解决内存容量有限与多作业运行的冲突,运用了虚拟存储技术,能从逻辑上对内存进行扩充,达到扩充内存的效果。分页存储管理是实现虚拟存储的一种方案。通过模拟算法的实验,加深理解,虚拟存储器的基本原理和方法。
要求: 1.请求分页的置换算法(FIFO && RUL算法实现);2.按给定的顺序列,输出页面调度过程包括命中 / 缺页,调入/调出;3.计算缺页率,频率。
说明:
vp_list[N] //访问序列 bs[M] //内存块表,M为内存块大小 struct pt{ int pno; //页号 int bno; //块号 int flag; //状态位,为0时在不内存,为1时在内存 int order; //优先序号 };
算法流程:
程序:
/* gujinjin 08/10/20 */ /* 程序名称:fifo &&LRU */ /* 程序目的:页面置换算法的FIFO编程实现 */ #include<iostream> using namespace std; #define N 20 //访问序列数组大小 #define M 10 //内存块表数组大小 struct pt{ int pno; //页号 int bno; //块号 int flag; //状态位,为0时在不内存,为1时在内存 int order; //优先序列 }; /*------------------------------------------*/ /*输入函数*/ /*------------------------------------------*/ void input(int *a,int n) { for(int i=0;i<n;i++){cin>>*a;a++;} } /*------------------------------------------*/ /*输出函数*/ /*------------------------------------------*/ void output(int *a,int n) { for(int i=0;i<n;i++){cout<<*a<<'\t';a++;} cout<<'\n'; } /*------------------------------------------*/ /*算法fifo && LRU函数*/ /*------------------------------------------*/ void fifo(int*vp_list,int*bs,int n,int m) { pt ptlist[N];//定义结构数组 int k=0,flag,cn=0,i,j;//cn——统计缺页数 for(j=0;j<m;j++)//赋初值 { bs[j]=0; } for(i=0;i<n;i++)// 访问序列循环 { flag=0; for(j=0;j<m;j++) if(vp_list[i]==bs[j]){flag=1;break;} if(flag==1)//命中 { ptlist[i].bno =j+1; ptlist[i].flag =1; ptlist[i].pno =vp_list[i]; } else{ ptlist[i].flag =0; ptlist[i].pno =vp_list[i]; bs[k]=vp_list[i]; ptlist[i].bno =k+1; k=(k+1)%m;//取模——循环队列 cn++; } } cout<<"FIFO算法:\n"; cout<<"----------------------------------**\n"; cout<<"缺页率为:"<<'\t'<<(float)cn/n<<'\n'; cout<<"-------------------------------------------------------------------**\n"; cout<<"序列号\n"; cout<<"-------------------------------------------------------------------**\n"; for(i=0;i<m;i++) { cout<<vp_list[i]<<"\t缺页!\t"<<"直接存入内存块!\n"; cout<<"-------------------------------------------------------------------**\n"; } for(i=m;i<n;i++) { if(ptlist[i].flag ==0) cout<<vp_list[i]<<"\t缺页!\t"<<"调出------块号为"<<ptlist[i].bno <<"--页号为"<<ptlist[i].pno <<'\n'; else cout<<vp_list[i]<<"\t命中!"<<"\t位置------块号为"<<ptlist[i].bno <<"--页号为"<<ptlist[i].pno <<'\n';; cout<<"-------------------------------------------------------------------**\n"; } } void LRU(int*vp_list,int*bs,int n,int m) { //----------------------------------------------------------------------------------------------** pt ptlist_LRU[N]; int k=0,flag,cn=0,i,j;//cn——统计缺页数 int com; for(j=0;j<m;j++)//赋初值 { bs[j]=0; } for(j=0;j<n;j++)ptlist_LRU[j].order =0; for(i=0;i<n;i++)// 访问序列循环 { flag=0; for(j=0;j<m;j++) if(vp_list[i]==bs[j]){flag=1;break;} if(flag==1)//命中 { ptlist_LRU[i].bno =j+1; ptlist_LRU[i].flag =1; ptlist_LRU[i].pno =vp_list[i]; ptlist_LRU[i].order--; com=ptlist_LRU[i].order; for(j=0;j<m;j++) if(ptlist_LRU[j].order <com) {com=ptlist_LRU[j].order;k=ptlist_LRU[j].bno ;} } else{ ptlist_LRU[i].flag =0; ptlist_LRU[i].pno =vp_list[i]; bs[k]=vp_list[i]; ptlist_LRU[i].bno =k+1; if(i<m)k=(k+1)%m; cn++; } } cout<<"LRU*算法:\n"; cout<<"----------------------------------**\n"; cout<<"缺页率为:"<<'\t'<<(float)cn/n<<'\n'; cout<<"-------------------------------------------------------------------**\n"; cout<<"序列号\n"; cout<<"-------------------------------------------------------------------**\n"; for(i=0;i<m;i++) { cout<<vp_list[i]<<"\t缺页!\t"<<"直接存入内存块!\n"; cout<<"-------------------------------------------------------------------**\n"; } for(i=m;i<n;i++) { if(ptlist_LRU[i].flag ==0) cout<<vp_list[i]<<"\t缺页!\t"<<"调出------块号为"<<ptlist_LRU[i].bno <<"--页号为"<<ptlist_LRU[i].pno <<'\n'; else cout<<vp_list[i]<<"\t命中!"<<"\t位置------块号为"<<ptlist_LRU[i].bno <<"--页号为"<<ptlist_LRU[i].pno <<'\n';; cout<<"-------------------------------------------------------------------**\n"; } } /*------------------------------------------*/ /*主函数*/ /*------------------------------------------*/ void main() { int vp_list[N],bs[M];//定义访问序列数组和内存块表数组 int n,m,choose; cout<<"输入序列个数:\n"; cin>>n; cout<<"输入内存块大小:\n"; cin>>m; cout<<"请输入访问序列:\n"; input(vp_list,n); cout<<"选FIFO算法输入1,选LRU*算法输入2:"; cin>>choose; cout<<"访问序列:"<<endl; output(vp_list,n); cout<<"**----------------------------------------**"; cout<<'\n'; if(choose==1) fifo(vp_list,bs,n,m);//调用fifo函数 if(choose==2) LRU(vp_list,bs,n,m); }
结果演示:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。