C语言 页面淘汰算法 OPT FIFO LRU CLOCK.docx
- 文档编号:29524871
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:17
- 大小:167.65KB
C语言 页面淘汰算法 OPT FIFO LRU CLOCK.docx
《C语言 页面淘汰算法 OPT FIFO LRU CLOCK.docx》由会员分享,可在线阅读,更多相关《C语言 页面淘汰算法 OPT FIFO LRU CLOCK.docx(17页珍藏版)》请在冰豆网上搜索。
C语言页面淘汰算法OPTFIFOLRUCLOCK
《操作系统原理》
上机作业(报告)
作业:
页面淘汰算法
作业编号
6
题目
页面淘汰/置换算法
作业要求
【题目要求】通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
针对一个页框,根据实验数据,以OPT算法为参考,研究FIFO页面淘汰算法、LRU页面淘汰以及CLOCK算法针对同一批实验数据的缺页率,以及研究在不同页框设置下的各算法缺页率表现情况。
页面引用序列为:
4,3,2,1,4,3,5,4,3,2,1,5
(1)固定分配局部置换情况下,驻留集大小为3,针对该内存页面引用序列模拟各算法的运行过程,并计算缺页率。
(2)模拟驻留集大小为4和5的情况下各算法的运行过程和缺页率。
其菜单如下:
*************内存分配和回收***********
=================================
0.退出
1.OPT算法实现
2.LRU算法实现
3.FIFO算法实现
4.CLOCK算法
5.显示缺页率对比表
=================================
【实习要求】可选编程语言:
C/C++/Java/C#/Python;
实现在同一个程序文件中(C/C++);
请适当注释;
【实现提示】
所需变量
N:
程序执行需要访问的页面数
Msize:
内存中可容纳的页数
lack:
在一次页面走向序列中用来统计缺页次数
rate:
缺页次数/总页数
变量声明如下图所示:
队列结构
页面引用序列pages[N]和内存容量Memory[m]均用简单的数据结构线性表实现,其声明如图所示:
【选做内容】
改进型CLOCK算法实现。
构造一个页面引用序列,并出现Belady现象。
报告正文(运行屏幕截图及源代码)
一.截图。
二.附录。
#include"stdio.h"
#defineN30//最大页数
staticintMsize;//内存容页数
staticintlacknum;//缺页数
staticintpages[N]={4,3,2,1,4,3,5,4,3,2,1,5};
staticintmemery[10];
voidInitial()
{
inti;
for(i=0;i<10;i++)
{
memery[i]=0;
}
lacknum=0;
}
intTo_left(intindex,intpage)//计算之前的本页到现在已经多久了
{
inti=index-1;
while(i>=0)
{
if(pages[i]==page)
{
returnindex-i;
}
i--;
}
return-1;
}
intTo_right(intindex,intpage)//计算本页从现在到之后的需要多久
{
inti=index+1;
while(pages[i]!
=0&&i<20)
{
if(pages[i]==page)
{
returni-index;
}
i++;
}
return10000;
}
intIs_Lack()//判断内存是否没装满页,并返回空位的index
{
inti;
for(i=0;i { if(memery[i]==0) { returni; } } return-1; } intIs_exist(intpage)//判断改page是否已在内存中,若有返回index { inti; for(i=0;i { if(memery[i]==page) { returni; } } return-1; } voidOPT()//最佳置换算法 { inti,j,k,longest_page_index; for(i=0;pages[i]! =0;i++) { if(Is_Lack()! =-1)//如果内存还没装满 { j=Is_Lack();//取出memery里的空位index if(Is_exist(pages[i])! =-1)//如果当前page已在memery中 { continue; } else//并不在memery中 { memery[j]=pages[i]; continue; } } else//memery已装满,进行淘汰页面 { if(Is_exist(pages[i])! =-1) { continue; } intl,m,n; longest_page_index=0; n=0; for(l=0;l { m=To_right(i,memery[l]); if(m>n) { n=m; longest_page_index=l; } } memery[longest_page_index]=pages[i]; lacknum++; } } } voidLRU()//最近最久置换算法 { inti,j,k,longest_page_index; for(i=0;pages[i]! =0;i++) { if(Is_Lack()! =-1)//如果内存还没装满 { j=Is_Lack();//取出memery里的空位index if(Is_exist(pages[i])! =-1)//如果当前page已在memery中 { continue; } else//并不在memery中 { memery[j]=pages[i]; continue; } } else//memery已装满,进行淘汰页面 { if(Is_exist(pages[i])! =-1) { continue; } intl,m,n; longest_page_index=0; n=0; for(l=0;l { m=To_left(i,memery[l]); if(m>n) { n=m; longest_page_index=l; } } memery[longest_page_index]=pages[i]; lacknum++; } } } intGet_First_Come_Page_Index(int*timer)//找到内存中最先来的其index { inti,min=10000,index; for(i=0;i { if(min>timer[i]) { min=timer[i]; index=i; } } returnindex; } voidFIFO()//先进先出算法 { inttimer[10];//用于记录内存中各页进内存的时间 inti,j,k; for(i=0;pages[i]! =0;i++) { inttemp_i=Is_exist(pages[i]); if(Is_Lack()! =-1)//如果内存还没装满 { j=Is_Lack();//取出memery里的空位index if(temp_i! =-1)//如果当前page已在memery中 { timer[temp_i]=i; continue; } else//并不在memery中 { memery[j]=pages[i]; timer[j]=i; continue; } } else//memery已装满,缺页中断,进行淘汰页面 { if(temp_i! =-1) { timer[temp_i]=i; continue; } else { intmin_timer_index=Get_First_Come_Page_Index(timer); memery[min_timer_index]=pages[i]; timer[min_timer_index]=i; } lacknum++; } } } intGet_Index_And_Update_Flag(int*flag) { inti,index; for(i=0;i { if(flag[i]==1) { continue; } elseif(flag[i]==0) { flag[i]=1; returni; } } //如果找了一圈都没找到,flag全变为0 for(i=1;i { flag[i]=0; } flag[0]=1; return0; } voidCLOCK() { intflag[10];//用于记录内存中各页访问情况 inti,j,k; for(i=0;pages[i]! =0;i++) { inttemp_i=Is_exist(pages[i]); if(Is_Lack()! =-1)//如果内存还没装满 { j=Is_Lack();//取出memery里的空位index if(temp_i! =-1)//如果当前page已在memery中 { continue; } else//并不在memery中 { memery[j]=pages[i]; flag[j]=1; continue; } } else//memery已装满,缺页中断,进行淘汰页面 { if(temp_i! =-1)//内存里有此页 { continue; } else//内存里无此页 { inttemp_index=Get_Index_And_Update_Flag(flag); memery[temp_index]=pages[i]; } lacknum++; } } } intmain() { intflag=0; Msize=3;//默认值 printf("请输入内存驻留集: \n"); scanf("%d",&Msize); while (1) { printf("\n\n*************内存分配和回收***********\n"); printf("=================================\n"); printf("0.退出\n1.OPT算法实现\n2.LRU算法实现\n3.FIFO算法实现\n4.CLOCK算法\n5.显示缺页率对比表\n"); printf("=================================\n"); printf("请输入: \n"); scanf("%d",&flag); switch(flag) { case0: { return0; } case1: { Initial(); OPT(); printf("OPT算法缺页率为: %f",(lacknum+Msize)*1.0/12); break; } case2: { Initial(); LRU(); printf("LRU算法缺页率为: %f",(lacknum+Msize)*1.0/12); break; } case3: { Initial(); FIFO(); printf("FIFO算法缺页率为: %f",(lacknum+Msize)*1.0/12); break; } case4: { Initial(); CLOCK(); printf("CLOCK算法缺页率为: %f",(lacknum+Msize)*1.0/12); break; } case5: { inta,b,c,d; Initial(); OPT(); printf("OPT算法缺页率为: %f\n",(lacknum+Msize)*1.0/12); Initial(); LRU(); printf("LRU算法缺页率为: %f\n",(lacknum+Msize)*1.0/12); Initial(); FIFO(); printf("FIFO算法缺页率为: %f\n",(lacknum+Msize)*1.0/12); Initial(); CLOCK(); printf("CLOCK算法缺页率为: %f\n",(lacknum+Msize)*1.0/12); //printf("OPT算法缺页率: \t%f\nLRU算法缺页率: \t%f\nFIFO算法缺页率: \t%f\nCLOCK算法缺页率: \t%f",(a+Msize)*1.0/12,(b+Msize)*1.0/12,(c+Msize)*1.0/12,(d+Msize)*1.0/12); break; } default: { printf("输入不合法,请重新输入! \n"); } } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 页面淘汰算法 OPT FIFO LRU CLOCK 语言 页面 淘汰 算法