Linux环境下几种内存调度算法模拟.docx
《Linux环境下几种内存调度算法模拟.docx》由会员分享,可在线阅读,更多相关《Linux环境下几种内存调度算法模拟.docx(14页珍藏版)》请在冰豆网上搜索。
![Linux环境下几种内存调度算法模拟.docx](https://file1.bdocx.com/fileroot1/2023-2/1/40ae45ed-c0ac-4648-912f-c8177f493285/40ae45ed-c0ac-4648-912f-c8177f4932851.gif)
Linux环境下几种内存调度算法模拟
课程设计(大作业)报告
课程名称:
计算机操作系统
设计题目:
Linux环境下几种内存调度算法模拟
院系:
信息技术学院
班级:
级计算机科学与技术班
设计者:
学号:
指导教师:
段玻
设计时间:
2015年1月12日-2015年1月16日
昆明学院
昆明学院课程设计(大作业)任务书
姓名:
院(系):
信息技术学院
专业:
计算机科学与技术学号:
任务起止日期:
2015年1月12日至2015年1月16日
课程设计题目:
Linux环境下几种内存调度算法模拟
课程设计要求及任务描述:
要求:
(1)按指定时间及地点参加课程设计。
(2)通过本次课程设计,能加深理解设计项目使用的相关原理。
(3)根据项目内容完成课程设计。
(4)在指定时间内提交设计结果及设计报告。
任务:
(1)选择其中两种算法的原理进行分析
①FIFO内存调度算法的原理
②(其他任选一个算法)内存调度算法的原理
(2)设计两种算法的流程图
①设计FIFO算法的流程图。
②其他任选一个算法设计流程图。
(3)使用Vi编写实现两种算法的程序
①FIFO内存调度算法的代码。
②(其他任选一个算法)内存调度算法的代码。
(4)结果分析
①分析设计结果是否达到预期目标。
②针对同一访问序列比较两种算法的缺页率。
工作计划及安排:
第一天上午:
教师讲解原理及课程设计要求和任务。
第一天下午:
原理学习、任务分析。
第二天:
流程图设计。
第三天:
代码编写。
第四天:
代码编写。
第五天:
提交设计结果及设计报告。
指导教师签字
年月日
课程设计(大作业)成绩
学号:
姓名:
指导教师:
段玻
课程设计题目:
Linux环境下几种内存调度算法模拟
完成情况总结:
在为期一周的实训中,在FIFO算法、以及RLU算法的编程方面出现了很大的困难,在选择语言方面,JAVA,C#,C语言之间,我最终选择了C语言来帮助我完成我接下来的试验,刚开始上手的时候,觉得只要懂得了原理,再加上自己C语言的功底应该可以应付的,但是,事实远远没有想象的那么简单,先是在写代码方面就出了问题,由于对原理的理解不是非常的深入,在编写代码时,总是停滞不前,彷徨时也曾想过放弃,但是逃避是没有用的,最终在同学的帮助下,我完成了代码的编程,在反复调试,改正之后算法终于验证成功了。
每一次的试验都是对自己所学知识的强化,都是一次难得的动手机会,在实验的每一个步骤的执行中,都要认真反复的去做,因为没一个小小的错误都会导致实验结果发生巨大的变化。
完成一次成功的实训,会让自己学会很多很多的东西,并且能够很清楚的看到自己的不足,从而查缺补漏,更加充实自己。
指导教师评语:
成绩:
填表时间:
指导教师签名:
课程设计(大作业)报告
一、题目分析(原理说明)
设计原理
在进程运行过程中,若其访问的页面不在内存而需要将其调入,但内存已无空闲空间时,需要从内存中调出(淘汰)一页程序或数据,送入磁盘的对换区。
用来选择淘汰哪一页的算法叫做置换算法,也称为淘汰算法。
淘汰算法是否适合某一序列直接影响系统的性能。
一个好的置换算法应具有较低的页面置换频率,置换时应将以后不再会访问,或是在较长时间内不再访问的页面淘汰。
1、先进先出算法(FIFO算法)基本思想
先进先出算法选择在内存中驻留时间最长的页面予以淘汰,即先进入内存的页面先淘汰。
其优点是算法实现简单,只须把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,使该指针总是指向最先进入内存的页面。
缺点是算法与进程的实际运行规律不相适应,因为进程中的某些页面经常被访问,但先进先出置换算法不能保证这些页面不被淘汰。
2、最近最久未使用算法(LRU算法)基本思想
最近最久未使用算法选择未被访问的页中时间最长的页予以淘汰。
该算法思想中,如果某个页面被访问,则它可能马上还要被访问,即某页面长时间未被访问,则页面在最近一段时间也不会被访问,所以选择未被访问页中时间最长的予以淘汰能降低页面置换频率。
该算法的优点是性能较好,降低置换频率。
缺点是实现复杂,需要硬件辅助,增加系统负担。
二、程序设计
1.流程图
2数据结构说明
#defineMaxWindow4//最大窗口数
#defineMaxN10//最多输入值个数
//定义全局变量
intWindow=0;//实际窗口大小
intN=0;//实际输入值个数
intChoice=0;//算法选择号
intA[MaxN];//输入值数组
intb[MaxWindow+1];//窗口数组
intnum=0;//缺页数
floatans=0.0;//缺页率
voidLRU(intwin,intn,inta[]);//LRU算法函数声明
voidFIFO(intwin,intn,inta[]);//FIFO算法函数声明
voidInitFunctionA();//初始化输入值变量函数
voidInitFunctionb();//初始化其余变量
3.代码
#include
#defineMaxWindow4
#defineMaxN10
intWindow=0;
intN=0;
intChoice=0;
intA[MaxN];
intb[MaxWindow+1];
intnum=0;
floatans=0.0;
voidLRU(intwin,intn,inta[]);
voidFIFO(intwin,intn,inta[]);
voidInitFunctionA();
voidInitFunctionb();
voidInitFunctionA()
{
for(inti=0;i{A[i]=0;}
}
voidInitFunctionb()
{
for(intj=0;j{b[j]=0;}
ans=0.0;
num=0;
}
//LRU算法描述
voidLRU(intwin,intn,inta[])
{
InitFunctionb();
cout<<"LRU算法开始:
"<inttemp=0,flag=0;
for(inti=0;i{
flag=0;
cout<<"当前窗口中的值为:
"<for(intx=1;x{cout<<"\t"<
cout<cout<<"下一个进入窗口的值:
"<temp=a[i];
b[0]=temp;
for(intj=1;j{
if(temp==b[j])
{
for(intp=j;p>0;p--)
{b[p]=b[p-1];}
flag=1;
cout<<"此页不缺失,重新调整窗口值顺序"<cout<break;
}
}
if(flag==0)
{
num++;
cout<<"此页缺失,缺页数加一,当前缺页总数为:
"<cout<for(intq=win;q>0;q--)
{b[q]=b[q-1];}
}
}
cout<ans=(float)num/n;
cout<<"采用LRU算法的缺页总数为:
"<num/n="<cout<}
//FIFO算法描述
voidFIFO(intwin,intn,inta[])
{
InitFunctionb();
cout<<"FIFO算法开始:
"<intflag=0;
inttemp=0;
for(inti=0;i{
flag=0;
cout<<"当前窗口中的值为:
"<for(intx=1;x{cout<<"\t"<
cout<cout<<"当前进入窗口的值:
"<temp=a[i];
b[0]=temp;
for(intj=1;j{
if(temp==b[j])
{flag=1;
cout<<"此页不缺失"<cout<break;
}
}
if(flag==0)
{
for(intq=win;q>0;q--)
{b[q]=b[q-1];}
num++;
cout<<"此页缺失,缺页数加一,当前缺页数目为:
"<cout<}
}
cout<ans=(float)num/n;
cout<<"使用FIFO算法的缺页数为:
"<num/n="<}
voidmain()
{
do
{cout<<"请输入窗口大小:
(1—4)"<cin>>Window;
if(Window!
=1&&Window!
=2&&Window!
=3&&Window!
=4)
{cout<<"输入错误,请输入1到4中一个整数!
"<}while(Window!
=1&&Window!
=2&&Window!
=3&&Window!
=4);
do
{cout<<"请输入数值个数:
(4—10)"<cin>>N;
if(N!
=4&&N!
=5&&N!
=6&&N!
=7&&N!
=8&&N!
=9&&N!
=10)
{cout<<"输入错误,请输入4到10的整数"<}while(N!
=4&&N!
=5&&N!
=6&&N!
=7&&N!
=8&&N!
=9&&N!
=10);
InitFunctionA();
InitFunctionb();
cout<<"请依次输入数值:
(非0)"<for(inti=0;i{do
{cin>>A[i];
if(A[i]==0)
{cout<<"输入值不为0,请重新输入此值"<}while(A[i]==0);
}
cout<<"输入的值依次为:
";
for(intj=0;j{cout<<""<cout<while(true)
{
cout<(1)使用LRU算法计算缺页率"<cout<<"
(2)使用FIFO算法计算缺页率"<cout<<"请输入选择的算法序号(1/2)"<do
{cin>>Choice;
if(Choice!
=1&&Choice!
=2)
{cout<<"输入错误,请重新选择"<}while(Choice!
=1&&Choice!
=2);
switch(Choice)
{
case1:
{LRU(Window,N,A);
break;}
case2:
{FIFO(Window,N,A);
break;}
}
}
}
三、结果分析
四、实验总结及心得体会
在为期一周的实训中,在FIFO算法、以及RLU算法的编程方面出现了很大的困难,在选择语言方面,JAVA,C#,C语言之间,我最终选择了C语言来帮助我完成我接下来的试验,刚开始上手的时候,觉得只要懂得了原理,再加上自己C语言的功底应该可以应付的,但是,事实远远没有想象的那么简单,先是在写代码方面就出了问题,由于对原理的理解不是非常的深入,在编写代码时,总是停滞不前,彷徨时也曾想过放弃,但是逃避是没有用的,最终在同学的帮助下,我完成了代码的编程,在反复调试,改正之后算法终于验证成功了。
每一次的试验都是对自己所学知识的强化,都是一次难得的动手机会,在实验的每一个步骤的执行中,都要认真反复的去做,因为没一个小小的错误都会导致实验结果发生巨大的变化。
完成一次成功的实训,会让自己学会很多很多的东西,并且能够很清楚的看到自己的不足,从而查缺补漏,更加充实自己。