操作系统课设报告.docx
- 文档编号:28436711
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:27
- 大小:966.79KB
操作系统课设报告.docx
《操作系统课设报告.docx》由会员分享,可在线阅读,更多相关《操作系统课设报告.docx(27页珍藏版)》请在冰豆网上搜索。
操作系统课设报告
操作系统
课程设计报告
xxxxx班
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
2013年12月30日
目录
第一章课程设计目的与要求1
1.1课程设计目的1
1.2设计要求1
1.3设计题目1
第二章算法分析2
2.1先到先服务调度算法2
2.2时间片轮转法3
2.3优先数调度算法4
2.4多级队列调度算法5
第三章详细设计与实现6
3.1程序流程图6
3.2模块功能说明6
3.2.1主菜单6
3.2.2先到先服务8
3.2.3时间片轮转调度算法8
3.2.4优先数调度算法9
第四章调试与测试11
4.1调试方法11
4.2测试结果的分析与讨论11
4.2.1先到先服务测试结果与分析11
4.2.2时间片轮转测试结果与分析11
4.2.3优先数调度算法测试结果12
4.3遇到的主要问题及采取的解决措施13
4.3.1对算法实现的陌生13
4.3.2设计多级队列调度算法中遇到的设计上的困难13
4.3.3小组成员间交互的误差14
4.4心得总结14
第五章关键源程序清单15
参考文献24
第一章课程设计目的与要求
1.1课程设计目的
操作系统课程是计算机科学与技术专业以及相关专业的必修课,在课程体系中占有重要地位。
操作系统本身具有概念抽象、结构复杂和难于掌握的特点,要想掌握操作系统精髓,不仅要做适量的习题,更重要的是动手能力。
通过课程设计,可以加深对基本原理的理解,激发学习兴趣,增强自信心。
1.2设计要求
(1)4名同学一组,选择1个设计题目。
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩。
(3)认真编写课程设计报告。
1.3设计题目
进程调度算法。
模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。
第二章算法分析
进程调度算法用于确定就绪队列中的哪一个进程即将获得CPU。
常用的进程调度算法有先来先服务法、时间片轮转法、优先数法等。
2.1先到先服务调度算法
先来先服务调度算法的基本思想是:
以到达就绪队列的先后次序为标准来选择占用处理机的进程。
一个进程一旦占有处理机,就一直使用下去,直至正常结束或因等待某事件的发生而让出处理机。
采用这种算法时,应该这样来管理就绪队列:
到达的进程的PCB总是排在就绪队列末尾;调度程序总是把CPU分配给就绪队列中的第一个进程使用。
算法流程如下图:
图2-1先到先服务流程图
2.2时间片轮转法
时间片轮转调度算法的基本思想是:
为就绪队列中的每一个进程分配一个称为“时间片”的时间段,它是允许该进程运行的时间长度。
在使用完一个时间片后,即使进程还没有运行完毕,也要强迫其释放处理机,让给另一个进程使用。
它自己则返回到就绪队列末尾,排队等待下一次调度的到来。
算法流程如下图:
图2-2时间片轮转法流程图
2.3优先数调度算法
优先数调度算法的基本思想是:
为每一个进程确定一个优先数,进程就绪队列按照优先数排序。
算法流程图如下:
图2-3优先数调度算法流程图
2.4多级队列调度算法
多级队列调度算法也称多级反馈队列调度算法,它是时间片调度算法与优先数调度算法的结合。
实行这种调度算法时,系统中将维持多个就绪队列,每个就绪队列具有不同的调度级别,可以获得不同长度的时间片,算法流程如下图:
图2-4多级队列调度算法流程图
第三章详细设计与实现
3.1程序结构图
主程序结构图:
图3-1主程序部分流程图
3.2模块功能说明
3.2.1主菜单
主菜单运用连续的输出函数System.out.println()输出如下一级菜单表:
图3-2-1主菜单图
一级菜单功能包括:
1)先到先服务算法
2)时间片轮转法
3)优先数算法
4)多级队列调度算法
5)显示准备队列进程
6)显示阻塞队列进程
7)显示运行队列进程
8)新建一个进程
9)删除一个进程
10)阻塞一个进程
11)唤醒一个进程
12)退出程序
其中,一级菜单的每一个选择项对应相应的子菜单选择,运用while()循环语句与ifelse()选择语句实现了用户可以多次一直选择菜单的功能项,直到用户选择了主菜单的退出选项,那么系统才会退出,否则用户将一直拥有选择菜单的权利。
3.2.2先到先服务
先到先服务算法具体的实现:
实现先到先服务算法,为了方便起见,我们使用内部类B,并且封装了一系列的方法:
PublicB():
内部类B的构造器,用于对新创建的进程对象进行初始化。
publicsetFlag():
设置属性Flag值。
PublicsetFinishTime():
设置进程结束时间。
PublicsetTurnOverTime():
设置周转时间。
PublicsetWeighTurnOverTime():
设置带权周转时间。
PublictoString():
重写方法toString(),用于输出时更加的符合我们需要的信息。
publicadd():
添加进程并计算完成的时间。
Publicfun():
查找第一个进入栈的进程,标记进程,并计算到达的最短的时间。
Publicset(inti):
计算一个进程完成的时间,周转时间,带权周转时间。
Publicprint():
打印,在菜单面上打印相关的结果。
Publicfirst01():
所有先到先服务算法模块的进入口。
3.2.3时间片轮转调度算法
这个部分是时间片轮转调度算法实现。
这个部分中有两个类,其中进入这个部分的类是ShiJianPianLunZhuan,另一个类TimeP主要用于模拟一个进程。
在这部分开始的阶段,先分别输入5个进程所需的运行时间,然后程序自动运行,显示进程的调度过程。
staticmyPrint():
ShiJianPianLunZhuan类中的方法,这是一个静态方法,这个方法主要负责在显示器上打印文字。
publicstaticTimeto():
ShiJianPianLunZhuan类中的静态方法,这个方法实现了时间片轮转调度算法,是主菜单进入这一部分的入口。
主要知识点有:
Scanner(文本扫描器):
一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。
Scanner使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。
然后可以使用不同的next方法将得到的标记转换为不同类型的值。
LinkedList(List集合中链表结构的集合):
此类实现Queue接口,为add、poll等提供先进先出队列操作。
其他堆栈和双端队列操作可以根据标准列表操作方便地进行再次强制转换。
虽然它们可能比等效列表操作运行稍快,但是将其包括在这里主要是出于方便考虑。
getFirst():
LinkedList类中获取第一个元素的方法。
addLast(Eo):
LinkedList类中向最后一个位置添加元素的方法,其中E是泛型的使用,如果在集合创建时,没有指定泛型,那么参数类型默认使用Object。
3.2.4优先数调度算法
这个部分是优先数调度算法的实现。
这个部分由三个类组成。
分别是:
Test类:
通过这个类进入这个部分。
进入这个类,先输入三个进程的优先级数,这一过程中会分别自动生成三个进程的所需时间,并且将他们封装成CommProcess类的对象,添加入Map集合和ArrayList集合。
publicstaticyouxian():
Test中的静态类,是这一模块的入口,其主要的功能是:
进程的初始化。
ComProcess类:
主要用于模拟一个进程,其中包括进程名,进程的优先数,进程到完成还需要的时间,进程的当前状态。
publicrun()方法是这个类中的主要方法,这个方法模拟进程运行一次。
刚进程到完成所需的时间如果为0,那么就将状态改为‘F’,表示已完成。
ReadCommand类:
这个类是优先数调度算法的主要实现。
通过调用其中的getCommand()方法进入。
这个类中的主要方法有:
publicstaticgetCommand():
这是一个静态方法,通过类名调用,这个类的入口,其中实现了优先数调度算法。
publicstaticprint():
这是一个静态方法,这个方法主要负责在显示器上打印文字。
主要的知识点:
HashMap():
基于哈希表的Map接口的实现。
此实现提供所有可选的映射操作,并允许使用null值和null键。
(除了不同步和允许使用null之外,HashMap类与Hashtable大致相同。
)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
此实现假定哈希函数将元素正确分布在各桶之间,可为基本操作(get和put)提供稳定的性能。
迭代集合视图所需的时间与HashMap实例的“容量”(桶的数量)及其大小(键-值映射关系数)的和成比例。
所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
第四章调试与测试
4.1调试方法
主要有三个方法:
1.通过程序运行的结果,推断错误发生的位置和原因。
2.如果错误的原因不易发现。
我们先总结出几个可能出错的地方,这个那些地方输入关键数据或做个标记,然后运行程序,观察这些标记是否正常。
3.如果以上两个方法都不行,我们会通过上网查询相关知识点和询问他人的方式来解决问题。
4.2测试结果的分析与讨论
4.2.1先到先服务测试结果与分析
先到先服务根据进程到达的时间,依次执行进程,先到的进程必须执行完成后,下一个进程才能执行。
进入主菜单选择1,得到如下结果:
图4-2-1先到先服务调度算法测试结果图
4.2.2时间片轮转测试结果与分析
时间片轮转和先到先服务不同的是如果下一个进程运行时间比正在执行的进程所需的时间少,那么终止正在执行的进程,执行下一个进程。
在主菜单中输入2,得到如下结果:
图4-2-2时间片轮转调度算法测试结果图
4.2.3优先数调度算法测试结果
优先数调度算法的基本思想是:
为每一个进程确定一个优先数,进程就绪队列按照优先数排序。
在主菜单中输入3,得到如下结果:
图4-2-3优先数调度算法测试结果图
4.3遇到的主要问题及采取的解决措施
4.3.1对算法实现的陌生
因为在以往的学习过程中很少进行实践,所以这次的课设中算法部分对我们有一定的难度。
解决方式:
我们通过在书上查找和网上搜索的方式,来熟悉这些算法,通过小组讨论来设计实现算法。
4.3.2设计多级队列调度算法中遇到的设计上的困难
因为多级队列调度算法中逻辑中,可能出现情况有很多,为了照顾到每一种情况,要求程序的逻辑要十分严谨,而这次课设的时间又比较紧迫,所以这一算法的实现是对编程效率的一大挑战。
解决方式:
非常抱歉的是,我们对这还没有很好的解决方式,我们仅能通过上网查询和询问他人的方式来获取设计上的思路。
4.3.3小组成员间交互的误差
因为我们小组这次所选的是第一题,而这一题,有非常明显的分工。
这也导致在最后整合时,不同部分间的程序出现误差。
解决方式:
我们先选出一个技术较高的成员,在最后整合时,让他将各个部分的代码按照统一的标准修改,排除一些程序设计上的错误。
4.4心得总结
通过此次课程设计,我学到了很多。
我知道了如何通过编程实现简单的计算机间通信。
另一方面,我懂得了理论和实践是有很大的差距。
只有理论和实践相结合,才能学到真知识。
同时我深感压力,我无论从理论还是实践,都还达不到要求,通过这次课程设计,我深刻体会到我和别人的差距,还有很多地方需要加强。
在以后的学习生涯里要努力学习理论知识,多动手实践,才能有更大的进步。
此外也认识到自主学习的重要性,生在这个时代我们应是庆幸的,因为在这个互联网的时代,我们不一定要通过课堂来学习知识,我们很多的知识都可以通过网上得到。
在本次的课设中,我们的很多东西也都是从网上学的。
除了在程序设计上的心得,我们同样获得了许多团队合作上的心得。
我们深切的体会到团队的好处。
我们可以合理的发挥团队中每一个队员的优势,合理安排工作,取长补短,实现1+1大于2的效果。
第五章关键源程序清单
主菜单关键代码:
publicstaticvoidmain(String[]args){
List
List
List
inttime_m=0;
intkey=0;
while(key!
=12){
System.out.println("-------------------------------------");
System.out.println("Pleaseselectafounction<1-12>:
");
Scannerscan=newScanner(System.in);
key=scan.nextInt();
//*****1**先到先服务算法
if(key==1){
System.out.println("firstcomefirstserved");
Aa=newA();
a.add("A",0,4);
a.add("B",5,3);
a.add("C",6,5);
a.add("D",7,2);
a.add("E",8,4);
a.fun();
System.out.println("进程名到达时间服务时间\t完成时间\t周转时间\t带权周转时间");
a.print();
}//key==1,先到先服务算法
//*****2**时间片轮转法
elseif(key==2){
System.out.println("roundrobin");
ShiJianPianLunZhuan.timeto();
}//*****2**时间片轮转法
//*****3**优先数调度算法
elseif(key==3){
System.out.println("highestpriorityfirst");
Test.youxian();
}//*****3**优先数调度算法
//*****4**多级队列调度算法
elseif(key==4){
System.out.println("multi_levelfeedbackqueue");
}//*****4**多级队列调度算法
//5,displayreadyprocessqueue
elseif(key==5){
Iteratorit=wait_list.iterator();
while(it.hasNext()){
System.out.println(((Process)it.next()).name+"进程");
}
}//5,displayreadyprocessqueue
//6,displayblockedprocessqueue
elseif(key==6){
Iteratorit=block_list.iterator();
while(it.hasNext()){
System.out.println(((Process)it.next()).name+"进程");
}
}//6,displayblockedprocessqueue
//7,displayrunningprocessqueue
elseif(key==7){
Iteratorit=run_list.iterator();
while(it.hasNext()){
System.out.println(((Process)it.next()).name+"进程");
}
}//7,displayrunningprocessqueue
//8,createaprocess
elseif(key==8){
System.out.println("请输入新建进程的名称:
");
Scannerscan2=newScanner(System.in);
Stringname=scan2.next();
System.out.println("请输入新建进程的状态(wait/block):
");
Stringstatement=scan2.next();
//新建进程
Processp=newProcess(name,statement,time_m++);
//将新建的进程插入到指定的队列中
if(statement.equals("block")){
block_list.add(p);
System.out.println("新建进程成功!
");
}elseif(statement.equals("wait")){
wait_list.add(p);
System.out.println("新建进程成功!
");
}else{
System.out.println("新建进程失败!
");
}
}//8,createaprocess
//9,deleteaprocess
elseif(key==9){
System.out.println("请输入要删除的进程的名称:
");
Scannerscan2=newScanner(System.in);
Stringname=scan2.next();
//先遍历,如果存在,则删除!
Iteratorit=wait_list.iterator();
while(it.hasNext()){
if(((Process)it.next()).name==name){
//删除此进程
wait_list.remove(it.next());
System.out.println("删除成功!
");
}
}
Iteratorit2=block_list.iterator();
while(it2.hasNext()){
if(((Process)it2.next()).name==name){
//删除此进程
block_list.remove(it2.next());
System.out.println("删除成功!
");
}
}
}//9,deleteaprocess
//10,blockaprocess
elseif(key==10){
System.out.println("请输入要阻塞的进程(非阻塞状态下的进程)名称:
");
Scannerscan2=newScanner(System.in);
Stringname=scan2.next();
Iteratorit=wait_list.iterator();
while(it.hasNext()){
if(((Process)it.next()).name==name){
((Process)it.next()).setStatement("block");
}
}
Iteratorit2=run_list.iterator();
while(it2.hasNext()){
if(((Process)it2.next()).name==name){
((Process)it2.next()).setStatement("block");
}
}
}//10,blockaprocess
//11,wakeupaprocess
elseif(key==11){
System.out.println("唤醒进程:
");
}//11,wakeupaprocess
//12
else{
System.out.println("end!
");
}
}//while
}
先到先服务关键代码:
classA{
classB{//内部类方便
privateStringprocessname;//s进程名
privatefloatarrivetime;//到达时间
privatefloatservetime;//服务时间
privatefloatfinishtime;//完成时间
privatefloatturnovertime;//周转时间
privatefloatweighturnovertime;//带权周转时间
privateintflag=0;//标记该进程是否已经完成
publicB(Stringprocessname,floatarrivetime,floatservetime){//构造方法只传入已知量
this.processname=processname;
this.arrivetime=arrivetime;
this.servetime=servetime;
}
publicvoidsetFlag(){
this.flag=1;
}
publicvoidsetFinishtime(floatfinishtime){
this.finishtime=finishtime;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 报告