面淘汰算法实验报告.docx
- 文档编号:23721633
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:28
- 大小:661.84KB
面淘汰算法实验报告.docx
《面淘汰算法实验报告.docx》由会员分享,可在线阅读,更多相关《面淘汰算法实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
面淘汰算法实验报告
操作系统实验报告
课题:
页面淘汰算法
专业:
班级:
学号:
姓名:
年月日
一、实验目的
本实验主要对操作系统中请求分页式内存管理及其应用的一些关键算法进行模拟。
学生通过设计与实现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算法流程图:
ØOPT算法流程图
ØLRU算法流程图:
五、详细设计
(一)、设计思想
1、最佳置换算法(OPT)
用数组Temppages[]存储当前物理块中页面信息,数组TimeArry[]存储当前在物理块中的页面的获得内存时的时间,当页面不在内存中时,根据当前已获得物理块数的页面在所有的页面当中将来不在请求内存或者很少请求内存的情况进行置换
2、先进先出算法(FIFO)
用数组Temppages[]存储当前物理块中页面信息,变量temp记录内存中物理块页面置换状态,每进行一次置换,页面置换状态变化,便于下一次的置换。
3、最近最久未使用算法(LRU)
用数组Temppages[]存储当前物理块中页面信息,数组TimeArry[]存储当前在物理块中的页面的获得内存时的时间,当页面不在内存中时,选择TimeArry[]数组中值最小并且对应物理块中的页面进行置换。
(二)、设计步骤
首先根据程序要求,我们分别定义两个宏,用以存放我们的物理块数目以及页面数目,再定义一个结构体,用以物理块的存储,代码如下:
#defineMemPageCount4
#defineInstructionCount20
structpage
{
intserial;//页面号
inttime;//时间计数
}mempage[MemPageCount];
其次,建立主函数,根据程序需要,定义相应的变量,建立switch语句,用以算法的选择,部分定义如下:
inti,j,k,m,n;//指令页面集合,可以考虑让页面指令集合随机生成
intinstruction[InstructionCount];
intmem_counter;//内存页面集合计数器
intswitch_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
输入要访问的页面号序列
342643743634846
输出(仅最后一项):
3)结果分析
以下是clock算法对应输入页面号序列342643743634846的分析表
六、运行结果分析:
a)开始界面
2、采用随机数产生的结果
2、采用自定义页面信息产生结果
自定义页面数为:
15物理块数为:
4
页面序列为:
123456789456708
根据结果,我们不难发现,OPT算法,是三种算法中性能最好的,它的置换次数最少,LRU次之,,不过性能最差的还是FIFO,由于缺页率=缺页次数/总的页面数,所以我们不难发现,随着物理块数的增加,缺页率都相应有所增加,但是OPT算法的增加较为明显,即产生了belady现象。
七、心得体会:
这次课程设计,让我对算法的编写更加的熟练,同时更加了解页面置换的相关算法,也提高了我对算法设计的严密性,对以后的程序设计有很大帮助。
我们不仅对常用的算法进行了编写,还对一些理想的算法也进行了编写,并且通过适当的方法,得以了验证。
就该程序而言,随机性使得程序出现了更多的可能性,为我们验证算法提供很大的方便,电脑自动分配,大大的节约了我们的时间,但是我们通过实验不难发现,如果所设的页面项目过大,也会影响我们算法的性能执行效率。
对我们所涉及的算法,让我有很大的感触。
在FIFO算法中,无论有无发生缺页或者置换,都需要对每个在内存中的页面的time值进行增加操作,以保持最先进入的那个页面的time值是最大的;一个新进来的页面,其time值设置为0。
当然,该算法也可以通过队列结构来实现,利用队列的先进先出(FIFO)特性完成,无需设置time字段。
distance用于记录内存物理块集合中每个页面距离再次被使用的页面跨度,缺省值为9999,如果某个页面在后续指令集合中不再出现,则用最大值9999缺省取代;如果页面再次被使用,则两次使用所跨的页面数,为页面跨度。
用最大页面跨度表示以后永不使用或未来最长时间内不再被访问。
在LRU算法中,无论是否发生缺页或者置换,除了命中(刚刚被访问过的页面)页面time值清零之外,其它所有内存中的页面的time值都加一,以保证最近刚刚被访问的页面的time值最小,相应time值最大的页面就是最近最久没有被访问的页面。
上述两种算法,是我们在进程调度中使用最多的两种,你可能会问?
为什么要使用进程调度,因为当我们的程序在运行时,若所访问的页面不再内存而需把它调入内存,但内存已无空闲空间,这时,为了保证该程序能正常运行,系统就必须从内存中调出一页程序或数据送到磁盘的兑换区中,但应将那个页面调出,我们就必须根据一定的算法来实现。
所以,一个页面置换算法的好坏,将直接影响到我们系统的性能。
相比较而言,我们最常用的是LRU算法,因为它是根据页面调入内存后的使用情况就行决策的,比FIFO算法要好很多。
通过与其他算法的比较,加深对clock算法的理解,也了解了他们的异同之处。
Clock算法其实是一种改进的第二次机会算法,它通过设置访问位,找到最早最不常访问的页面,即标号为0的页面。
之所以叫clock算法,依我理解是将内存中的排列顺序附上时间的概念,clock指针扫过的页面要将他们1置0就是基于这个思想,因为他们都是没被访问的,且在时钟上的排列按照访问时间顺序。
这样就保证了每次替换的都是最早进来的且不最常访问的页面。
八、参考文献
【1】《计算机操作系统》(第三版)汤小丹、梁红兵、汤子瀛、哲凤屏等西安电子科技大学出版社2007-05
【2】《C++Primer中文版》(第4版)(美)StanleyB.Lippman 等著 李师贤等译.人民邮电出版社,2006-03-01
【3】《C++Primer习题解答》(第4版)蒋爱军,李师贤,梅晓勇 著人民邮电出版社2007-02-01
【4】《现代操作系统》(原书第3版)塔嫩鲍姆(Tanenbaum.A.S),陈向群,马洪兵 著机械工业出版社2009-07-01
【5】《计算机操作系统教程》张尧学,史美林,张高清华大学出版社2006-10-01
【6】《数据结构(STL框架)》王晓东 著清华大学出版社2009-09-01
附:
源代码
#include
#include
#include
#defineM_size100
intpageNum=0;///全局变量页面数
intpages[M_size];///存储页号
intTemppages[M_size];///辅助数组
intTimeArry[M_size];//记录页在内存中的时间
intmethod;///产生结果的方法
intAlgorithmStyle;//辅助变量,用于选择算法类型
intBlock;//记录物理块数
intstart;//辅助变量
voidInition()//初始化函数
{
inti;
intt=time(NULL);///产生随机数种子
srand(t);///用t初始化随机数种子
pageNum=rand()%10+8;///随机产生4-14之内的整数,保证页面数在4-14之内
for(i=0;i { pages[i]=rand()%10+1;///初始化页号,初始值在1-10之内 } Block=4;//初始化物理块数位3 } voidprintDefaltResult()///缺省参数显示 { inti; printf("缺省页面数为: %d\n",pageNum); printf("缺省页号分别为: "); for(i=0;i { printf("%d",pages[i]); } printf("\n"); printf("可用物理块数为: %d\n",Block); printf("按任意键继续: "); getchar(); } voidPrintCustomInfo()//显示用户自定义参数 { inti; printf("自定义页面数为: %d\n",pageNum); printf("自定义页号分别为: "); for(i=0;i { printf("%d",pages[i]); } printf("\n"); printf("可用物理块数为: %d\n",Block); printf("按任意键继续: \n"); getchar(); } voidprintUserInfo()///显示个人信息 { system("color0B"); printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃页面淘汰算法┃\n"); printf("┃学号: ┃\n"); printf("┃班级: ┃\n"); printf("┃姓名: ┃\n"); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("按任意键开始操作: "); getchar(); system("cls"); system("color0B"); } voidChioceDealmethod()//选择解决问题的方法"1"选择缺省值,"2"选择自定义值 { printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃1、使用默认值产生结果2、自定义页数和页号┃\n"); printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n请输入你的选择: \n"); scanf("%d",&method); system("color0F"); } voidPrintNotWithoutPages()//显示一定不用换页的部分 { start=Block; inti,j,k=0,key=0; for(i=0;i { intflag=0; for(j=0;j<=i-1;j++) { if(Temppages[j]==pages[i]) { TimeArry[j]=i; flag=1; start=start+1; key++; } } if(flag==0) { TimeArry[k]=i; Temppages[k]=pages[i]; k++; for(j=0;j<=i-key;j++) { printf("%-7d",Temppages[j]); } printf("\n"); } } } voidPrintResult()//显示每次换页后的结果 { inti; for(i=0;i { printf("%-7d",Temppages[i]); } printf("\n"); } voidFIFODealQuestion()//先进先出算法 { inti,j; intWithOutPages=0;//记录缺页数 printf("FIFO(先进先出算法)结果显示: \n"); PrintNotWithoutPages(); inttemp=0; for(i=start;i { if(temp==Block) { temp=0; } intkey=0; for(j=0;j { if(Temppages[j]==pages[i]) { key=1; break; } } if(key==0)//如果不在 { Temppages[temp]=pages[i]; temp++; WithOutPages++; PrintResult(); } } printf("置换次数为: %d,页面总数为: %d,置换率为: ",WithOutPages,pageNum); doublere=((double)WithOutPages)/((double)pageNum); printf("%.2lf\n",re); printf("缺页次数为: %d,页面总数为: %d,缺页率为: ",WithOutPages+Block,pageNum); re=((double)(WithOutPages+Block))/((double)pageNum); printf("%.2lf\n",re); } voidLRUDealQuestion()//最近最久未使用算法 { inti,j; intWithOutPages=0;//记录缺页数 printf("LRU(最近最久未使用算法)结果显示: \n"); PrintNotWithoutPages(); for(i=start;i { intkey=0; for(j=0;j { if(Temppages[j]==pages[i]) { key=1; TimeArry[j]=i;//更新时间 break; } } if(key==0)//若该页不在内存中 { WithOutPages++; intmin=TimeArry[0]; intflag=0; for(j=1;j { if(min>TimeArry[j]) { min=TimeArry[j];//找到最久的页面 flag=j; } } TimeArry[flag]=i;//记录时间 Temppages[flag]=pages[i]; PrintResult(); } } printf("置换次数为: %d,页面总数为: %d,置换率为: ",WithOutPages,pageNum); doublere=((double)WithOutPages)/((double)pageNum); printf("%.2lf\n",re); printf("缺页次数为: %d,页面总数为: %d,缺页率为: ",WithOutPages+Block,pageNum); re=((double)(WithOutPages+Block))/((double)pageNum); printf("%.2lf\n",re); } voidOPTDealQuestion() { inti,j,l; intWithOutPages=0;//记录缺页数 printf("OPT(最佳置换算法)结果显示: \n"); PrintNotWithoutPages(); for(i=start;i { intkey=0; for(j=0;j { if(Temppages[j]==pages[i]) { TimeArry[j]=i; key=1; break; } } if(key==0)//如果该页不在内存中 { WithOutPages++;//缺页数加1 //得到各物理块下一次访问的时间 for(j=0;j { for(l=i+1;l { if(Temppages[j]==pages[l]) { break; } } TimeArry[j]=l; } //得到下一次访问时间最长的一个页面,将当前页与其换掉 intmin=TimeArry[0]; intflag=0; for(j=1;j { if(TimeArry[j]>min)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 淘汰 算法 实验 报告