页面淘汰算法实验报告
页面置换算法实验报告

页面置换算法实验报告
一、实验内容
本次实验主要围绕页面置换算法进行,以实验课本的实例介绍,采用FIFO页面置换算法对后面提到的参数进行置换,最终得出页面置换的结果和比较所得结果。
二、实验步骤
(一) 熟悉FIFO算法
首先是要了解FIFO页面置换算法,FIFO全称(First In First Out),按页面进入内存的顺序来替换相应内存页面,先进先出,将先进入内存的页面先替换出去。
(二) 阅读实验课本
在阅读实验课本之前要先熟悉实验书上所介绍的FIFO算法,然后在实验书上找出需要做的实验,并对实验环境和表格进行观察,掌握实验的基本内容。
(三) 开始页面置换
在开始实验之前,熟悉实验环境,根据实验书上的参数,首先模拟进程分配内存,根据FIFO算法去进行计算,根据上表中的参数去比较,最后得出最终结果。
(四) 在本次实验的补充
这次实验中,可以把FIFO的概念应用到实际应用中,也可以模拟不同情况,例如改变页面的大小,观察不同页面置换算法的结果,实验出最合适的结果。
三、实验结论
本次实验是为了了解FIFO页面置换算法,实验出最终的结果,最后得出页面置换的结果及比较结果。
先进先出页面置换算法实验报告电子版

验
内
容
先进先出页面置换算法,该算法淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
实
验
步
骤
#include "stdafx.h"
#include<stdio.h>
#define M 20
#define N 3
void FIFO(int a[N],int b[M])
{
int i,j,k;
}
printf("\n"); }
s=k*1.0/M;
printf("中断次数为:%d\n",k);
printf("缺页率为:%f\n",s);
}
void main()
{int a[N]={0,0,0};
int b[M]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
FIFO(a,b);
}
研
究
与
探
讨
通过实验更加了解了各种页面置换算法之间的区别。在实验中,不知道如何来选择是否要置换,后想到可以另加一个数组存0,1,用以标记是否发生缺页中断。
int c[M]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
float s;
for(i=0;i<N;i++)
{
a[i]=b[i];
for(j=0;j<=i;j++)
{
printf("%d ",a[j]);
}
printf("\n");
}
k=N;
页面置换算法 实验报告(DOC)

综合性实验报告一、实验目的1.学习常见的4种页面置换算法:最佳置换算法(OPT),先进先出页面置换算法(FIFO),最近最久未使用页面算法(LRU),最少使用置换算法(LFU)。
2.编写函数并计算输出上述各种算法的命中率。
二、总体设计(设计原理、设计方案及流程等)设计原理:OPT页面置换算法OPT所选择被淘汰的页面是已调入内存,且在以后永不使用的,或是在最长时间内不再被访问的页面。
因此如何找出这样的页面是该算法的关键。
可为每个页面设置一个步长变量,其初值为一足够大的数,对于不在内存的页面,将其值重置为零,对于位于内存的页面,其值重置为当前访问页面与之后首次出现该页面时两者之间的距离,因此该值越大表示该页是在最长时间内不再被访问的页面,可以选择其作为换出页面。
FIFO页面置换算法FIFO总是选择最先进入内存的页面予以淘汰,因此可设置一个先进先出的忙页帧队列,新调入内存的页面挂在该队列的尾部,而当无空闲页帧时,可从该队列首部取下一个页帧作为空闲页帧,进而调入所需页面。
LRU页面置换算法LRU是根据页面调入内存后的使用情况进行决策的,它利用“最近的过去”作为“最近的将来”的近似,选择最近最久未使用的页面予以淘汰。
该算法主要借助于页面结构中的访问时间time来实现,time记录了一个页面上次的访问时间,因此,当须淘汰一个页面时,选择处于内存的页面中其time值最小的页面,即最近最久未使用的页面予以淘汰。
LFU页面置换算法LFU要求为每个页面配置一个计数器(即页面结构中的counter),一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘汰。
设计流程:1.通过随机数产生一个指令序列,共320条指令。
2.指令序列变换成页地址流3.计算并输出下述各种算法在不同内存容量下的命中率。
4.在主函数中生成要求的指令序列,并将其转换成页地址流;在不同的内存容量下调用上述函数使其计算并输出相应的命中率。
【精品】页面置换算法实验报告

