内容发布更新时间 : 2024/11/7 14:27:04星期一 下面是文章的全部内容请认真阅读。
操作系统实验(四) 虚拟内存
1、实验题目
页面置换算法模拟——OPT、FIFO和LRU算法
2、实验目的
了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法,如最佳
(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(Least Recently Used)置换算法
3、实验内容
1)OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的
页面进行置换。
2)FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。
3)LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。
4、程序代码
#include
#define L 30///页面走向长度最大为30 using namespace std;
int M=4; ///内存块 struct P///定义一个结构体 {
int num,time; }p[30];
int Input(int m,P p[L])///打印页面走向状态 {
m=30; int i,j;
j=time(NULL);///取时钟时间
srand(j);///以时钟时间x为种子,初始化随机数发生器 cout<<\页面走向: \ for(i=0; i p[i].num=rand( );///产生1到10之间的随即数放到数组p中 p[i].time=0; cout< cout< void print(P *page1)///打印当前的页面 { P *page=new P[M]; page=page1; for(int i=0; i cout< int Search(int e,P *page1 )///寻找内存块中与e相同的块号 { P *page=new P[M]; page=page1; for(int i=0; i int Max(P *page1)///寻找最近最长未使用的页面 用于OPT算法 { P *page=new P[M]; page=page1; int e=page[0].time,i=0; while(i if(e for( i=0; i int Count(P *page1,int i,int t,P p[L])///记录当前内存块中页面离下次使用间隔长度 用于OPT算法 { P *page=new P[M]; page=page1; int count=0; for(int j=i; j if(page[t].num==p[j].num )break;///当前页面再次被访问时循环结束 else count++;///否则count+1 } return count;///返回count的值 } int main() { int c=1; int m=0,t=0; float n=0;///缺页次数 m=Input(m,p);///调用input函数,返回m值 M=4; P *page=new P[M]; ///do while(c==1||c==2||c==3) { int i=0; for(i=0; i page[i].num=0; page[i].time=m-1-i; } cout<<\页面置换\ cout<<\页面置换\ cout<<\页面置换\ cout<<\按其它键结束程序;\ cin>>c; if(c==1)///FIFO页面置换 ///FIFO(); { n=0; cout<<\算法页面置换情况如下: cout< if(Search(p[i].num,page)>=0) 存中 { cout< \ ///当前页面在内 ///输出当前页 cout<<\ \ i++; ///i加1 } else ///当前页不在内存中 { if(t==M)t=0; else { n++; ///缺页次数加1 page[t].num=p[i].num; ///把当前页面放入内存中 cout< print(page); ///打印当前页面 t++; //下一个内存块 i++; ///指向下一个页面 } } } cout<<\缺页次数:\ 缺页率:\= \ } if(c==2)///LRU页面置换,最近最久未使用 { n=0; cout<<\ LRU算法页面置换情况如下: \ cout< int a; t=Search(p[i].num,page); if(t>=0)///如果已在内存块中 { page[t].time=0;///把与它相同的内存块的时间置0 for(a=0; a if(a!=t)page[a].time++;///其它的时间加1 cout< else ///如果不在内存块中 { n++; ///缺页次数加1 t=Max(page); ///返回最近最久未使用的块号赋值给t page[t].num=p[i].num; ///进行替换 page[t].time=0; ///替换后时间置为0 cout< for(a=0; a if(a!=t)page[a].time++; ///其它的时间加1 } i++; } cout<<\缺页次数:\ 缺页率:\= \ } if(c==3)///OPT页面置换 { n=0; cout<<\ OPT算法置换情况如下:\ cout< if(Search(p[i].num,page)>=0)///如果已在内存块中 { cout< else///如果不在内存块中 { int a=0; for(t=0; t if(page[t].num==0)a++;///记录空的内存块数 if(a!=0) ///有空内存块 { int q=M;