操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
目录
1.课程设计的目的1
2.课程设计的要求1
3.课程设计报告内容1
3.1前言:
1
3.2课程设计的环境1
3.2.1硬件环境:
1
3.2.2软件环境:
1
3.3系统技术分析:
1
3.3.1算法设计:
1
3.3.2用户文档:
2
3.3.3技术文档:
2
3.4系统流程图及各模块2
3.5源程序代码清单3
makefile:
3
keyio:
4
print.c4
t.h5
rand.c5
main.c6
lru.c8
lfu.c9
fifo.c11
opt.c12
3.6实验结果及调试14
4.总结17
参考文献:
18
模拟内存管理
1.课程设计的目的
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力。
2.课程设计的要求
认真完成本课程设计的全部过程。
并以最终课程设计成果来证明其独立完成各种实际任务的能力。
从而,反映出理解和运用本课程知识的水平和能力。
3.课程设计报告内容
3.1前言:
操作系统是计算机系统中最重要的系统软件,Linux操作系统是源码公开的实用的现代操作系统,利用Linux作为操作系统实验的平台,不但可以理解操作系统原理,同时也可以作为操作系统开发实战的演练。
3.2课程设计的环境
3.2.1硬件环境:
本系统适用于Linux(RedHat)环境下的计算机,内存512M——1G,配备显示屏、键盘和鼠标等。
3.2.2软件环境:
本系统采用makefile实现模块编程,只能够在Linux环境下或使用Linux下的编程工具实现。
3.3系统技术分析:
3.3.1算法设计:
将程序分成10个模块,然后采用所编写的makefile文件指出这些模块的编译过程说明。
主要模块有程序的输入,输出以及各种页面置换算法函数,包过OPT(最佳置换算法),FIFO(先进先出置换算法),LRU(最近最少使用置换算法),LFU(最久最少使用算法),程序结构相当清晰。
t.h文件中主要是一些宏定义。
Print.c主要处理程序所用到的输出,包过用到一些简单的界面,方便用户使用。
3.3.2用户文档:
首先将户切换到文件Makefile目录下,生成一个可执行文件result,然后执行该可执行文件,进入到主界面,根据命令提示,可以简单方便的实现对内存的模拟管理,并且将管理过程输出,便于用户分析。
3.3.3技术文档:
本程序有过个.c文件,每个模块对应于一个.c文件,便于调试。
而且每个.c文件里面对代码都有详细的说明,便于阅读。
在所有的.c文件中都尽量的使得程序简洁,达到了程序设计的要求,即用最为便捷的方法,用最简单的代码达到最好的效果。
一些具体的内容查看源代码。
3.4系统流程图及各模块
模块说明:
产生随机页面:
用rand.c文件来实现,voidrand(intn,charp[])这函数是产生n个1~10的随机数放到p[]数组里面
手动输入页面:
用keyio.c文件来实现,voidkeyinput(intn,charp[])由键盘输入n个整数放到p[]数组里面,voidkeyoutput(intn,charp[]),输出刚刚由键盘输入输入的页面,用于确认是否有输入错误
OPT:
voidOptimal(charym[],intn)最佳置换算法,用opt.c实现
FIFO:
voidFIFO(charym[],intn)先进先出算法,用fifo.c实现
LRU:
voidLRU(charym[],intn)最近最久未使用算法,用lru.c实现
LFU:
voidLFU(charym[],intn)最少使用算法,用lfu.c实现
结果输出:
用print.c来实现,voiddisplay1()实现算法的选择,voiddisplay2(intselect,charym[],intn)输出显示结果的框架,并调用print(),voidPrint(),用于显示所选择算法的置换结果
Makefil:
链接程序,并指明编译的过程
3.5源程序代码清单
makefile:
obj=main.orand.okeyio.oprint.olfu.olru.oopt.ofifo.o
result:
$(obj)
g++$(obj)-o$@
main.o:
main.c
g++-cmain.c
fifo.o:
fifo.ct.h
g++-cfifo.c
keyio.o:
keyio.c
g++-ckeyio.c
lfu.o:
lfu.c
g++-clfu.c
lru.o:
lru.c
g++-clru.c
opt.o:
opt.c
g++-copt.c
print.o:
print.c
g++-cprint.c
rand.o:
rand.c
g++-crand.c
.PHONY:
clean
clean:
rm-f$(obj)
keyio:
#include"iostream"
/*键盘手动输入n个页面*/
voidkeyinput(intn,charp[])/*由键盘输入n个整数放到p[]数组里面*/
{
inti;
for(i=0;iscanf("%d",&p[i]);
}
voidkeyoutput(intn,charp[])//输出键盘输入的页面
{
inti;
for(i=0;iprintf("%d",p[i]);
printf("\n");
}
print.c
#include"iostream"
#include"t.h"
externcharpblock[pNum];
voidLFU(char*,int);
voidFIFO(char*,int);
voidLRU(char*,int);
voidOptimal(char*,int);
voidPrint();
voidkeyoutput(int,char*);
voiddisplay1()
{
printf("|>-----------------------------------------------------<|\n");
printf("|>----------------
(1)最佳置换算法------------<|\n");
printf("|>----------------
(2)先进先出算法------------<|\n");
printf("|>----------------(3)最近最久未使用算法------------<|\n");
printf("|>----------------(4)最少使用算法------------<|\n");
printf("|>----------------(0)退出------------<|\n");
printf("|>-----------------------------------------------------<|\n");
}
voiddisplay2(intselect,charym[],intn)
{
switch(select)
{
case1:
printf("****************Optimal算法****************\n");
printf("\t置换页面:
");
keyoutput(n,ym);
printf("\n");
Optimal(ym,n);//输出置换后的结果
break;
case2:
printf("****************FIFO算法****************\n");
printf("\t置换页面:
");
keyoutput(n,ym);
printf("\n");
FIFO(ym,n);
break;
case3:
printf("****************LRU算法****************\n");
printf("\t置换页面:
");
keyoutput(n,ym);
printf("\n");
LRU(ym,n);
break;
case4:
printf("****************LFU算法****************\n");
printf("\t置换页面:
");
keyoutput(n,ym);
printf("\n");
LFU(ym,n);
break;
case0:
break;
}
}
voidPrint()//输出环节
{
inti;
for(i=0;iprintf("%3d",pblock[i]);
printf("\n");
}
t.h
#definepNum3//物理块的数目
rand.c
#include"iostream"
#include"ctime"
voidsrand();
voidrand(intn,charp[])/*这函数是产生n个1~10的随机数放到p[]数组里面*/
{
intSTART=1;
intEND=10;
intv;
inti;
srand(time(NULL));
printf("产生的随机页面序列为:
\n");
for(i=0;i{
v=rand()%(END-START+1)+START;
p[i]=v;printf("%d",p[i]);
}
}
main.c
#include
#include
#include
#include
#include"t.h"
//#definepNum3/*系统为进程分配的物理块数*/
intqynum;/*缺页次数*/
charpblock[pNum];
floatqyl;/*缺页率*/
voidrand(intn,char*);
voidkeyinput(int,char*);
voidkeyoutput(int,char*);
voiddisplay1();
voiddisplay2(int,char*,int);
voidPrint();
usingnamespacestd;
intmain()
{
//pNum=3;
qynum=0;
intselect,s1,s2,i;
intn;//页面总数
charym[100];
//system("color1f");
//system("modecon:
cols=140lines=90");//背景颜色
lp3:
cout<printf("|>-----------------------------------------------------<|\n");
printf("|>----------作者:
郑杰峰学号:
081150023----------<|\n");
printf("|>---------------
(1)自动随机产生--------------<|\n");
printf("|>---------------
(2)键盘输入产生--------------<|\n");
printf("|>---------------(0)退出--------------<|\n");
printf("|>-----------------------------------------------------<|\n");
cout<printf("请选择产生页面走向序列的方式(选择1或2,选择0退出):
");
scanf("%d",&select);
switch(select)
{
case1:
lp2:
printf("要产生的随机页面总数:
");
scanf("%d",&n);
rand(n,ym);
lp1:
printf("\n你想选择那种算法?
(请选择1~4,选0退出):
\n");
display1();
printf("选:
");
scanf("%d",&s1);
display2(s1,ym,n);
for(i=0;ipblock[i]=0;
printf("\n\n\n");
printf("\t|>----1.选择其他算法--------<|\n");
printf("\t|>----2.重新产生随机页面----<|\n");
printf("\t|>----3.退到主界面----------<|\n");
printf("\t|>----0.直接退出------------<|\n");
ints;
printf("选:
");
scanf("%d",&s);
switch(s)
{
printf("\n\n\n");
case0:
exit(0);
case1:
gotolp1;break;
case2:
gotolp2;break;//重新产生随机数
case3:
gotolp3;break;//回到主界面
}
break;
case2:
lp22:
printf("输入页面总数:
");
scanf("%d",&n);
keyinput(n,ym);
printf("键盘输入的页面为\n");
keyoutput(n,ym);
lp11:
printf("\n\n你想选择那种算法?
(请选择1~4,选0退出):
\n");
display1();
printf("选:
");
scanf("%d",&s2);
display2(s2,ym,n);
for(i=0;ipblock[i]=0;//重新把分配的物理块置0
printf("\n\n\n");
printf("\t|>----1.选择其他算法--------<|\n");
printf("\t|>----2.重新输入页面--------<|\n");
printf("\t|>----3.退到主界面----------<|\n");
printf("\t|>----0.直接退出------------<|\n");
printf("选:
");
scanf("%d",&s);
switch(s)
{
printf("\n\n\n");
case0:
exit(0);
case1:
gotolp11;break;
case2:
gotolp22;break;//重新产生随机数
case3:
gotolp3;break;//回到主界面
}
break;
case0:
break;
}
return0;
}
lru.c
#include"iostream"
//externintpNum;
#include"t.h"
usingnamespacestd;
externintqynum;
externcharpblock[pNum];
externfloatqyl;
voidPrint();
voidLRU(charym[],intn)/*最近最久未使用算法*/
{
intc=0,i,j,m=0;
qynum=0;
for(j=0;j{
if(j==0)//对第一个页面处理
{
pblock[0]=ym[j];
Print();
qynum++;
continue;
}
if(j&&qynum<3)
{
for(i=0;iif(pblock[i]==ym[j])
{
if(qynum==2&&i==0)//缺页为2,再次pblock[0]相同处理
swap(pblock[0],pblock[1]);
Print();
break;
}
if(i==qynum)
{
pblock[qynum]=ym[j];
Print();
qynum++;
}
continue;
}
for(i=0;i{
if(pblock[i]==ym[j])
{
if(i==0)
{
chartemp;
temp=pblock[0];
pblock[0]=pblock[1];
pblock[1]=pblock[2];
pblock[2]=temp;
}
if(i==1)
swap(pblock[1],pblock[2]);
Print();
break;
}
}
if(icontinue;
else
{
qynum++;
pblock[0]=pblock[1];
pblock[1]=pblock[2];
pblock[2]=ym[j];
Print();
}
}
qyl=(float)qynum/n;
printf("|-----------------------------------------------------|\n");
printf("|页面总数为:
%d\n",n);
printf("缺页次数为:
%d\n",qynum);
printf("缺页率为:
%f\n",qyl);
printf("|-----------------------------------------------------|\n");
}
lfu.c
#include"iostream"
//externintpNum;
externintqynum;
#include"t.h"
externcharpblock[3];
externfloatqyl;
voidPrint();
voidLFU(charym[],intn)/*最少使用算法*/
{
inti,t=0,j,m=0;
qynum=0;
intp[3]={0};//记录每一个物理块没被使用的次数
for(j=0;j{
if(j==0)//对第一个页面处理
{
pblock[0]=ym[j];
Print();
qynum++;
continue;
}
if(j&&qynum<3)
{
for(i=0;iif(pblock[i]==ym[j])
{
Print();
intk;//让p[i]=0;其他的+1
for(k=0;kif(k!
=i)
p[k]++;
else
p[k]=0;
break;
}
if(i==qynum)
{
pblock[qynum]=ym[j];
Print();
qynum++;
p[i]=0;
while(i--)//让p[i]=0;其他的+1
p[i]++;
}
continue;
}
for(i=0;i{
if(pblock[i]==ym[j])
{
Print();
intk;
for(k=0;kif(k!
=i)
p[k]++;
else
p[k]=0;
break;
}
}
if(icontinue;
else
{
qynum++;
intk,max=0,sign;
for(k=0;kif(max
{
max=p[k];
sign=k;
}
for(k=0;kif(k!
=sign)
p[k]++;
else
p[k]=0;
pblock[sign]=ym[j];//替换掉最久没用使用的
Print();
}
}
qyl=(float)qynum/n;
printf("|-----------------------------------------------------|\n");
printf("|页面总数为:
%d\n",n);
printf("缺页次数为:
%d\n",qynum);
printf("缺页率为:
%f\n",qyl);
printf("|-----------------------------------------------------|\n");
}
fifo.c
#include"iostream"
//externintpNum;
#include"t.h"
externintqynum;
externcharpblock[pNum];
externfloatqyl;
voidPrint();
voidFIFO(charym[],intn)/*先进先出算法*/
{
inti,j,m=0;
qynum=0;/*防止多次选择时qynum会累加*/
for(j=0;j