【精品】页面置换算法实验报告一、实验目的了解操作系统中的页面置换算法,并实现FIFO、LRU和Clock算法。
二、实验原理页面置换算法是操作系统中用到的一种算法,其作用是在内存不够用时,选择牺牲已经在内存中的一些页,腾出更多的空间给新的内容。
本次实验主要实现了FIFO、LRU和Clock算法。
1、FIFO算法FIFO算法是最简单的页面置换算法,它采用先进先出的原则,即最先进入内存的页面应该最早被替换出去。
该算法的实现非常简单,只需要维护一个队列即可。
当需要置换页面时,选择队列的第一个页面进行替换即可。
2、LRU算法LRU算法是Least Recently Used的缩写,即最近最少使用算法。
该算法的核心思想是选择最久没有被使用的页面进行替换。
为了实现该算法,需要维护记录页面使用时间的链表、栈或队列等结构。
3、Clock算法Clock算法也叫做二次机会算法,是一种改良的FIFO算法。
它是基于FIFO算法的思想,并且每个页面都设置了一个使用位(use bit),用于记录该页面是否被使用过。
当需要置换一个页面时,检查该页面的使用位,如果该页面的使用位为1,则将该页面的使用位设置为0并移到队列的末尾,表示该页面有“二次机会”继续待在内存中;如果该页面的使用位为0,则选择该页面进行替换。
三、实验过程本次实验采用Python语言实现页面置换算法,并使用样例进行测试。
1、FIFO算法实现FIFO算法的实现非常简单,只需要用一个队列来维护已经在内存中的页面,当需要置换页面时,选择队列的第一个元素即可。
代码如下:```pythonfrom collections import dequeclass FIFO:def __init__(self, frame_num):self.frame_num = frame_numself.frames = deque(maxlen=frame_num)def access(self, page):if page in self.frames:return Falseif len(self.frames) >= self.frame_num:self.frames.popleft()self.frames.append(page)return True```2、LRU算法实现LRU算法的实现需要维护一个记录页面使用时间的链表或队列。
一种量化的页面淘汰算法

Ab ta tLRU-ki n ft emo twi ey a pid p g -e lcme tag rt msi h d r p r t g s se n sr c : so eo h s d l p l a erpa e n lo i e h n temo en o eai y tmsa d n d tb s y tm s Ho v r aa aes se . we e ,wi heice n fte n mb r o eo d r trg e ie a ig dfee tra - i t t n rme to h u e fs cn ay so a ed vcs h vn i rn e dwrt h f e s e d h y tm ,t ed a ak o RU- h t n ytefe u n yo e e tp g eee csi a e t c o n Op e p e si t es se n h rwb c fL kt a l rq e c frc n a erfrn e stk n i oa c u tt r — o h n
dc h o a e n t e n a u u e i o n p I hs p p r u n i t n ag rt m a d EL itt eh t g s i h e r f t r s c mi g u . n t i a e ,a q a tz i l o i p ao h n me RUK s p o o e o i r p sd f r
mo e i c m nyu e r y tm i i ee t id f eo d r trg e i sd mo sr t h t RU 尼i j s a d ls o mo l sd f s se w t df r n n s c n ay so a ed v e e n t e t a L - s u t o a h f k o s c a s
页面置换算法实验报告实验心得

