操作系统时间片轮转算法.docx
《操作系统时间片轮转算法.docx》由会员分享,可在线阅读,更多相关《操作系统时间片轮转算法.docx(9页珍藏版)》请在冰豆网上搜索。
操作系统时间片轮转算法
进程时间片轮转调度算法
一、 实验题目:
进程时间片轮转调度算法
二、实验原理:
在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。
对调度的处理又都可采用不同的调度方式和调度算法。
调度算法是指:
根据系统的资源分配策略所规定的资源分配算法。
三、实验目的:
1、加深对进程概念的理解,明确进程和程序的区别。
2、深入系统如何组织进程、创建进程。
3、进一步认识如何实现处理器调度。
4、通过对进程调度算法的设计,深入理解进程调度的原理。
5、加深对时间片轮转调度算法的理解。
四、实验要求:
用C语言编写程序完成单处理机的进程调度,要求采用时间片轮转调度算法。
实验具体要求包括:
首先确定作业控制块的内容和组成方式;然后完成作业调度;最后编写主函数,并对所做工作进行测试。
5、运行结果
时间片大小为1时(q=1):
时间片大小为4时(q=4):
6、代码
#include"stdafx.h"
#include
#include
#include
#include
#defineOK0
#defineOVERFLOW1
charpro[20];//进程
intprocessNum;//进程数
inttimeSlice=0;//时间片
typedefcharQlemTypeChar;
typedefintQlemTypeInt;
typedefintStatus;
typedefstructQNode
{
QlemTypeChardata;
QlemTypeInttimeArrive=0;
QlemTypeInttimeService=0;
QlemTypeInttimeCount=0;
QlemTypeIntrunCount=0;
QlemTypeInttimeFinal=0;//完成时间
QlemTypeInttimeRound=0;//周转时间
floattimeRightRound=0;//带权周转时间
QlemTypeCharproState='W';//进程的状态,W——就绪态,R——执行态,F——完成态
structQNode*next;//链表指针
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;//队头指针
QueuePtrrear;//队尾指针
}LinkQueue;
StatusInitQueue(LinkQueue&Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.front)exit(OVERFLOW);
Q.front->next=NULL;
returnOK;
}
StatusEnQueue(LinkQueue&Q,QlemTypeChare){
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
returnOK;
}
StatusDeQueue(LinkQueue&Q,QlemTypeChar&e){
QueuePtrp;
if(Q.front==Q.rear)returnERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
returnOK;
}
LinkQueueQPro;
QNodeqq[10];
voidProGetFirst(){//取出就绪队列队首进程
InitQueue(QPro);
printf("请输入要创建的进程名称:
\n");
for(inti=0;ifflush(stdin);
scanf_s("%c",&pro[i]);
}
fflush(stdin);
for(inti=0;iqq[i].data=pro[i];
EnQueue(QPro,qq[i].data);
}
}
voidscanfData(){
printf("请输入要创建的进程数目:
");
scanf_s("%d",&processNum);
processNum++;
fflush(stdin);
printf("\n");
ProGetFirst();
printf("创建进程到达时间:
\n");
inttime_Arr[10];
for(inti=0;iscanf_s("%d",&time_Arr[i]);
}
for(inti=0;iqq[i].timeArrive=time_Arr[i];
EnQueue(QPro,qq[i].timeArrive);
}
printf("创建进程服务时间:
\n");
inttime_Ser[10];
for(inti=0;iscanf_s("%d",&time_Ser[i]);
}
for(inti=0;iqq[i].timeService=time_Ser[i];
EnQueue(QPro,qq[i].timeService);
}
printf("请输入时间片大小:
:
");
scanf_s("%d",&timeSlice);
printf("\n");
}
voidProOutPut1(){//获取进程信息
printf("进程名\t到达时间\t服务时间\t进程状态\t执行次数\n");
for(inti=0;iprintf("%c\t\t%d\t\t%d\t\t%c\t\t%d\n",qq[i].data,qq[i].timeArrive,qq[i].timeService,qq[i].proState,qq[i].runCount);
}
}
voidCalculatetimeFinal(){//计算完成时间
inttimecou=0;
intcountTemp=0;
QlemTypeCharee;
for(inti=0;i{
countTemp+=qq[i].timeService;
}
while(timecoufor(inti=0;i{
if(qq[i].timeFinal==0)
{
if(qq[i].timeService-qq[i].timeCount>=timeSlice)
{
timecou+=timeSlice;
}
else
{
timecou+=(qq[i].timeService-qq[i].timeCount);
//DeQueue(QPro,ee);
}
if(timeSlice{
inttimetemp=timeSlice>qq[i].timeService?
qq[i].timeService:
timeSlice;
if((qq[i].timeCount+timetemp){
if(qq[i].timeService-qq[i].timeCount>=timeSlice)
{
qq[i].timeCount+=timeSlice;
}
else
{
qq[i].timeCount+=(qq[i].timeService-qq[i].timeCount);
}
}
else
{
if(qq[i].timeFinal==0)
{
qq[i].timeFinal=timecou;
}
}
}
else//时间片大小>=服务时间
{
qq[i].timeFinal=timecou;//该进程的完成时间=count
}
}
}
}
for(inti=0;i{
qq[i].timeRound=qq[i].timeFinal-qq[i].timeArrive;
qq[i].timeRightRound=(float)qq[i].timeRound/qq[i].timeService;
}
}
voidProOutPut2(){//获取进程处理后的信息
printf("进程名\t到达时间服务时间完成时间周转时间带权周转\n");
for(inti=0;iprintf("%c\t\t%d\t%d\t%d\t%d\t%.2f\n",qq[i].data,qq[i].timeArrive,qq[i].timeService,qq[i].timeFinal,qq[i].timeRound,qq[i].timeRightRound);
}
}
int_tmain(intargc,_TCHAR*argv[])
{
scanfData();
ProOutPut1();
CalculatetimeFinal();
printf("\n");
printf("CPU处理中......\n");
printf("完成时间:
");
for(inti=0;iprintf("%d,",qq[i].timeFinal);
}
printf("\n");
printf("周转时间:
");
for(inti=0;iprintf("%d,",qq[i].timeRound);
}
printf("\n");
printf("带权周转时间:
");
for(inti=0;iprintf("%.2f,",qq[i].timeRightRound);
}
printf("\n");
ProOutPut2();
return0;
}