先来先服务和短进程优先调度算法模拟课程设计.docx
- 文档编号:14972378
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:13
- 大小:18.39KB
先来先服务和短进程优先调度算法模拟课程设计.docx
《先来先服务和短进程优先调度算法模拟课程设计.docx》由会员分享,可在线阅读,更多相关《先来先服务和短进程优先调度算法模拟课程设计.docx(13页珍藏版)》请在冰点文库上搜索。
先来先服务和短进程优先调度算法模拟课程设计
资料范本
本资料为word版本,可以直接编辑和打印,感谢您的下载
先来先服务和短进程优先调度算法模拟课程设计
地点:
__________________
时间:
__________________
说明:
本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容
课程设计(论文)
题目:
先来先服务和短进程
优先调度算法模拟
院(系):
华清学院
专业班级:
计算机2011
姓名:
王江
学号:
11
指导教师:
曾应员
2013年12月18日
西安建筑科技大学华清学院课程设计(论文)任务书
专业班级:
计算机1101学生姓名:
王江指导教师(签名):
设计总说明
能够选择不同的调度算法(先来先服务,非强占式短进程优先算法),通过给出进程名、进程的到达时间和进程的运行时间,根据调度算法计算出进程的平均周转时间和平均带权周转时间,比较调度算法的优劣。
关键字:
先来先服务短进程优先调度进程平均周转时间平均带权周转时间
TOC\o"1-3"\h\z\uHYPERLINK\l"_Toc367713036"1.设计目的PAGEREF_Toc367713036\h1
HYPERLINK\l"_Toc367713037"2.问题描述2
HYPERLINK\l"_Toc367713038"3.需求分析2
HYPERLINK\l"_4.概要设计"4.概要设计3
HYPERLINK\l"_Toc367713040"5.详细设计4
HYPERLINK\l"_Toc367713041"6.调试分析7
HYPERLINK\l"_Toc367713042"7.使用说明8
HYPERLINK\l"_Toc367713043"8.设计总结10
HYPERLINK\l"_Toc367713044"9.参考文献11
HYPERLINK\l"_10.程序源代码"10.程序源代码12
《操作系统》课程设计
先来先服务和短进程优先调度算法模拟
1.设计目的
“操作系统”是计算机专业的核心专业课,“操作系统课程设计”是理解和巩固操作系统基本理论、原理和方法的重要的实践环节。
操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。
本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统基本理论与管理方式。
在算法基础上,解决实际的管理功能的问题,提高学生实际应用、编程的能力。
课程设计要求学生在完成程序设计的同时能够撰写比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
2.问题描述
此次做的进程调度模拟系统,用户可以输入各进程信息(包含进程名、到达时间、运行时间)。
输入进程数,然后输入进程的提交时间和运行时间,显示先来先服务调度算法和非强占式短进程优先调度算法的作业号、提交时间、运行时间、开始时间、结束时间、周转时间、带权周转时间、执行时间、平均周转时间和平均带权周转时间。
3.需求分析
3.1数据需求
需要用户自行键入进程数,进程提交时间和运行时间.
3.2基本功能需求
模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
3.3非功能性需求
用户界面需求:
简洁、易用、易懂、友好的用户界面。
硬件要求:
装有VisualC++6.0的计算机。
可靠性需求:
保证用户在正常使用本系统时,用户的操作或误操作不会产生数据的丢失。
4.概要设计
4.1数据结构
此次程序从大的方面来说是利用链表来实现的,在程序中定义了一个结构体structPCB用来保存每一条记录,每个结点包括进程名(作业名)、进程的提交时间、运行时间、开始时间、结束时间、周转时间、带权周转时间、平均周转时间和平均带权周转时间。
定义一个double型的handtime(提交时间),一个double型的asktime(运行时间)、starttime(开始时间)、endtime(结束时间)、usetime(周转时间)、right(带权周转时间)以及整型的runorder(执行的顺序)和num(进程数),还定义一个指针next。
4.2系统包含的函数
4.2.1先来先服务调度算法:
voidFCFS(prop[],intn)
4.2.2非强占式短进程优先调度算法:
voidSJF(prop[],intn)
4.2.3主函数:
intmain()
4.3函数间的关系
函数SJF和函数FCFS都在主函数中进行调用
4.4系统功能模块图
图4-1系统功能模块图
5.详细设计
5.1结构体的详细定义
Structpro的定义如下:
structpro
{
doublehandtime;
doubleasktime;
doublestarttime;
doubleendtime;
doubleusetime;
doubleright;
intrunorder;
intnum;
pro*next;
};
5.2系统函数详细介绍
先来先服务调度算法有两种情况:
一是进程的提交时间不一样,是根据到达的先后顺序来执行的,先到达先执行;二是进程的提交时间一样,即所有的进程的到达时间是一样的,要看进程的执行顺序,在前的进程先执行。
非强占式短进程优先调度算法,有两种情况:
一是进程的到达的时间不一样,那么首先执行第一个到达的进程,执行完后,然后比较剩下进程的到达时间和运行时间,先到达的和运行时间短的进程先运行;二是进程的到达时间一样,比较所有的进程的运行时间,运行时间短的进程先执行。
5.3系统功能模块介绍
系统功能模块主要分为两大部分:
先来先服务调度算法和非强占式短进程优先调度算法.
5.4具体模块设计
5.4.1先来先服务调度算法(图1)
图5-1先来先服务调度
5.4.2非强占式短进程优先调度算法
图5-2非强占式短进程优先调度
6.调试分析
测试数据:
到达时间不一样进程3(1.22.43.2)
进程4(1.32.53.14.2)
到达时间一样进程3(1.21.11.3)
进程4(1.41.11.21.0.5)
7.使用说明
7.1到达时间不一样
7.1.1进程数为:
3
图7-1
7.1.2进程数为:
4
图7-2
7.2到达时间一样
7.2.1进程数为:
3
图7-3
7.2.2进程数为:
4
图7-4
8.设计总结
这次课程设计给我一个很好的锻炼和实践的机会,让我对那些算法有了更深的了解。
这次做的比较好的是直接把进程信息设定为一个结构体,如此以来对进程的操作比较方便,实现了基本信息的有效封装,充分利用链表来实现算法;还有就是基本上完成课程设计的要求,计算出平均周转时间和平均带权周转时间,比较了两种算法的优劣。
不过,这次课设也有很多不足之处,比如说在提交时间一样的情况下,先来先服务是按照进程号的顺序执行,非强占式短进程优先调度算法先执行第一个进程,然后比较剩下进程的运行时间,运行时间最短的进程先进行。
当提交时间一样时,对于短进程优先调度算法,应该是直接比较各个进程的运行时间,运行时间最短的进程先执行,这个不足之处需要改进。
通过这次课程设计,提高了C++方面的水平。
从这次课设,我不仅加深对操作系统知识的了解,而且更加提高自己的编程能力和实践水平。
虽然这次课程设计结束了,然而对操作系统的学习不能间断,我要继续学习操作系统的知识,了解和掌握各种不同类型的操作系统;还要加强自己的编程能力,让自己的实践水平更上一层楼。
但是,我觉得既然是操作系统课程设计应该涉及到多个操作系统,让我们了解更多不同的操作系统,通过不同的操作系统实践,掌握各个不同系统的特点和区别。
9.参考文献
【1】汤小丹、梁红兵、哲凤屏、汤子瀛编著.计算机操作系统(第三版).西安:
西安电子科技大学出版社,2007.5
【2】史美林编.计算机操作系统教程.北京:
清华大学出版社,1999.11
【3】徐甲同编著.操作系统教程.西安:
西安电子科技大学出版社,1996.8
【4】Clifford,A.Shaffer编著.数决结构与算法分析(C++版).北京:
电子工业出版社,2005.7
【5】蒋立翔编著.C++程序设计技能百练.北京:
中国铁道出版社,2004.1
10.程序源代码
#include
usingnamespacestd;
structpro
{
doublehandtime;
doubleasktime;
doublestarttime;
doubleendtime;
doubleusetime;
doubleright;
intrunorder;
intnum;
pro*next;
};
//------------------------------------------------
voidSJF(prop[],intn);
voidFCFS(prop[],intn);
//------------------------------------------------
intpronum;
intmain()
{
prop[20];
cout<<"请输入进程的个数:
";
cin>>pronum;
cout<<"按时间先后顺序输入进程的提交时间和运行时间"< for(inti=0;i { p[i].num=i+1; cout<<"第"< "; cin>>p[i].handtime>>p[i].asktime; while(p[i].handtime { cout<<"请从新输入第"< "; cin>>p[i].handtime>>p[i].asktime; } } FCFS(p,pronum); SJF(p,pronum); return0; //cout< } //-------------------------- voidSJF(prop[],intn) { inti,order=1; pro*now=&p[0]; pro*temp,*nextrun; p[0].starttime=p[0].handtime; p[0].endtime=p[0].handtime+p[0].asktime; p[0].usetime=p[0].asktime; p[0].right=1.0; p[0].runorder=order; ++order; for(i=0;i { p[i].next=&p[i+1]; } //cout< p[n-1].next=NULL; /*while(now! =NULL) { cout< now=now->next; }*/ while(now->next! =NULL) { nextrun=now->next; //cout< //while(nextrun! =NULL)//确定nextrun //{ if(nextrun->handtime>=now->endtime) { nextrun->starttime=nextrun->handtime; } else { if(nextrun->next! =NULL) { temp=nextrun->next; while(temp->handtime<=now->endtime)//用来确定nextrun是否改变 { if(temp->asktime nextrun=temp; if(temp->next! =NULL) temp=temp->next; else break; } } nextrun->starttime=now->endtime; }//确定nextrun完毕 if(nextrun! =now->next) { temp=now;//修改链表 while(temp->next! =nextrun) temp=temp->next; temp->next=nextrun->next; temp=now->next; now->next=nextrun; nextrun->next=temp; }//链表修改完毕 nextrun->endtime=nextrun->starttime+nextrun->asktime; nextrun->usetime=nextrun->endtime-nextrun->handtime; nextrun->right=nextrun->usetime/nextrun->asktime; nextrun->runorder=order; ++order; //进程信息修改完毕 now=nextrun; } doublesumtime=0,sumright=0; cout<<"SJF"< cout<<"作业号\t提交\t运行\t开始\t结束\t周转\t带权\t执行"< for(i=0;i { sumtime+=p[i].usetime; sumright+=p[i].right; cout< } cout<<"平均\t\t\t\t\t"< } //------------------------- voidFCFS(prop[],intn) { inti; p[0].starttime=p[0].handtime; p[0].endtime=p[0].handtime+p[0].asktime; p[0].usetime=p[0].asktime; p[0].right=1.0; p[0].runorder=1; for(i=1;i { if(p[i].handtime p[i].starttime=p[i-1].endtime; else p[i].starttime=p[i].handtime; p[i].endtime=p[i].starttime+p[i].asktime; p[i].usetime=p[i].endtime-p[i].handtime; p[i].right=p[i].usetime/p[i].asktime; p[i].runorder=i+1; } doublesumtime=0,sumright=0; cout<<"FCFS"< cout<<"作业号\t提交\t运行\t开始\t结束\t周转\t带权\t执行"< for(i=0;i { sumtime+=p[i].usetime; sumright+=p[i].right; cout< } cout<<"平均\t\t\t\t\t"< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 先来先 服务 进程 优先 调度 算法 模拟 课程设计