页面置换算法实验报告实验心得
1. 实验背景
页面置换算法是操作系统中的重要概念,主要用于解决内存不足的问题。
它通过将当前不需要的页面从内存中移出,以腾出空间给即将到来的页面。
本次实验主要是通过模拟不同页面置换算法的过程,来更好地了解和掌握这些算法的实现原理及其优缺点。
2. 实验过程
本次实验中,我们使用了三种页面置换算法,分别是最优页面置换算法(OPT)、先进先出页面置换算法(FIFO)和最近最久未使用页面置换算法(LRU)。
在模拟的过程中,我们需要先给每个页面设置一个访问时间,然后根据不同算法的实现原理来决定哪个页面被置换出去。
通过实验,我们发现不同的算法在不同情况下的效果也会不同。
比如,当页面访问时间相对均匀分布时,FIFO算法的效果会比较好,而当页面访问时间存在一定规律性时,LRU算法的效果则会更好。
而OPT 算法则需要未来时间的信息,一般情况下难以实现,但是在某些特殊情况下,它也可以发挥出比较好的效果。
3. 实验心得
通过本次实验,我更深入地了解了页面置换算法的实现原理,学会了如何根据不同算法的特点来选择合适的算法来解决内存不足的问题。
在实验过程中,我也学会了如何使用Python编程语言来模拟不同算法的过程,提高了我的编程能力。
通过不断地调试和实验,我还学会了如何发现问题和解决问题的方法,这对我今后的学习和工作都大有裨益。
总之,本次实验不仅加深了我对操作系统中重要概念的理解,也提高了我的编程和分析问题的能力,让我对未来的学习和工作充满信心和热情。
分页置换实验报告

一、实验目的1. 理解分页置换算法的基本原理及其在虚拟内存管理中的作用。
2. 掌握几种常见的分页置换算法(如FIFO、LRU等)的模拟实现方法。
3. 分析不同分页置换算法的性能差异,并评估其在实际应用中的适用性。
二、实验原理分页置换算法是虚拟内存管理中的一种关键技术,其主要目的是在有限的物理内存中模拟更大的内存空间,以满足程序对内存的需求。
当物理内存不足时,系统会根据一定的置换算法选择某些页面进行淘汰,以腾出空间给新的页面。
常见的分页置换算法包括:1. FIFO(先进先出)算法:根据页面进入内存的顺序进行淘汰,即先进入内存的页面先被淘汰。
2. LRU(最近最少使用)算法:淘汰最近一段时间内最长时间未被访问的页面。
3. OPT(最佳置换)算法:淘汰未来最长时间内不再被访问的页面。
三、实验内容1. FIFO算法实现:模拟FIFO算法,记录缺页中断次数和缺页率。
2. LRU算法实现:模拟LRU算法,记录缺页中断次数和缺页率。
3. 性能对比分析:对比FIFO和LRU算法的性能差异,分析其适用场景。
四、实验步骤1. 数据准备:生成一系列页面访问序列,用于模拟分页置换过程。
2. FIFO算法模拟:- 初始化一个固定大小的内存缓冲区。
- 遍历页面访问序列,对于每个页面:- 检查是否已在内存缓冲区中。
- 如果不在,则将内存缓冲区中最先进入的页面淘汰,并将当前页面加入内存缓冲区。
- 记录缺页中断次数。
3. LRU算法模拟:- 初始化一个内存缓冲区,并维护一个访问顺序链表。
- 遍历页面访问序列,对于每个页面:- 检查是否已在内存缓冲区中。
- 如果不在,则将内存缓冲区中最少访问的页面淘汰,并将当前页面加入内存缓冲区。
- 更新访问顺序链表。
- 记录缺页中断次数。
4. 性能对比分析:- 对比FIFO和LRU算法的缺页中断次数和缺页率。
- 分析两种算法的性能差异及其适用场景。
五、实验结果与分析1. FIFO算法:FIFO算法简单易实现,但性能较差。
实验三页面置换算法

