1、LRU是根据页面调入内存后的使用情况进行决策的,它利用“最近的过去”作为“最近的将来的近似,选择最近最久未使用的页面予以淘汰。该算法主要借助于页面结构中的访问时间time来实现,time记录了一个页面上次的访问时间,因此,当须淘汰一个页面时,选择处于内存的页面中其time值最小的页面,即最近最久未使用的页面予以淘汰。LFU页面置换算法LFU要求为每个页面配置一个计数器(即页面结构中的counter),一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘汰。设计流程: 1。通过随机数产生一个指令序列,共320条指令。 2.指令
2、序列变换成页地址流 3.计算并输出下述各种算法在不同内存容量下的命中率。 4.在主函数中生成要求的指令序列,并将其转换成页地址流;在不同的内存容量下调用上述函数使其计算并输出相应的命中率。三、实验步骤(包括主要步骤、代码分析等)主要代码:1。页面结构 typedef struct int pn, pfn, counter, time; pl_type ;pl_type pltotal_vp;其中pn为页面号(页号),pfn为页帧号(物理块号),counter为一个周期内访问该页面的次数,time为访问时间;pltotal_vp为页面结构数组,由于共有320条指令,每页可装入10条指令,因此虚页
3、长total_vp的值为32.将此结构封装到Pahg.h文件中。2.页帧控制结构struct pfc_struct int pn, pfn; struct pfc_struct *next;;typedef struct pfc_struct pfc_type;pfc_type pfctotal_vp, freepf_head, busypf_head, *busypf_tail;其中pfctotal_vp定义用户进程的页帧控制结构数组,在该实验中,用户内存工作区是动态变化的,最多可达到用户进程的虚页数目,即32个物理块。*freepf_head为空闲页帧头的指针busypf_head为忙页帧
4、头的指针busypf_tail忙页帧尾的指针讲此结构封装到PageControl。h头文件中。3。主要函数(1) void initialize(int): 初始化函数该函数主要对页面结构数组pl和页帧结构数组pfc进行初始化,如置页面结构中的页面号pn,初始化页帧号pfn为空,访问次数counter为0,访问时间time为-1;同样对页帧数组进行初始化,形成一个空闲页帧队列.(2) void OPT(int): 计算使用最佳页面算法时的命中率(3) void FIFO(int): 计算使用先进先出页面置换算法时的命中率(4) void LRU(int): 计算使用最近最久未使用页面置换算法时
5、的命中率(5) void LFU(int): 计算使用最少使用置换算法时的命中率void FIFO(int total_pf) /先进先出页面置换算法/ int i,j; pfc_type p; initialize(total_pf); busypf_head=busypf_tail=NULL;for(i=0;itotal_instruction;i+) if(plpagei.pfn=INVALID) /*页面失效/ diseffect=diseffect+1; if(freepf_head=NULL) /*无空闲页帧*/ p=busypf_head-next; plbusypf_head-
6、pn.pfn=INVALID; /将忙页帧队首页面作为换出页面 freepf_head=busypf_head; freepf_head-next=NULL; busypf_head=p; /忙页帧头指针后移 p=freepf_headnext; /有空闲页帧 freepf_head freepf_head-pn=pagei; / 将所需页面调入空闲页帧 / plpagei.pfn=freepf_head-pfn; if(busypf_tail=NULL) / 若忙页帧队列为空,则将其头尾指针都指向刚调入页面所在的页帧 / busypf_head=busypf_tail=freepf_head
7、; else /否则,将刚调入页面所在的页帧挂在忙页帧队列尾部 busypf_tailnext=freepf_head; busypf_tail=freepf_head; freepf_head=p; /空闲页帧头指针后移 printf(FIFO:6。4f ,1-(float)diseffect/320);void LRU(int total_pf) /*最近最久未使用页面置换算法/ int i,j; int min,minj,present_time; initialize(total_pf); present_time=0;i plpagei。pfn=freepf_headpfn; /有空
8、闲页面,改为有效 plpagei。time=present_time; /修改页面的访问时间 freepf_head=freepf_head-next; /减少一个free 页面 else plpagei。time=present_time; /命中则修改该单元的访问时间 present_time+;LRU:%6.4f ,1(float)diseffect/320);void OPT(int total_pf) /* 最佳页面置换算法 / int i,j,max,maxpage,d,disttotal_vp; initialize(total_pf); for(i=0;total_instru
9、ction; if(plpagei.pfn=INVALID) /*页面失效/ if(freepf_head=NULL) /无空闲页面/ for(j=0;j+) if(plj.pfn!=INVALID)/所有位于内存页面的距离变量赋一足够大的数 distj=32767; else /不在内存的页面该变量则置为0 distj=0; d=1; /* 对于位于内存且在当前访问页面之后将再次被访问的页面,dist重置为当 前页 面与之后首次出现该页面时两者之间的距离 / for(j=i+1;jtotal_instruction; if(plpagej.pfn!=INVALID & distpagej=3
10、2767) distpagej=d; d+; max=-1; /查找dist变量值最大的页面作为换出页面 if(maxdistj) max=distj; maxpage=j; freepf_head=pfcplmaxpage。 freepf_headnext=NULL; plmaxpage.pfn=INVALID; plpagei.pfn=freepf_head-pfn; freepf_head=freepf_head- /减少一个free 页面 printf(OPT:6.4f ,1-(float)diseffect/320);void LFU(int total_pf) / 最少使用页面置换
11、算法 / int i,j,min,minpage; if(plpagei。pfn=INVALID) /页面失效 diseffect+; if(freepf_head=NULL) /无空闲页帧 min=32767; for(j=0;jplj.counter&plj。counter; minpage=j; plj.counter=0; freepf_head=pfcplminpage.pfn; plminpage。 freepf_head-next=NULL; plpagei.pfn=freepf_headpfn; plpagei。counter+; /增加页面访问次数 freepf_head=f
12、reepf_headnext; /减少一个free 页 plpagei.counter+; /命中增加页面访问次数LFU:4f ”,1(float)diseffect/320);将上述函数写成头文件的格式封装在Memory.h头文件中,由主函数main调用使用.运行结果打开linux虚拟机,用vim编辑器打开代码进行修改和调整。用g+编译器进行编译运,如图所示:四、结果分析与总结 由实验结果可知opt算法可保证获得最低的缺页率,但是由于目前还无法预知一个进程在内存的若干的页面中,哪一个页面是未来最长时间内不被访问的,因而该算法在实际应用中无法实现。Fifo算法有时候比较差,因为它所依据的条件是各个界面调入内存的时间,而页面调入的先后顺序不能反映页面的使用情况。LRU算法置换算法虽然是一种比较好的置换算法,但是在实际中需要用到寄存器和栈的硬件支持,LFC算法选择在最近时期使用最少的页面作为淘汰页,效率有时候很高.教师签名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1