Linux环境下几种内存调度算法模拟.docx
《Linux环境下几种内存调度算法模拟.docx》由会员分享,可在线阅读,更多相关《Linux环境下几种内存调度算法模拟.docx(17页珍藏版)》请在冰豆网上搜索。
Linux环境下几种内存调度算法模拟
课程设计(大作业)报告
课程名称:
操作系统
设计题目:
Linux环境下几种内存调度算法模拟
院系:
信息学院
班级:
2012级计算机科学与技术1班
设计者:
赵泽金
学号:
************
******
设计时间:
2015.1.12—2015.1.16
昆明学院
昆明学院课程设计(大作业)任务书
姓名:
赵泽金院(系):
信息学院
专业:
计算机科学与技术学号:
************
任务起止日期:
2015.1.12—2015.1.16
课程设计题目:
Linux环境下几种内存调度算法模拟
课程设计要求及任务描述:
要求:
(1)按指定时间及地点参加课程设计。
(2)通过本次课程设计,能加深理解设计项目使用的相关原理。
(3)根据项目内容完成课程设计。
(4)在指定时间内提交设计结果及设计报告。
任务:
(1)选择其中两种算法的原理进行分析
①FIFO内存调度算法的原理
②内存调度算法的原理
(2)设计两种算法的流程图
①设计FIFO算法的流程图。
②OPT算法设计流程图。
(3)使用Vi编写实现两种算法的程序
①FIFO内存调度算法的代码。
②内存调度算法的代码。
(4)结果分析
①分析设计结果是否达到预期目标。
②针对同一访问序列比较两种算法的缺页率。
工作计划及安排:
第一天上午:
教师讲解原理及课程设计要求和任务。
第一天下午:
原理学习、任务分析。
第二天:
流程图设计。
第三天:
代码编写。
第四天:
代码编写。
第五天:
提交设计结果及设计报告。
指导教师签字
年月日
课程设计(大作业)成绩
学号:
201211010129姓名:
赵泽金指导教师:
段玻
课程设计题目:
Linux环境下几种内存调度算法模拟
完成情况总结:
通过这次课程设计我对先进先出FIFO和OPT算法的实现方法有了很多的了解。
当然,在编程过程中,也遇到了很多不易解决的问题。
诸如:
在FIFO内存调度算法中判断该页面是否已在队列内,若在队列内,不执行任何操作,若不在队列内。
则执行以下操作判断队列是否已满,若队列未满,直接把该页面号存入队列。
以及对于缺页率的概念不清楚不懂得求缺页率,而且在画流程图时对软件的不熟悉,让我在课程设计中遇到很多阻碍,在老师、同学的帮助下以及自己多方面查阅资料,顺利的完成了这次课程设计。
通过这次课程设计使我体会到了思路的重要性,一个程序如果有好的思路计划,好的设计才能够顺利进行。
而且这次课程设计使我更加了解算法的调度过程,完善了很多我以前不懂的算法的调度知识。
指导教师评语:
成绩:
填表时间:
指导教师签名:
课程设计(大作业)报告
一、两种算法的原理分析
1.FIFO内存调度算法的原理
先进先出算法选择在内存中驻留时间最长的页面予以淘汰,即先进入内存的页面先淘汰。
其优点是算法实现简单,只须把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,使该指针总是指向最先进入内存的页面。
缺点是算法与进程的实际运行规律不相适应,因为进程中的某些页面经常被访问,但先进先出置换算法不能保证这些页面不被淘汰。
2.OPT最佳置换算法的原理
当要调入一新页而必须淘汰一旧页时,最佳置换算法是所淘汰的页是以后不再使用的,或者是以后相当长的时间内不会使用的。
该算法的优点是保证获得最低的缺页率,该算法的缺点是无法预知一个进程在内存的若干个页面,哪个在未来最长时间内不再被访问。
OPT算法即最佳优先算法,实质是通过调页功能和页面置换功能,陆续把即将要运行的页面调入内存,并且把暂时不运行的页面从内存在删除,置换时以页面为单位,算出缺页次数和缺页率,缺页数用diseffect表示,页面序列数m,初始值diseffect=0,缺页率=diseffect/m。
用C语言设计OPT算法的程序,可以模拟实现算法,在理论联系实际的基础上,分析各个OPT页面置换算法的直接访问或是缺页中断,然后替换的过程。
为了能实现OPT请求调页和置换功能,在VC++6.0上编程模拟实现。
该算法选择永不使用的或是在最长时间内不再被访问的页面进行置换,这是理想化算法,具有最好的性能,淘汰访问串中将来再也不出现的或者是在离当前最远的位置上出现的页,这样淘汰掉该页将不会造成因需要访问该页又立即把它调入的现象。
这种算法难以实现,因为它要求必须预先知道每一个进程的访问串。
实验中在对操作系统的整体把握上,将操作系统的OPT算法用于实践中去,模拟出页面调度算法得出缺页率。
二、两种算法的流程图表示
1.FIFO算法的流程图
2.OPT最佳置换算法的流程图
三、两种算法的实现代码
1.FIFO内存调度算法的代码
#include
usingnamespacestd;
intpagenum=0;///内存的页面数
inttotal=0;///要访问的叶面总数
intlacknumber=0;///缺页的总数
voidmain()
{intarray[1][20];//0代表没有内容
for(inty=0;y<2;y++)
for(intx=0;x<20;x++)
{
array[y][x]=-1;
}
intseque[20]={0};
cout<<"请输入内存的页面数:
";
cin>>pagenum;
cout<<"请输入页面的访问顺序(输入-1结束):
";
for(inti=0;i<20;i++)
{intnum;
cin>>num;
if(num!
=-1)
{seque[i]=num;
total++;
}
else
{seque[i]=num;break;}
}
cout<<"总的页面数为"<intj=0;
for(i=0;i{
if(i{
array[0][i]=seque[i];
cout<<"页面"<cout<<"缺页此时页面内容为";
for(intj=0;j{cout<cout<<"(-1代表没有内容)"<}cout<intkk=0;
for(i=pagenum;i{
intflag=0;
for(intk=0;k{
if(array[0][k]==seque[i])
{
flag=1;break;
}
}
cout<if(flag==1)
{
cout<<"页面"<for(intj=0;j{
cout<}
}
cout<if(flag==0)
{
inttem=array[0][kk];
array[0][kk]=seque[i];
cout<<"页面"<cout<<"缺页页面"<cout<<"此时页面内容为";
for(intj=0;j{
cout<}
cout<kk++;
lacknumber++;//缺页数
if(kk==pagenum)
{
kk=0;
}
}
}
lacknumber=pagenum+lacknumber;
cout<<"缺页率="<}
2、OPT最佳置换算法的代码
#include
#include
#defineN100
#defineM10000
typedefstruct{
intpagenum;
intframenum;
intstatus;//若status=0则不在内存
}PAGE;
typedefstruct{
intpagenum;
intframenum;
intstatus;//若status=0则空闲
}STORAGE;
voidOPT();
voiddownload();
voiddesignBy();
voidmDelay(unsignedintDelay);
voiddownload()
{
//inti;
printf("╔═════════════════════╗\n");
printf("║等待进入算法界面...║\n");
printf("╚═════════════════════╝\n");
printf("Loading...\n");
mDelay(2000);
printf("\0");
}
voidmDelay(unsignedintDelay)//延时
{
unsignedinti;
for(;Delay>0;Delay--)
{
for(i=0;i<124;i++)
{
printf("\b");
}
}
}
/*显示设计者信息*/
voiddesignBy()
{
system("cls");//清屏
system("colorFD");
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃课程设计:
OPT页面置换算法┃\n");
printf("┃┃\n");
printf("┃┃\n");
printf("┃学号:
201211010129┃\n");
printf("┃┃\n");
printf("┃┃\n");
printf("┃姓名:
赵泽金┃\n");
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
}
voidOPT(intn,intm,STORAGEstorage[N],PAGEpage[M])
{
inti,j,k,full=0,diseffect=0,time[M],base=0,equal[N],times=0;//若full=n则内存满,time[M]是为实现置换所设置的page[M]的备份数据栈
intt;
for(i=0;i{
time[i]=page[i].pagenum;
}//备份page[M]
printf("当前内存中的页(-1代表无页):
");
for(j=0;jprintf("%d\t",storage[j].pagenum);
printf("\n");
for(i=0;i{
for(j=0;j{
if(storage[j].pagenum==page[i].pagenum)
{
page[i].framenum=storage[j].framenum;
page[i].status=1;
base++;//从栈中删除已访问的页
printf("直接访问,页%d已在帧%d中",page[i].pagenum,page[i].framenum);
}//该页在内存,直接访问
}
if(page[i].status==0)
{
diseffect++;
if(full{
for(j=0;j{
if(storage[j].status==0)
{
storage[j].pagenum=page[i].pagenum;
storage[j].status=1;
page[i].framenum=storage[j].framenum;
page[i].status=1;
base++;//从栈中删除已访问的页
printf("缺页中断,页%d装入帧%d中",page[i].pagenum,page[i].framenum);
full++;
break;
}
}
}//有空闲页帧,调入内存并访问相关指令
else
{
for(t=base+1;t{
times=0;
for(k=0;kif(storage[k].pagenum==time[t])
{
equal[k]=1;break;
}
for(k=0;kif(equal[k]==1)
times++;
if(times==n-1)
break;
}
for(k=0;k{
if(equal[k]!
=1)
j=k;
elseequal[k]=0;//清零
}
printf("缺页中断,页%d置换出页%d",page[i].pagenum,storage[j].pagenum);
page[i].framenum=storage[j].framenum;
storage[j].pagenum=page[i].pagenum;//取出页
page[i].status=1;
base++;//从栈中删除已访问的页
}//无空闲的页帧,置换出老页
}//缺页中断
printf("\t\t当前内存中的页:
");
for(j=0;jprintf("%d\t",storage[j].pagenum);
printf("\n");
}
printf("\n\n");
printf("缺页率为:
%.3f\n\n",(float)diseffect/m);
}
voidmain()
{
intn,m,i;
PAGEpage[M];
STORAGEstorage[N];
designBy();/*显示设计者信息后开始*/
download();
//mDelay(1500);
system("cls");
system("color0E");
printf("分配的内存页帧:
\n");
scanf("%d",&n);
for(i=0;i{
storage[i].framenum=i;
storage[i].pagenum=-1;
storage[i].status=0;
}
printf("访问的页面序列数:
\n");
scanf("%d",&m);
printf("访问的页面序列:
\n");
for(i=0;i{
scanf("%d",&page[i].pagenum);
page[i].status=0;
}
OPT(n,m,storage,page);
}
四、结果分析
1.分析设计结果是否达到预期目标
(1)在计算缺页率时,由于访问页面次数不是固定的,得到的缺页率可能是一个无限循环的小数,因此经过在网上查找相关资料后用,用一个方法即可只输出小数点后两位。
(2)在增加了手动输入索引号后,要再次使用算法时会出现异常,经过加入异常捕获后,就可以循环输入索引号并使用算法了。
FIFO运行结果:
2.OPT运行结果:
(1)输入以下的页面序列,定义物理块数为3,按照表格的分析,可得缺页数为5,则缺页率=5/12=0.417,验证和程序设计的结果一致。
(-1代表缺页)
页
面
走
向
2
1
2
3
4
2
3
5
3
2
5
2
缺页置换
-1
-1
-1
-1
4
-1
2
2
2
2
2
2
2
2
2
2
2
2
-1
-1
1
1
1
4
4
4
5
5
5
5
5
-1
-1
-1
-1
3
3
3
3
3
3
3
3
3
(2)如下图
(1)为初始界面,显示学号姓名延时2000ms,然后清屏显示程序主界面,如图
(2)所示,依次按提示输入物理块号,页面序列数,并显示缺页率。
图
(1)初始界面
图
(2)操作界面
五、实验总结及心得体会
实验总结:
在本次课程设计中,我对FIFO和OPT两种内存调度算法的原理和实现方式有了更多的了解。
这次课程设计使我体会到了思路的重要性,一个程序如果有好的思路计划,好的设计才能够顺利进行。
而且这次课程设计使我更加了解算法的调度过程,完善了很多我以前不懂的算法的调度知识。
通过对两种内存调度算法的模拟实现,对比运行结果,发现对于同一访问序列,OPT算法和FIFO算法都各有优势。
在linux中调试和运行程序,对linux中的使用有了更多的认识,尤其是在linux中实现文件的共享这一功能,避免了每次都在Vi中重复输入代码,减少了工作量。
而且在画流程图时,要了解画流程图的软件且要读懂源代码,才能顺利正确的画出两种算法的流程图。
通过本次课程设计,我对以前学过的知识有了更深的记忆和理解,特别是对linux中的各种命令的使用更加熟练,也学到了很多新的有用的知识。
心得体会:
在这个课程设计过程中,很多时候往往由于不细心在写程序代码时一些单词拼写错误,字母的大小写不注意,程序的格式出错。
都会使得程序无法调试成功,操作不当都会使得最后输出结果有偏差或者错误。
这些告诉我不管在做任何事情都应该持有认真严谨的态度,重视学习过程中的细节。
才能让我们学到更多东西。
重视基础知识,不断的提高自己的操作能力,对学到的知识学于致用,才能在今后的生活中学到更多东西。