fifo 先进先出 算法姓名韩小文学号 0921010548.docx
《fifo 先进先出 算法姓名韩小文学号 0921010548.docx》由会员分享,可在线阅读,更多相关《fifo 先进先出 算法姓名韩小文学号 0921010548.docx(11页珍藏版)》请在冰点文库上搜索。
fifo先进先出算法姓名韩小文学号0921010548
中北大学
操作系统课程设计
说明书
学院、系:
软件学院
专业:
软件工程
学生姓名:
韩小文
学号:
0921010548
设计题目:
基于linux的模拟存储器管理的设计与
实现
起迄日期:
2011年12月22日-2012年1月7日
指导教师:
康君
2012年1月7日
1.需求分析
当拿到任务时我们小组成员就在一起进行了讨论,明确了这次课程设计的任务和目标;并给各个成员分配了自己要完成的任务。
我们这次课程设计的任务是模拟存储器的管理且模拟操作系统的一些算法,如:
FIFO算法,LRU算法,NUR算法,OPT算法。
我们在分配任务后确定我要完成OPT算法,下面我对OPT算法的分析:
在输入一组数后首先对输入的数进行分析,看其属于哪个算法的数,如果其属于OPT算法的则再判断其属于哪个进程,然后再进行判断内存页面是否已满,未满则把其加入一个,满了把内存页面的数和当前属于opt算法且属于哪个进程的数进行比较,把最大的那个数返回,在链表中再把那个数给添加进。
2.总体设计
当运行程序时,程序提示用户输入数据,当用户按照其输入数据后就对数据进行分析,
分析其属于哪个进程,然后再选择算法,对其进行运算。
3.详细设计
我所编写的OPT算法如下:
intsort4(intvalue,PROCESS*pro)
{
inti;
for(i=0;istepNow;i++)
{
if(pro->opage[i]==value)
{
returni;
}
}
return-1;
}
voidadd4(intvalue,PROCESS*pro)
{
intm;
m=pro->stepNow;
pro->opage[m]=value;
}
/**
初始化position【】【】
*/
voidinitPos()
{
inti;
for(i=0;i{
position[i][0]=100;
position[i][1]=100;
}
}
/**
用于得到内存中已调入的页面的值与
即将调入的值相等的opage与controlSequ的下标并返回相等值的个数
*/
voidcom(intpos,PROCESS*pro)
{
inti,j;
for(i=0;i{
printf("");
for(j=pos;j{
if(pro->opage[i]==controlSequ[j])
{
position[i][0]=i;
position[i][1]=j;
break;
}
}
}
}
/**
用于得到即将访问的与内存中的页相同的在调度序列中最远的的
*/
intgetfurther()
{
intmax=0;
intmaxI=-1;
inti,count=0;
for(i=0;i{
if(max{
max=position[i][1];
maxI=i;
}
}
if(max==100)//如果将在最久执行的页面有多个时随机选一个置换出
{
intarray[PAGENUM];
for(i=0;i{
if(position[i][1]==100)
{
array[count]=i;
count++;
}
}
if(count>1)
{
intmm;
mm=rand()%(count);
maxI=array[mm];
}
}
initPos();
returnmaxI;
}
voidupdate4(intvalue,PROCESS*pro,intpos)
{
intmaxI;
initPos();
com(pos,pro);
maxI=getfurther();
if(maxI>=0)
pro->opage[maxI]=value;
else
{//
pro->opage[0]=value;
}
}
/*voiddestroy4(PROCESS*pro)
{
inti;
for(i=0;istepNow;i++)
{s
pro->opage[i]=0;
}
}*/
voiddestroyOptArr()
{
InitOptArr(&pro1);
InitOptArr(&pro2);
InitOptArr(&pro3);
}
voidcoreOfOpt(intvalue,PROCESS*pro,intpos)
{
intj;
if(sort4(value,pro)<0)
{
pro->count++;
if(pro->stepNow{
add4(value,pro);
pro->stepNow++;
}
else{
pro->m++;
update4(value,pro,pos);
}
if(pro->opage[0]!
=0)
{
for(j=0;jstepNow;j++)
{
pro->detail[pro->stepNow][j]=pro->opage[j];
printf("%d",pro->detail[pro->stepNow][j]);
}
}
}else{
}
}
voidopt()
{
intflag;//用于指定页面属于的进程1A2B3C
inti;
printf("页面置换过程:
\n");
for(i=0;i{
intm=controlSequ[i];
flag=classifyPageDetail(m);
switch(flag)
{
case1:
printf("\nA:
");
coreOfOpt(m,&pro1,i);
break;
case2:
printf("\nB:
");
coreOfOpt(m,&pro2,i);
break;
case3:
printf("\nC:
");
coreOfOpt(m,&pro3,i);
break;
}
}
getResult(pro1.m,pro2.m,pro3.m);
}
4.心得体会
这次的操作系统课程设计是在Linux平台下,采用C语言进行设计,并用gcc进行编译,调试通过的。
小组分配做的是基于Linux的模拟存储器的设计与实现,开始的困难就是不清楚到底做什么,需求分析阶段花费较长时间,在如何模拟内存分配上小组成员存在很大分歧,最后才弄明白设计的重点在于页面调度上而不是模拟内外存的分配上。
再一次的用实践证明了需求分析的重要性。
小组成员每人实现一个算法,提炼出实现各算法的公共部分,再整合。
初次接触Ubuntu,立刻熟悉vi 命令以及如何使用gcc编译调试。
深入掌握了如何实现页面置换操作,纠正学习理论时的错误理解认识,同时又掌握了进程并发,更对自己编写的OPT算法有了进一步认识。