FIFO,LRU,OPT置换算法
来源:互联网 发布:java 微信h5开发教程 编辑:程序博客网 时间:2024/04/29 13:04
#include<iostream>#include <cstdlib>#include <ctime>#define L 20 //页面长度最大为20using namespace std;int M; //内存块struct Pro//定义一个结构体{ int num,time;};Input(int m,Pro p[L])//打印页面走向状态{ cout<<"请输入页面长度(10~20):"; do { cin>>m; if(m>20||m<10) { cout<<endl; cout<<"页面长度必须在10~20之间"<<endl<<endl; cout<<"请重新输入L:"; } else break; }while(1); int i,j; j=time(NULL);//取时钟时间 srand(j);//以时钟时间j为种子,初始化随机数发生器 cout<<endl; cout<<"输出随机数: "<<endl; cout<<endl; for(i=0;i<m;i++) { p[i].num=rand( )%10;//产生0到9之间的随机数放到数组p中 p[i].time=0; cout<<p[i].num<<" "; } cout<<endl<<endl; return m;}void print(Pro *page1)//打印当前的页面{ Pro *page=new Pro[M]; page=page1; for(int i=0;i<M;i++) cout<<page[i].num<<" "; cout<<endl;}int Search(int e,Pro *page1 )//寻找内存块中与e相同的块号{ Pro *page=new Pro[M]; page=page1; for(int i=0;i<M;i++) if(e==page[i].num) return i;//返回i值 return -1;}int Max(Pro *page1)//寻找最近最长未使用的页面{ Pro *page=new Pro[M]; page=page1; int e=page[0].time,i=0; while(i<M) //找出离现在时间最长的页面 { if(e<page[i].time) e=page[i].time; i++; } for( i=0;i<M;i++) if(e==page[i].time) return i;//找到离现在时间最长的页面返回其块号 return -1;}int Count(Pro *page1,int i,int t,Pro p[L])//记录当前内存块中页面离下次使用间隔长度{ Pro *page=new Pro[M]; page=page1; int count=0; for(int j=i;j<L;j++) { if(page[t].num==p[j].num ) break;//当前页面再次被访问时循环结束 else count++;//否则count+1 } return count;//返回count的值}int main(){ int c; int m=0,t=0; float n=0; Pro p[L]; m=Input(m,p);//调用input函数,返回m值 cout<<"请输入分配的物理块m(2~6): "; cout<<endl<<endl; do { cin>>M; if(M>6||M<2) { cout<<endl; cout<<"物理块m必须在2~6之间"<<endl<<endl; cout<<"请重新输入m: "; } else break; }while(1); Pro *page=new Pro[M]; do { for(int i=0;i<M;i++)//初始化页面基本情况 { page[i].num=0; page[i].time=m-1-i; } i=0; cout<<endl; cout<<"1:FIFO页面置换"<<endl<<endl; cout<<"2:LRU页面置换"<<endl<<endl; cout<<"3:OPT页面置换"<<endl<<endl; cout<<"请选择页面置换算法:"<<endl<<endl; cin>>c; system("cls"); if(c==1)//FIFO页面置换 { n=0; cout<<" FIFO算法页面置换情况如下: "<<endl; cout<<endl; while(i<m) { if(Search(p[i].num,page)>=0) //当前页面在内存中 { cout<<p[i].num<<" "; //输出当前页p[i].num cout<<"不缺页"<<endl; i++; //i加1 } else //当前页不在内存中 { if(t==M)t=0; else { n++; //缺页次数加1 page[t].num=p[i].num; //把当前页面放入内存中 cout<<p[i].num<<" "; print(page); //打印当前页面 t++; //下一个内存块 i++; //指向下一个页面 } } } cout<<endl; cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl<<endl; } if(c==2)//LRU页面置换 { n=0; cout<<" LRU算法页面置换情况如下: "<<endl; cout<<endl; while(i<m) { int a; t=Search(p[i].num,page); if(t>=0)//如果已在内存块中 { page[t].time=0;//把与它相同的内存块的时间置0 for(a=0;a<M;a++) if(a!=t)page[a].time++;//其它的时间加1 cout<<p[i].num<<" "; cout<<"不缺页"<<endl; } else //如果不在内存块中 { n++; //缺页次数加1 t=Max(page); //返回最近最久未使用的块号赋值给t page[t].num=p[i].num; //进行替换 page[t].time=0; //替换后时间置为0 cout<<p[i].num<<" "; print(page); for(a=0;a<M;a++) if(a!=t) page[a].time++; //其它的时间加1 } i++; } cout<<endl; cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl<<endl; } if(c==3)//OPT页面置换 { n=0; cout<<" OPT算法置换情况如下:"<<endl; cout<<endl; while(i<m) { if(Search(p[i].num,page)>=0)//如果已在内存块中 { cout<<p[i].num<<" "; cout<<"不缺页"<<endl; i++; } else//如果不在内存块中 { int a=0; for(t=0;t<M;t++) if(page[t].num==0)a++;//记录空的内存块数 if(a!=0) //有空内存 { int q=M; for(t=0;t<M;t++) if(page[t].num==0&&q>t)q=t;//把空内存块中块号最小的找出来 page[q].num=p[i].num; n++; cout<<p[i].num<<" "; print(page); i++; } else { int temp=0,s; for(t=0;t<M;t++)//寻找内存块中下次使用离现在最久的页面 if(temp<Count(page,i,t,p)) { temp=Count(page,i,t,p); s=t; }//把找到的块号赋给s page[s].num=p[i].num; n++; cout<<p[i].num<<" "; print(page); i++; } } } cout<<endl; cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl<<endl; } }while(c==1||c==2||c==3); return 0;}
0 0
- FIFO,LRU,OPT置换算法
- FIFO, LRU, OPT 页面置换算法
- 页面置换算法-FIFO、LRU、OPT
- 页置换算法FIFO、LRU、OPT
- 页面置换算法总结-FIFO-LRU-OPT
- 页置换算法FIFO、LRU、OPT
- 页置换算法FIFO、LRU、OPT
- FIFO,LRU,OPT页面置换算法
- 页面置换算法 FIFO,OPT,LRU
- FIFO、LRU、OPT这三种置换算法的缺页次数
- 页面置换算法(FIFO,LRU,OPT)c模拟
- 操作系统——页置换算法(FIFO,OPT,LRU)
- FIFO、LRU、OPT这三种置换算法的缺页次数
- FIFO、LRU、OPT这三种置换算法的缺页次数
- FIFO、LRU、OPT这三种置换算法的缺页次数
- FIFO、LRU、OPT这三种置换算法的缺页次数
- FIFO、LRU、OPT这三种置换算法的缺页次数
- FIFO、LRU、OPT这三种置换算法的缺页次数
- uboot 中 env相关问题
- iOS笔记5
- LeetCode 之 Intersection of Two Linked Lists
- java程序员常犯的几个错误
- 日期格式字符说明【转载】
- FIFO,LRU,OPT置换算法
- iOS开发网络—数据安全
- 第七周实践项目1—建立顺序环形队列算法库
- 关于新浪微博OAuth2.0授权问题记录-invalid request
- time,datetime中字符串,时间对象,和时间戳的转换学习整理
- Xcode7中你一定要知道的炸裂调试神技【转载】
- 网上摘抄的感觉有用的正则习题
- iOS笔记6
- Android4.4 RIL的AT命令增加流程