操作系统实验报告班级:姓名:学号:实验三:页面置换算法一、实验目的1、熟悉内存分页管理策略。
2、编写OPT、FIFO、LRU,LFU四种置换算法并模拟实现。
3、锻炼知识的运用能力和实践能力。
二、实验内容设计主界面,输入一串系列模拟页面请求,实现以下算法:1) 最佳置换算法(OPT):将以后永不使用的或许是在最长(未来)时间内不再被访问的页面换出。
2) 先进先出算法(FIFO):淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
3) 最近最久未使用算法(LRU):淘汰最近最久未被使用的页面。
4) 最不经常使用算法(LFU)三、代码及运行结果分析#include <stdio.h>#include <stdlib.h>int mSIZE;int pSIZE;static int memery[10]={0};static int page[100]={0};static int temp[100][10]={0};void FIFO();void LRU();void OPT();void print(unsigned int t);void read();void mDelay(unsigned int Delay);int main(){int i,k,code;printf("请输入物理块的个数(M<=10):");scanf("%d",&mSIZE);printf("请输入页面号引用串的个数(P<=100):"); scanf("%d",&pSIZE);puts("请依次输入页面号引用串:");for(i=0;i<pSIZE;i++)scanf("%1d",&page[i]);read();do{puts("输入的页面号引用串为:");for(k=0;k<=(pSIZE-1)/20;k++){for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++){if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))printf("%d\n",page[i]);elseprintf("%d ",page[i]);}}printf("---------------------------------------------\n");printf("* 请选择页面置换算法:\t\t\t *\n");printf("* ----------------------------------------- *\n");printf("* 1.先进先出(FIFO) 2.最近最久未使用(LRU) *\n"); printf("* 3.最佳(OPT) 4.退出*\n");printf("--------------------------------------------\n");printf("请选择操作:[ ]\b\b");scanf("%d",&code);switch(code){case 1:FIFO();break;case 2:LRU();break;case 3:OPT();break;case 4:system("cls");exit(0);default:printf("输入错误,请重新输入:");}printf("按任意键重新选择置换算法:>>>"); getchar();}while (code!=4);getchar();}void read(){int i;for(i=0;i<51;i++)printf("\b");for(i=0;i<50;i++) {mDelay((pSIZE+mSIZE)/2);printf(">"); }printf("获取成功,按任意键进入置换算法选择界面:");getchar(); }void mDelay(unsigned int Delay){unsigned int i;for(;Delay>0;Delay--){for(i=0;i<124;i++){printf(" \b");}}}void print(unsigned int t) {int i,j,k,l;int flag;for(k=0;k<=(pSIZE-1)/20;k++){for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++){if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf("%d\n",page[i]);elseprintf(" %d ",page[i]);}for(j=0;j<mSIZE;j++){for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++) {if(i>=j)printf(" |%d|",temp[i][j]);elseprintf(" | |");}for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++) { for(flag=0,l=0;l<mSIZE;l++)if(temp[i][l]==temp[i-1][l])flag++;if(flag==mSIZE)/*页面在物理块中*/printf(" ");elseprintf(" |%d|",temp[i][j]);}if(i%20==0)continue;printf("\n");}}printf("----------------------------------------\n");printf("缺页次数:%d\t\t",t+mSIZE);printf("缺页率:%d/%d\n",t+mSIZE,pSIZE);printf("置换次数:%d\t\t",t);printf("访问命中率:%d%%\n",(pSIZE-(t+mSIZE))*100/pSIZE); printf("----------------------------------------\n");}/*计算过程延迟*/void compute(){int i;printf("正在进行相关计算,请稍候");for(i=1;i<20;i++){mDelay(15);if(i%4==0)printf("\b\b\b\b\b\b \b\b\b\b\b\b"); elseprintf("...");}for(i=0;i++<30;printf("\b"));for(i=0;i++<30;printf(" "));for(i=0;i++<30;printf("\b"));}void FIFO(){int memery[10]={0};int time[10]={0};int i,j,k,m;int max=0;int count=0;for(i=0;i<mSIZE;i++){memery[i]=page[i];time[i]=i;for(j=0;j<mSIZE;j++) temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++) {for(j=0,k=0;j<mSIZE;j++) {if(memery[j]!=page[i])k++;}if(k==mSIZE){count++;max=time[0]<time[1]?0:1; for(m=2;m<mSIZE;m++) if(time[m]<time[max]) max=m;memery[max]=page[i]; time[max]=i;for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}else{for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}}compute();print(count);}/*最近最久未使用置换算法*/void LRU(){int memery[10]={0};int flag[10]={0}; /*记录页面的访问时间*/ int i,j,k,m;int max=0;int count=0;for(i=0;i<mSIZE;i++){memery[i]=page[i];flag[i]=i;for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++){for(j=0,k=0;j<mSIZE;j++){if(memery[j]!=page[i])k++;elseflag[j]=i;}if(k==mSIZE){count++;max=flag[0]<flag[1]?0:1;for(m=2;m<mSIZE;m++)if(flag[m]<flag[max])max=m;memery[max]=page[i];flag[max]=i; /*记录该页的访问时间*/temp[i][j]=memery[j]; }else{for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; }}compute();print(count);}void OPT(){int memery[10]={0}; int next[10]={0};int i,j,k,l,m;int max;int count=0;for(i=0;i<mSIZE;i++) {memery[i]=page[i];temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++) {for(j=0,k=0;j<mSIZE;j++) {if(memery[j]!=page[i])k++;}if(k==mSIZE){count++;for(m=0;m<mSIZE;m++) {for(l=i+1;l<pSIZE;l++)if(memery[m]==page[l]) break;next[m]=l;}max=next[0]>=next[1]?0:1;for(m=2;m<mSIZE;m++) if(next[m]>next[max]) max=m;for(j=0;j<mSIZE;j++) temp[i][j]=memery[j];}else {for(j=0;j<mSIZE;j++) temp[i][j]=memery[j];}}compute();print(count);}四、实验心得。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告课题:页面淘汰算法专业:班级:学号:姓名:年月日目录一实验目的……………………………………………………错误!未定义书签。
二实验要求 (3)三背景知识 (3)四总体设计 (4)五详细设计……………………………………………………错误!未定义书签。
六运行结果分析 (9)七心得体会 (13)八参考文献 (14)附:源代码 (15)一、实验目的本实验主要对操作系统中请求分页式内存管理及其应用的一些关键算法进行模拟。
学生通过设计与实现Clock算法,能够加强对相应理论的理解,并对了解操作系统内部的基本处理原理与过程也有很多益处。
利用简单的数据结构,模拟实现操作系统中的页面置换机制,通过写程序模拟实现上述三种内存页面置换算法,使学生进一步掌握内存页面置换的方法。
对操作系统中内存的管理有一个实践上的认识。
1、用C语言编写OPT、FIFO、LRU三种置换算法。
2、熟悉内存分页管理策略。
3、了解页面置换的算法。
4、掌握一般常用的调度算法。
5、根据方案使算法得以模拟实现。
6、锻炼知识的运用能力和实践能力。
二、实验要求●设计随机页面序号产生程序,并说明随机的性能和其性能可能对算法的影响●编写页面淘汰算法(FIFO、OPT、LRU)●结果数据的显示或提取●结果数据的分析几点说明:●设计并绘制算法流程,附加说明所需的数据结构●如何标记时间的先后、最久的将来、最久未被使用●描述Clock算法的基本原理、必要的数据结构、算法执行流程图、编码实现。
1)初始化:输入作业可占用的总页框数,初始化置空。
2)输入请求序列:输入一个作业页号访问请求序列,依次占用相应页框,直至全部占用;3)Clock算法:当页框全部占用后,对于后续新的页号访问请求,执行Clock 算法,淘汰1个页面后装入新的页号。
4)显示当前分配淘汰序列:显示淘汰的页号序列。
三、背景知识:在操作系统当中,在进程运行过程中,若其访问的页面不在内存中而需把他们调入内存,但内存已无空闲空间时,为了保证该进程能够正常的运行,系统必须从内存中调出一页程序或数据送到磁盘的兑换区中,但是应该是哪个页面被调出,需根据一定的算法来确定。
通常,我们把这一类的算法称为“页面置换算法”,页面置换算法执行效率的高低,往往直接影响到操作系统的性能。
内存页面置换算法:1、<1> 先进先出调度算法(FIFO)先进先出调度算法根据页面进入内存的时间先后选择淘汰页面。
本算法实现时需要将页面按进入内存的时间先后组成一个队列,每次置换掉最早进入的页面。
这是最早出现的置换算法,该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最长的页面换出,予以淘汰。
该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。
但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO算法并不能保证这些页面不被淘汰。
<2>最近最久未使用的置换算法(LRU)最近最久未使用的置换算法,是根据页面调入内存后的使用情况进行决策的。
由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU 置换算法是选择最近最久未使用的页面予以淘汰。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。
<3> 最佳置换算法(OPT)最佳置换算法是可以说的一种理想的页面置换算法,它是由Belady于1966 年提出的一种理论上的算法。
其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。
采用最佳置换算法,通常可保证获得最低的缺页率。
但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用此算法来评价其它算法。
<4>时钟页面置换算法时钟页面置换算法是把所有的页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面,如图所示。
当发生缺页中断时,算法首先检查表针指向的页面,如果它的R位是0就淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;如果R位是1就清除R位并把表针前移一个位置,重复这个过程直到找到了一个R位为0的页面为止。
四、总体设计●根据要求设计页面淘汰算法的活动图运行程序进入主页面,在正上方,已经通过随机生成函数生成了页面号,在其下方,显示可选项:0、退出程序1、FIFO算法2、OPT算法3、LRU算法。
根据需要,选择相应的法,程序自动生成页面淘汰的先后顺序,以及置换次数和缺页次数,并打印在下方,执行完以后,再次进入主页面,到输入0,退出程序。
●算法流程图FIFO算法流程图:新的指令页面内存中的所有页面time+1载入新页面time=0内存物理块集合已满?已在内存物理块中?内存中所有页面time+1选择time值最大的页面换出否否是是O PT算法流程图新的指令页面载入该页面内存物理块集合已满?已在内存物理块中?对内存中每个页面,向后遍历剩余指令集合,记录每个页面距离再次被利用的页面跨度否否是是选择跨度最大的页面换出L RU算法流程图:新的指令页面内存中的所有页面time+1载入新页面time=0内存物理块集合已满?已在内存物理块中?内存中所有页面time+1选择time值最大的页面换出否否是是该页面time=0五、详细设计(一)、设计思想1、最佳置换算法(OPT)用数组Temppages[]存储当前物理块中页面信息,数组TimeArry[]存储当前在物理块中的页面的获得内存时的时间,当页面不在内存中时,根据当前已获得物理块数的页面在所有的页面当中将来不在请求内存或者很少请求内存的情况进行置换2、先进先出算法(FIFO)用数组Temppages[]存储当前物理块中页面信息,变量temp记录内存中物理块页面置换状态,每进行一次置换,页面置换状态变化,便于下一次的置换。
3、最近最久未使用算法(LRU)用数组Temppages[]存储当前物理块中页面信息,数组TimeArry[]存储当前在物理块中的页面的获得内存时的时间,当页面不在内存中时,选择TimeArry[]数组中值最小并且对应物理块中的页面进行置换。
(二)、设计步骤首先根据程序要求,我们分别定义两个宏,用以存放我们的物理块数目以及页面数目,再定义一个结构体,用以物理块的存储,代码如下:#define MemPageCount 4#define InstructionCount 20struct page{int serial; //页面号int time; //时间计数}mempage[MemPageCount];其次,建立主函数,根据程序需要,定义相应的变量,建立switch语句,用以算法的选择,部分定义如下:int i,j,k,m,n; //指令页面集合,可以考虑让页面指令集合随机生成int instruction[InstructionCount];int mem_counter; //内存页面集合计数器int switch_counter; //置换次数最后,根据算法流程图,实现相应算法的代码编写。
(三)、算法流程设计主函数流程:STEP1:输入分配的页框数,页面访问次数和要访问的页面号序列STEP2:内存页面初始化。
内存中页面的数据结构为单循环链表,含有页号值yehao和访问位值a。
开始时页号均为-1,访问位为0.STEP3:测试数据。
具体算法是依要访问的页面号,调用find()函数查找是否已经存在于内存中。
若存在,则修改其访问位为1.若不存在,触发缺页中断,调用tihuan()函数。
最后,打印当前内存状态。
如此循环直至测试串都访问完毕。
1)主要函数实现a)Makenode(double)函数:用于初始化一个节点。
b)Find(double)函数:依据输入的页号,查询内存中是否已存在此页面。
若存在返回值1,不存在返回值0.c)Tihuan(double)函数:在发生缺页中断时,时钟指针查找访问位为0的页面进行替换,指针扫过的页面访问位置0,新加入的页面访问位置1。
替换后指针下移。
d)Print_state()函数:打印当前内存中存在的页面的状态以及当前时钟指针所指向的页面位置。
2)测试数据估计输入:输入分配的页框数3输入页面访问次数15输入要访问的页面号序列3 4 2 6 4 3 7 4 3 6 3 4 8 4 6输出(仅最后一项):3)结果分析以下是clock算法对应输入页面号序列3 4 2 6 4 3 7 4 3 6 3 4 8 4 6的分析表六、运行结果分析:a)开始界面2、采用随机数产生的结果2、采用自定义页面信息产生结果自定义页面数为:15 物理块数为:4页面序列为:1 2 3 4 5 6 7 8 9 4 5 6 7 0 8根据结果,我们不难发现,OPT算法,是三种算法中性能最好的,它的置换次数最少,LRU次之,,不过性能最差的还是FIFO,由于缺页率=缺页次数/总的页面数,所以我们不难发现,随着物理块数的增加,缺页率都相应有所增加,但是OPT算法的增加较为明显,即产生了belady现象。
七、心得体会:这次课程设计,让我对算法的编写更加的熟练,同时更加了解页面置换的相关算法,也提高了我对算法设计的严密性,对以后的程序设计有很大帮助。
我们不仅对常用的算法进行了编写,还对一些理想的算法也进行了编写,并且通过适当的方法,得以了验证。
就该程序而言,随机性使得程序出现了更多的可能性,为我们验证算法提供很大的方便,电脑自动分配,大大的节约了我们的时间,但是我们通过实验不难发现,如果所设的页面项目过大,也会影响我们算法的性能执行效率。
对我们所涉及的算法,让我有很大的感触。
在FIFO 算法中,无论有无发生缺页或者置换,都需要对每个在内存中的页面的time 值进行增加操作,以保持最先进入的那个页面的time 值是最大的;一个新进来的页面,其time值设置为0。
当然,该算法也可以通过队列结构来实现,利用队列的先进先出(FIFO)特性完成,无需设置time字段。
distance 用于记录内存物理块集合中每个页面距离再次被使用的页面跨度,缺省值为9999,如果某个页面在后续指令集合中不再出现,则用最大值9999 缺省取代;如果页面再次被使用,则两次使用所跨的页面数,为页面跨度。
用最大页面跨度表示以后永不使用或未来最长时间内不再被访问。
在LRU 算法中,无论是否发生缺页或者置换,除了命中(刚刚被访问过的页面)页面time 值清零之外,其它所有内存中的页面的time 值都加一,以保证最近刚刚被访问的页面的time 值最小,相应time 值最大的页面就是最近最久没有被访问的页面。