操作系统课程设计报告.docx
《操作系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告.docx(33页珍藏版)》请在冰点文库上搜索。
![操作系统课程设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/20/cb00e9b5-0353-4bb8-801e-4f0477d8a4c0/cb00e9b5-0353-4bb8-801e-4f0477d8a4c01.gif)
操作系统课程设计报告
操作系统程序设计
操作系统模拟实现
院系:
运算机科学技术学院软件工程系
班级:
软件08–1班
姓名:
XXX
学号:
X号
指导教师:
XXX
2020年6月26日
操作系统程序设计任务书
一、题目:
操作系统模拟实现
二、设计要求
(1)独立完成
(2)良好的交流、沟通能力
(3)充分运用前序课所学的软件工程、程序设计等相关知识
(4)充分运用调试和排错技术
(5)简单测试驱动模块和桩模块的编写
(6)查阅相关资料,自学具体课题中涉及到的新知识。
(7)按要求写出课程设计报告,并于设计终止后1周内提交。
其要紧内容包括:
封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、整体设计、详细设计、程序的调试与测试、总结与体会、终止语、程序清单(带中文注释)、参考文献等。
三、设计内容及步骤
1.依照设计题目的要求,充分地分析和明白得问题,明确问题要求做什么。
具体要求至少实现进程治理模拟、存储器治理模拟、文件治理模拟,并将几个模块较好地集成一个整体,给出一个较好的用户界面。
2.依如实现的功能,划分出合理的模块,明确模块间的关系。
3.编程实现所设计的模块。
4.程序调试与测试。
5.结果分析。
程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
6.编写课程设计报告;
四、课程设计工作打算
2020年6月12日前,指导教师讲课,学生依照题目预备资料,需求分析;
2020年6月13日,提交软件整体模块结构图和分工方案;
2020年6月13日~2020年6月16日,完成程序模块并通过独立编译;
2020年6月17日~2020年6月20日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行,数据必需存储到磁盘文件中,已备验收;
2020年6月22日,验收、开始撰写课程设计报告;
2020年6月24日前,提交课程设计报告,并将软件的源文件及报告的word文档打印交到教师办公室里。
指导教师签章:
教研室主任签章
操作系统导教师评语与成绩
指导教师评语:
课程设计表现成绩:
课程设计验收成绩:
课程设计报告成绩:
课程设计总成绩:
指导教师签章
2010年7月日
一、需求分析
功能需求
《操作系统原理》课程设计是软件工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。
其目的在于加深对操作系统的理论、方式和基础知识的明白得,把握操作系统结构、实现机理和各类典型算法,进程调度、内存治理、文件治理、等各类调度治理算法模拟,系统地了解操作系统的设计和实现思路,培育学生的系统设计能力,并了解操作系统的进展动向和趋势。
背景描述
通过一个学期的《操作系统原理》、《操作系统实验教程》课程的学习,咱们学到了很多理论上的知识,对操作系统及其各方面的功能有了深刻的熟悉,但这是远远不够的,咱们要讲理论编程实践,尽管咱们学习期间做过很多的实验,可是都是针对操作系统的某一块具体的功能的,咱们对了解了每块具体的功能的实现,可是,整体说来仍是模糊,因此,很有必要将各个模块整合起来,也确实是模拟一个操作系统,如此,不仅跟深切学习了各个模块,更熟悉了一个完整的OS,对咱们来讲受益匪。
具体设计内容分析
本次课程设计所用环境:
VC++,采纳操纵台界面至少实现进程治理模拟、存储器治理模拟、文件治理模拟,并将几个模块较好地集成一个整体,实现各个治理调度算法的功能,并给出一个较好的用户界面。
进程治理模拟:
在多道程序运行环境下,进程数量一样多于处置机数量,是的进程要通过竞争来利用途理机。
这就要求系统能按某种属案发,动态的把处置机分派给就绪队列中的一个进程,使之运行。
进程调度包括经常使用的:
先来先效劳、时刻片轮转、优先权等因为以前已经实现,因此这次模拟整合到一路不算很难。
存储器治理模拟:
主存是中央处置器直接存取指令和数据的存储器,可否合理的利用主存,在专门大程度上将阻碍到整个运算机系统的性能。
在多道作业和多进程环境下,共享主存空间。
看成业执行完毕或进程运行终止后将主存空间归还系统。
这次模拟包括:
贮存分派与回收、基于分页的内存调度算法。
有于模拟的比较简单,仅实现了最先适应算法、和先来先效劳、最近你最久未利用的调度算法,实现比较简单。
文件治理模拟:
用于用户界面和操作命令在操作系统中的作用,实现操作系统中对文件的治理。
文件中成立一个双向链表,每一个聊表节点又是单链表的头结点,对目录、文件操作比较简单。
二、整体概要设计
系统的特点
本次可设主若是简单的模拟一个操作系统,包括一个主界面,实现了银行家算法、模拟文件治理、主存空间的分派与回收、进程调度等功能。
模拟了操作系统的进程治理、文件治理、存储器治理。
银行家算法,包括了新加作业、申请资源、撤销作业、查看资源情形四个模块。
若是申请资源后系统进入不平安状态,那么申请失败。
进程调度实现了调度进程的三个要紧算法——优先数、先来先效劳、时刻片轮转法。
其中,优先数算法中优先数的确信为(50-进程的效劳时刻),每轮一次优先数-3。
时刻片轮转法的时刻片由用户自己输入。
存储器治理实现了申请空间、撤销作业、显示空闲表等功能。
若是空闲空间不足那么申请失败。
模拟文件治理很全面,包括了创建目录、删除目录、改变目录、创建文件、删除文件、显示目录的功能。
另外,我还加了回到根目录的功能。
抽象数据整合
银行家算法:
constintMAX_P=20;
")){
p=workdir->sub;
if(p==NULL)
cout<<"错误,\""<else
{
while(p)
{
if(p->type==0)
{
if(!
strcmp(p->name,dirname))
{
flag=1;
break;
}
}
p=p->next;
}
if(flag==1)
{
workdir=p;
strcat(path,"\\");
strcat(path,p->name);
cout<<"工作目录已进入\""<}
else
cout<<"错误,\""<}
}
else
{
if(strcmp(workdir->name,"root"))
{
workdir=workdir->father;
for(inti=strlen(path)-1;i>=0;i--)
{
if(path[i]=='\\')
{path[i]='\0';break;}
}
cout<<"工作目录已进入\""<}
else
cout<<"错误,"<<"当前已是根目录"<}
}
模块流程图:
如下图
四、程序的调试与测试
调试分析
(1)在实验进程中碰到了很多错误,最开始的时候,在将各个模块连接起来的时候几个函数的名字一样,显现了错误,如图:
图3错误显示
后来将函数的名字都改变了一下。
(2)在主函数中将各个模块的主函数连起来的时候,退出来的时候整个程序就终止了,而我是想推出来的时候是退回到主界面,后来又给改了一下,加了一个while循环,还有变量flag,有flag来操纵,当flag=0的时候就跳出while循环,然后清屏,掉一个编好的显示函数,显示主界面,如此就退回了主界面,后来又发觉主函数有很多东西,很乱,我又将每一个模块的主函数部份又分出去一个函数,如此主函数掉每一个模块的原先的主函数部份就好了。
(3)在内存调度算法中由于windows里面没有getpid()函数不了解rand()就用结果造成却也计算率也来小。
如图:
图4内存调度算法FIFO中无getpid()错误
测试结果
可设主界面:
如图
图5设计主界面
银行家算法:
图6银行界算法主界面
新加作业:
图7添加作业
查看资源情形:
图8资源利用情形
为作业申请资源:
图9申请资源
撤销作业:
图10撤销作业
模拟文件治理:
如图
创建目录:
图11模拟文件治理界面
改变目录:
图12改变目录
回到上一级目录:
图13返回上一级目录
显示目录:
图14显示所有目录
存储器治理模拟:
如图
显示空闲表:
图15显示空闲区分派表
申请空间:
图16申请空间
进程调度模拟:
优先数算法:
图17优先数算法
时刻片轮转法:
图18时刻片轮转法
先来先效劳算法:
图19先来先效劳算法
五、用户利用说明
这次的课程设计实验主若是模拟一个操作系统的各个功能算法,重点在于算法的描述,应用。
当运行的时候会显现一个主界面,上面列出了该系统要紧实现的功能,能够依照提示选择1.、进程调度二、贮存空间分派与回收3、模拟文件治理4、内存调度算法五、银行家算法六、退出系统。
选择完后就进入该模块,若是选择的是1即银行家算法,进去后界面也会有提示,一、新加作业,2,、为作业申请资源3、撤销作业4、查看资源情形、0退出系统,选择你想要操作的。
会提示你相应的操作。
若是选择的是2即模拟文件治理,进入后也有界面给予提示,可是那个模块有前后顺序,即应该先创建目录,以后在进行其他操作,我还加入了一个额外的功能,若是输入cd..就会回到上一级目录里。
若是选择的是3,即存储器治理,那个模块第一要在改程序在同一目录下成立一个空闲表,进入该模块后第一要输入改空闲表,例如,,若是该空闲表存在的话就会继续往下进行,依照提示做想要实现的操作。
若是选择的是4,即进程调度,进入后能够选择P、优先数算法,R、时刻片轮转法F、先来先效劳算法、E退出时刻片轮转法的时刻片由用户来定。
这些模块中的退出都是退到主界面的,要想退出本系统,在主界面里有一个退出。
六、总结与体会
这次课程设计对我来讲获益专门大、体会很深,通过这次课程设计将所学的操作系统课程的知识用于实践,对所学的知识有了系统的了解、更深刻。
在将各个模块连起来过正中第一要对各个模块都深切了解,不仅温习了所学的,以前不明白的此刻明白了好多,而且对“操作系统”再也不陌生,可是“操作系统“所要做的绝不是这么少的,所学的这些是远远不够的,希望还能有更深的了解。
这次课程设计让我我熟练的练习了VC++环境,更让那个我了解和运用了linux操作系统,了解了OS内核结构,核心操作,和最大体的OS治理。
对以后学习有专门大帮忙。
这次课程设计给我了专门大的启发:
不管学什么都要一步一个脚印,不能前面开始学很有干劲,后面就松懈了,要锲而不舍。
感激教师耐心的教诲,您认真的态度对咱们很有帮忙、很亲切,但对我来讲是提升自身,我想我的IT之路还没走完,会有更深切的学习。
再次感激教师!
参考文献
[1]李登实,徐宏云,运算机操作系统实验,北京,清华大学出版社,2000年9月。
[2]汤小丹,梁红兵,运算机操作系统,西安,西安电子科技大学出版社,2007年5月。
附录:
程序清单
源码附录:
#include<>
#include<>
#include
usingnamespacestd;
#include<>
#include<>
#include<>
constintMAX_P=20;
constintMAXA=10;
constintMAXB=5;
constintMAXC=7;
typedefstructanode
{
inta,b,c,/*三种资源总数*/remain_a,remain_b,remain_c/*三种资源剩余数*/;
}bank;
typedefstructnode1
{
charname[20];
inta,b,c,need_a,need_b,need_c;
}process;
bankbanker;
processprocesses[MAX_P];
intquantity;ame,"");
processes[i].a=0;
processes[i].b=0;
processes[i].c=0;
processes[i].need_a=0;
processes[i].need_b=0;
processes[i].need_c=0;
}
}
ame,name))
{
flag=1;break;
}
}
if(flag)
{
cout<<"错误,作业以存在"<}
else
{
cout<<"本作业所需A类资源:
";
cin>>need_a;
cout<<"本作业所需B类资源:
";
cin>>need_b;
cout<<"本作业所需C类资源:
";
cin>>need_c;
t=1;
if(need_a>)
{
cout<<"错误,所需A类资源大于银行家所剩A类资源"<t=0;
}
if(need_b>)
{
cout<<"错误,所需B类资源大于银行家所剩B类资源"<t=0;
}
if(need_c>)
{
cout<<"错误,所需C类资源大于银行家所剩C类资源"<t=0;
}
if(t)
{
strcpy(processes[quantity].name,name);
processes[quantity].need_a=need_a;
processes[quantity].need_b=need_b;
processes[quantity].need_c=need_c;
quantity++;
cout<<"新加作业成功"<}
else
{
cout<<"新加作业失败"<}
}
}
ame,name))
{p=i;break;}
}
if(p!
=-1)
{
cout<<"该作业要申请A资源的数量:
";
cin>>a;
cout<<"该作业要申请B资源的数量:
";
cin>>b;
cout<<"该作业要申请C资源的数量:
";
cin>>c;
flag=1;
if((a>||(a>processes[p].need_a-processes[p].a))
{
cout<<"错误,所申请A类资源大于银行家所剩A类资源或该进程还需数量"<flag=0;
}
if((b>||(b>processes[p].need_b-processes[p].b))
{
cout<<"错误,所申请B类资源大于银行家所剩A类资源或该进程还需数量"<flag=0;
}
if((c>||(c>processes[p].need_c-processes[p].c))
{
cout<<"错误,所申请A类资源大于银行家所剩A类资源或该进程还需数量"<flag=0;
}
if(flag)
{
=a;
=b;
=c;
processes[p].a+=a;
processes[p].b+=b;
processes[p].c+=c;
cout<<"为作业申请资源成功"<}
else
cout<<"为作业申请资源失败"<}
else
cout<<"改作业不存在"<}
ame,name))
{
p=i;break;
}
}
if(p!
=-1)
{
+=processes[p].a;
+=processes[p].b;
+=processes[p].c;
for(i=p;iprocesses[i]=processes[i+1];
strcpy(processes[quantity-1].name,"");
processes[quantity-1].a=0;
processes[quantity-1].b=0;
processes[quantity-1].c=0;
processes[quantity-1].need_a=0;
processes[quantity-1].need_b=0;
processes[quantity-1].need_c=0;
quantity--;
cout<<"撤销作业成功"<}
else
{
cout<<"撤销作业失败"<}
}
ame<cout<<"A类:
"<cout<<"B类:
"<cout<<"C类:
"<cout<}
}
else
cout<<"当前没有作业"<}
"))
{
p=workdir->sub;
if(p==NULL)
cout<<"错误,\""<else
{
while(p)
{
if(p->type==0)
{
if(!
strcmp(p->name,dirname))
{
flag=1;
break;
}
}
p=p->next;
}
if(flag==1)
{
workdir=p;
strcat(path,"\\");
strcat(path,p->name);
cout<<"工作目录已进入\""<}
else
cout<<"错误,\""<}
}
else
{
if(strcmp(workdir->name,"root"))
{
workdir=workdir->father;
for(inti=strlen(path)-1;i>=0;i--)
{
if(path[i]=='\\')
{path[i]='\0';break;}
}
cout<<"工作目录已进入\""<}
else
cout<<"错误,"<<"当前已是根目录"<}
}
//创建文件
voidCREATE(charfilename[],intfilesize)
{
intflag;
dirnode*p,*q;
q=newdirnode;
strcpy(q->name,filename);
q->sub=NULL;
q->type=1;
q->next=NULL;
q->father=workdir;
q->size=filesize;
p=workdir->sub;
if(p==NULL)
{
workdir->sub=q;
cout<<"\""<}
else
{
flag=0;
while(p)
{
if(p->type==1)
{
if(!
strcmp(p->name,filename))
{
flag=1;
cout<<"错误,\""<}
}
p=p->next;
}
if(flag==0)
{
p=workdir->sub;
while(p->next)
{
p=p->next;
}
p->next=q;
cout<<"\""<}
}
}
//删除文件
voidDEL(charfilename[])
{
dirnode*p,*q;
intflag=0;
p=workdir->sub;
if(p==NULL)
cout<<"错误,\""<else
{
while(p)
{
if(p->type==1)
{
if(!
strcmp(p->name,filename))
{
flag=1;
break;
}
}
p=p->next;
}
if(flag==1)
{
if(p==workdir->sub)
workdir->sub=p->next;
else
{
q=workdir->sub;
while(q->next!
=p)
{
q=q->next;
}
q->next=p->next;
deletep;
}
cout<<"\""<}
else
{
cout<<"错误,\""<}
}
}
//现实所有目录,本目录下所有兄弟目录和文件
voiddir(dirnode*p)
{
while(p)
{
if(p->type==0)
{
cout<<""<name<<""<<""<}
else
{
cout<<""<name<<""<<""<<""<size<}
p=p->next;
}
}
//显示由目录下子目录中的文件和目录
voiddirs(dirnode*p,charstr[])
{
charnewstr[100];
dirnode*q;
cout<"<dir(p);
q=p;
if(q->sub)//子
{
strcpy(newstr,"");
strcat(newstr,str);
strcat(newstr,"\\");
strcat(newstr,q->name);
dirs(