操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
![操作系统课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/27/d342f120-cdce-431f-b020-bf40d1a3d2af/d342f120-cdce-431f-b020-bf40d1a3d2af1.gif)
操作系统课程设计
课程设计报告
课程名称《操作系统》
课题名称时间片轮转算法
专业信息管理与信息系统
班级信管1001
学号
姓名
指导教师李峰、张益星、吴德建
2012年7月9日
湖南工程学院
课程设计任务书
课程名称《操作系统》
课题时间片轮转算法
专业班级信管1001
学生姓名
学号
指导老师李峰、张益星、吴德建
审批
任务书下达日期2012年6月21日
任务完成日期2012年7月9日
一、设计内容与设计要求
1.课程设计目的
全面熟悉、掌握计算机系统与系统软件基本知识,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,增强面向对象程序设计概念,熟悉C++语言编程,养成提供文档资料的习惯和规范编程的思想,为后继课程的实验以及课程设计打下较扎实的基础。
进一步提高上机动手能力,培养使用计算机解决实际问题的能力,为后继课程(数据结构、数据库和JAVA\C#语言编程等课程)的实验以及课程设计,特别是自学、毕业论文的完成打下扎实的基础。
2.课题题目
时间片轮转算法:
从键盘输入若干个进程;选择时间片,能算出平均周转时间和带权周转时间。
3.设计要求:
主要模块:
1、输入进程模块
具有功能:
1、输入进程2、输入进程报错3、友好提示4、输入到达时间5、输入服务时间6、退出本系统
2、时间片选择模块
具有功能:
1、友好提示2、时间片选择3、时间片输入报错4、退出本系统
3、周转时间计算模块
具有功能:
各个模块周转时间的计算
4、完成时间计算模块
具有功能:
各个模块完成时间的计算
5、带权周转时间计算模块
具有功能:
各个模块带权周转时间的计算
6、模块完成顺序输出
具有功能:
模块完成顺序的输出
要求:
1)设计正确,方案合理。
2)界面友好,使用方便。
3)程序精炼,结构清晰。
4)设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5)实际操作过程中遇到的问题及解决方法:
设计总结及心得体会.
6)上机演示。
二、进度安排
第19周星期二晚上18:
00-22:
00
星期四晚上18:
00-22:
00
星期五上午8:
00-12:
00下午13:
00-17:
00
第20周星期一上午8:
00-12:
00
星期二下午14:
00-18:
00
目录
1.系统需求分析1
1.1问题描述1
1.2功能要求1
2.总体设计1
2.1总体设计图1
2.2各模块功能2
2.3相关数据结构设计3
3.详细设计3
3.1采用C++语言定义的相关数据类型3
3.2调度算法的主要实现4
4.运行结果6
4.1系统调试6
4.2功能实现界面7
5.使用说明11
6.心得体会11
7.附录12
7.1源代码12
7.2参考文献20
8.评分表22
1.系统需求分析
1.1问题描述
设计程序模拟进程的时间片轮转RR调度过程。
假设有n个进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。
分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
1.2功能要求
1)进程个数n;每个进程的到达时间T1,…,Tn和服务时间S1,…,Sn;输入时间片大小q。
2)要求时间片轮转法RR调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;
3)输出:
要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:
进程B开始运行”等等;
4)输出:
要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
5)输入进程报错:
当输入不正确时,进行适当的报错,要求重新输入。
2.总体设计
2.1总体设计图
系统总体设计如图2.1所示。
图2.1系统总体设计
2.2各模块功能
1)intInitQueue(LinkQueue&Q):
输入进程时,初始化输入的链表。
2)intDestroyQueue(LinkQueue&Q):
运行完后,销毁链表。
3)intEnQueue(LinkQueue&Q,QElemTypee):
将进程插入循环队列中。
4)intDeQueue(LinkQueue&Q,QElemTypee):
当进程完成后,输出链表中元素。
5)intQueueEmpty(LinkQueue&Q):
判断链表是否为空。
6)voidchioce(structPCBpcb[],intn):
对于输入链表中数的按关键字—到达时间用选择法从小到大进行进行排序。
7)voidcaidan():
主菜单,包含:
进程的创建和结果和结束。
8)voidcreate():
进程的创建。
9)voidmain():
实现函数调用的总控制。
2.3相关数据结构设计
(1)用结构体,定义循环队列的的数据域和指针:
QElemTypedata,structQNode*next。
(2)定义循环队列的头指针和尾指针。
QueuePtrfront,QueuePtrrear。
(3)定义创建进程的相关内容。
包含:
到达时间:
intArrivalTime,服务时间:
intServiceTime,进程名称:
charnumber。
3.详细设计
3.1采用C++语言定义的相关数据类型
1)typedefintQElemType:
自定义类型,定义QElemType为int型。
2)typedefstructQNode
{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
采用结构体变量,存队列的相关信息:
QElemTypedata、structQNode*next。
同时定义结构体指针*QueuePtr,便于之后书写开辟空间级表示。
系统调用时,每次分配一个QNode那么大的空间进行存储。
3)typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
定义循环链表的头指针和尾指针。
QueuePtrfront,QueuePtrrear。
4)structPCB
{
intArrivalTime;
intServiceTime;
charnumber;
}m[MaxNum];
采用结构体数组,创建一个进程,包含进程相关信息:
进程名称、进程到达时间、进程服务时间。
3.2调度算法的主要实现
输入进程个数n;每个进程的到达时间T1,…,Tn调用选择排序法将输入的到达时间安先后顺序排列好,形成一个进程等待队列再输入服务时间S1,…,Sn;输入时间片大小q。
接着调用时间片轮转法RR调度进程运行,计算每个进程的完成时间,周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;最后输出要求输出计算出来的每个进程的名称、到达时间、服务时间、完成时间、周转时间和带权周转时间。
以及所有进程的平均周转时间,带权平均周转时间。
在进程开始输入不正确时进行报错要求重新输入。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4.运行结果
4.1系统调试
(1)在程序设计初期。
自己还是免不了会犯一些粗心的错误:
如在语句for()循环中的分号格式不正确,赋值语句后没有加分号等。
(2)在程序运行初期,一直测试的是2个进程,一直都可以。
输出的结果含所要求计算的结果。
但测试3个进程时,所想输出的结果就不能够给输出出来。
因为没有设置控制进程是否到达的开关及有关的判断。
后增设一个pushed[]数组标志进程是否入队列。
(3)开始设计程序时,未想到当到达时间不一致有前有后时的情况。
后来检查时发现这样计算时间会变长,在段服务时间在后的话。
因为队列是按输入的先后顺序排列,不是按到达时间排列的,所以进程依旧按先后顺序下来调度,导致算法错误。
后加入排序程序voidchioce(structPCBpcb[],intn),按关键字-到达时间的先后进行排序,这样程序得到了改善。
4.2功能实现界面
(1)主菜单:
输入选项1:
进程创建及结果2:
结束。
如图4.1所示。
图4.1主菜单
(2)进程的创建及结果。
1)选择1,创建进程。
输入进程总数,进程的名称a、b,各进程到达的时间,各进程服务的时间,以及时间片q的值。
当输入进程为2时,各进程到达时间为3,2,各进程服务时间为2,3,以及时间片q=2时的情况。
输入情况如图4-2所示。
图4.2创建进程
2)输入成功后,按回车键,进程在程序中的具体实现情况即:
时间轮转情况。
如图4.3所示。
图4.3进程运行过程
3)进程在调度算法中,计算出的具体的完成时间,周转时间,带权时间,平均周转时间,平均带权周转时间。
如图4.4所示。
图4.4进程运行结果
(3)选择2:
退出界面。
如图4.5。
图4.5退出界面
5.使用说明
1)进入主菜单,按提示进行输入。
输入1:
进程的创建及创建后的运行结果。
输入2:
退出系统。
2)进程创建,根据有关提示,输入进程,进行进程的有关创建,最后输入完后,按回车,显示出整个进程的运行结果。
3)按提示输入正确的数值,否则会出现错。
6.心得体会
7.附录
7.1源代码
#include
#include
#include
typedefintQElemType;
staticconstintMaxNum=100;
typedefstructQNode
{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
structPCB
{
intArrivalTime;
intServiceTime;
charnumber;
}m[MaxNum];
intInitQueue(LinkQueue&Q);
intDestroyQueue(LinkQueue&Q);
intEnQueue(LinkQueue&Q,QElemTypee);
intDeQueue(LinkQueue&Q,QElemTypee);
iQueueEmpty(LinkQueue&Q);
voidchioce(structPCBpcb[],intn);
voidcaidan();
voidcreate();
intn,q,FinishedTime[MaxNum],WholeTime[MaxNum];
doubleWeightWholeTime[MaxNum],Average_WT=0,Average_WWT=0;
LinkQueueQ;
voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q);
voidmain()
{
while
(1)
{
//system("cls");
cout<caidan();
intn;
cout<<"请选择(1-2):
"<cin>>n;
if(n<1||n>2)
cout<<"输入有误,请重新输入"<switch(n)
{
case1:
create();break;
case2:
return;
}
}
}
//RR算法的具体实现
voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q)
{
intcountTime=0,e;
chioce(m,n);
if(ArrivalTime[0]==0)
countTime=0;
else
countTime=m[0].ArrivalTime;
intSTime[MaxNum],pushed[MaxNum];
for(inti=0;i{
STime[i]=m[i].ServiceTime;
pushed[i]=0;
}
InitQueue(Q);
EnQueue(Q,0);
pushed[0]=1;
inttime=m[0].ArrivalTime;
while(QueueEmpty(Q)==false)
{
e=DeQueue(Q,e);
if(STime[e]>q)
{
STime[e]=STime[e]-q;
countTime+=q;
}
else
{
countTime+=STime[e];STime[e]=0;FinishedTime[e]=countTime;
}
while(time{
if(STime>0)
{
cout<<"时刻"<(2)<