操作系统课程设计文档格式.docx
- 文档编号:21123059
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:19
- 大小:195.30KB
操作系统课程设计文档格式.docx
《操作系统课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
4)设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5)实际操作过程中遇到的问题及解决方法:
设计总结及心得体会.
6)上机演示。
二、进度安排
第19周星期二晚上18:
00-22:
00
星期四晚上18:
星期五上午8:
00-12:
00下午13:
00-17:
第20周星期一上午8:
00
星期二下午14:
00-18:
目录
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&
运行完后,销毁链表。
3)intEnQueue(LinkQueue&
Q,QElemTypee):
将进程插入循环队列中。
4)intDeQueue(LinkQueue&
当进程完成后,输出链表中元素。
5)intQueueEmpty(LinkQueue&
判断链表是否为空。
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;
定义循环链表的头指针和尾指针。
4)structPCB
intArrivalTime;
intServiceTime;
charnumber;
}m[MaxNum];
采用结构体数组,创建一个进程,包含进程相关信息:
进程名称、进程到达时间、进程服务时间。
3.2调度算法的主要实现
输入进程个数n;
每个进程的到达时间T1,…,Tn调用选择排序法将输入的到达时间安先后顺序排列好,形成一个进程等待队列再输入服务时间S1,…,Sn;
接着调用时间片轮转法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<
iostream.h>
iomanip.h>
malloc.h>
typedefintQElemType;
staticconstintMaxNum=100;
typedefstructQNode
QElemTypedata;
structQNode*next;
typedefstruct
QueuePtrfront;
QueuePtrrear;
structPCB
intArrivalTime;
intServiceTime;
charnumber;
intInitQueue(LinkQueue&
Q);
intDestroyQueue(LinkQueue&
intEnQueue(LinkQueue&
Q,QElemTypee);
intDeQueue(LinkQueue&
iQueueEmpty(LinkQueue&
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&
voidmain()
while
(1)
{
//system("
cls"
);
cout<
<
endl;
caidan();
intn;
cout<
"
请选择(1-2):
cin>
>
n;
if(n<
1||n>
2)
输入有误,请重新输入"
switch(n)
{
case1:
create();
break;
case2:
return;
}
}
}
//RR算法的具体实现
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<
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<
countTime)
if(STime>
0)
cout<
时刻"
setw
(2)<
time<
:
进程"
e<
正在运行"
time++;
for(i=1;
if(STime!
=0&
&
i!
=e&
m[i].ArrivalTime<
countTime&
pushed[i]==0||STime!
m[i].ArrivalTime==countTime)
EnQueue(Q,i);
pushed[i]=1;
if(STime[e]>
0)//判断进程e是否已执行完
EnQueue(Q,e);
for(i=0;
{//求周转时间和带权周转时间
WholeTime[i]=FinishedTime[i]-m[i].ArrivalTime;
WeightWholeTime[i]=(double)(WholeTime[i]*1.000000/m[i].ServiceTime);
Average_WT+=WholeTime[i];
Average_WWT+=WeightWholeTime[i];
Average_WT/=n;
//求平均周转时间
Average_WWT/=n;
//求平均带权周转时间
//----------------输出----------------
cout<
-------------------------------------"
进程运行的结果是:
-------------------------------------------------------------------------"
进程名称:
"
;
for(i=0;
setw(8)<
m[i].number<
到达时间:
服务时间:
m[i].ServiceTime<
完成时间:
FinishedTime[i]<
周转时间:
WholeTime[i]<
带权周转:
setiosflags(ios:
fixed)<
setprecision
(2)<
WeightWholeTime[i]<
--------------------------------------------------------------------------"
平均周转时间为:
Average_WT<
平均带权周转时间为:
Average_WWT<
DestroyQueue(Q);
//初始化链队列Q
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
Q.front->
next=NULL;
return1;
//销毁链队列Q
while(Q.front)
Q.rear=Q.front->
next;
free(Q.front);
Q.front=Q.rear;
//入队
Q,QElemTypee)
QueuePtrp=(QueuePtr)malloc(sizeof(QNode));
p->
data=e;
p->
Q.rear->
next=p;
Q.rear=p;
//出队,并用e返回出队节点的元素值
QueuePtrp;
if(Q.front==Q.rear)
return0;
p=Q.front->
e=p->
data;
next=p->
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returne;
//判断链队列Q是否为空
intQueueEmpty(LinkQueue&
returntrue;
else
returnfalse;
//选择排序,对结构体中的关键字到达时间,按从小到大的顺序排列。
voidchioce(structPCBpcb[],intn)
inti,j;
structPCBt;
for(j=0;
j<
n-1;
j++)
for(i=0;
n-1-j;
if(pcb[i].ArrivalTime>
pcb[i+1].ArrivalTime)
t=pcb[i];
pcb[i]=pcb[i+1];
pcb[i+1]=t;
}
voidcaidan()
*************************主页***********************"
*******************1.进程创建及结果*****************"
*******************2.结束******************"
voidcreate()
请输入进程总数n的值(0<
n<
=100):
while(n<
0||n>
100)
你输入的n的值不正确,请重新输入!
cin>
请依次输入各个进程的名称:
m[i].number;
请依次输入各个进程的到达时间(ArrivalTime>
=0):
for(i=0;
m[i].ArrivalTime;
while(m[i].ArrivalTime<
cin>
请依次输入各个进程的服务时间(ServiceTime>
m[i].ServiceTime;
while(m[i].ServiceTime<
m[i].ServiceTime;
请输入时间片q的值(0<
q<
=200):
q;
while(q<
0||q>
200)
你输入的q值不正确,请重新输入!
运行过程如下:
RR(&
m[0].ArrivalTime,&
m[0].ServiceTime,n,q,Q);
//调用RR算法
7.2参考文献
[1]汤小丹等编著.操作系统(第三版)[M].西安:
西安电子科技大学出版社,2007,5.
[2]郑莉、董渊等编著.C++语言程序设计(第四版)[M].北京:
清华大学出版社,2010,7.
[3]李春葆、喻丹丹等编著.数据结构教程(第三版)[M].北京:
清华大学出版社,2011,6.
8.评分表
计算机与通信学院课程设计评分表
课程名称:
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)