低级调度Word文档格式.docx

上传人:b****5 文档编号:16693930 上传时间:2022-11-25 格式:DOCX 页数:17 大小:230.59KB
下载 相关 举报
低级调度Word文档格式.docx_第1页
第1页 / 共17页
低级调度Word文档格式.docx_第2页
第2页 / 共17页
低级调度Word文档格式.docx_第3页
第3页 / 共17页
低级调度Word文档格式.docx_第4页
第4页 / 共17页
低级调度Word文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

低级调度Word文档格式.docx

《低级调度Word文档格式.docx》由会员分享,可在线阅读,更多相关《低级调度Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

低级调度Word文档格式.docx

如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列……,如此下去,当一个长作业进程从第一队列依次降到第N队列后,在第N队列中便采取时间片轮转的方式运行。

(c)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。

三、课程设计的要求

1、按照给出的题目内容

(1)完成系统数据结构设计与实现、系统算法设计与实现、系统模块设计与实现、系统总体的设计与实现。

(2)系统需要一个简单操作界面,例如:

===========================

1.先来先服务调度

2.多级反馈队列调度

3.退出

(按数字1、2、3,选择操作)

(3)对每种调度算法都要求输出每个进程(进程数不少于5)开始运行时刻、完成时刻、周转时间,以及这组进程的平均周转时间。

(4)画出每种调度算法流程图。

2、写出课程设计报告,设计报告提交形式:

电子文档提交

3、个人独立完成。

4、完成时间(1周)

四、课程设计过程

1、系统中所使用的数据结构及说明

//-----------------数据结构的定义----------------------------

//定义进程控制块PCB

typedefstructPCB

{

charPID[5];

//进程标示符

charName[10];

//进程名称

intPRI;

//进程的优先级(越小越高)

floatNeedTime;

//进程要求运行时间(服务时间)

floatStartTime;

//进程进入就绪队列的时间(到达时间)

floatRunBeginTime;

//开始运行时间

floatUpTime;

//进程已运行时间

floatOverTime;

//进程运行完成的时间

floatTurnaroundTime;

//周转时间

floatRightTTime;

//带权周转时间

structPCB*next;

}PCB,*QueuePtr;

//定义进程队列

typedefstruct

QueuePtrfront,rear;

//队头、队尾指针

}PQueue;

2、系统功能结构

本系统是处理机低级调度模拟系统,主要通过模拟来实现处理机调度,先来先服务调度(FCFS)、多级反馈队列调度(FB)两种调度方式。

系统运行过程如下:

输入进程个数,输入进程详细信息,通过简单操作界面来选择调度方式,调度的过程和结果,重新选择调度方式或者选择结束。

3、调度算法流程图(如下图所示)

4、程序清单及其描述

#include<

stdio.h>

stdlib.h>

math.h>

malloc.h>

process.h>

#defineNULL0

intProcessNum;

//进程个数

floatAverageTurnoverTime;

//平均周转时间

floatAverageRightTTime;

//平均带权周转时间

//-----------------函数结果状态代码----------------------------

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

//进程名称

//进程要求运行时间(服务时间)

//开始运行时间

//进程运行完成的时间

//-----------------函数的申明---------------------------------

intInitQueue(PQueue&

Q);

//构造一个空队列

intEnQueue(PQueue&

//插入一个新的进程到队尾

intQueueEmpty(PQueueQ);

//队列判空,若Q为空队列,则返回1,否则返回0

voidPoolQueue(PQueue*Q);

//建立后备队列

intprint(PQueueQ);

//进程队列输出

voidFCFSsort(PQueue&

//先来先服务调度的对到达时间进行排序

voidSPFsort(PQueue&

//短进程优先调度的对服务时间进行排序

voidHRNsort(PQueue&

//高响应比优先调度的对服务时间进行排序

voidDispatcher(PQueue&

//先来先服务调度

voidFB(PQueue&

//多级反馈队列调度

voidManagesChooses(PQueue&

//调度方式选择

//--------------------------------函数的定义---------------------------------

//--------------------------------构造一个空队列---------------------------------

Q)

Q.front=Q.rear=(QueuePtr)malloc(sizeof(PCB));

if(!

Q.front)

exit(0);

Q.front->

next=NULL;

return1;

}

//--------------------------------插入一个新的进程到队尾---------------------------------

{

QueuePtrp;

(p=(QueuePtr)malloc(sizeof(PCB))))//存储分配失败

scanf("

%s"

p->

PID);

//输入进程标示符

Name);

//输入进程名

%d%f%f"

&

p->

PRI,&

NeedTime,&

StartTime);

//输入进程优先级、要求运行时间、到达时间

p->

Q.rear->

next=p;

Q.rear=p;

//--------------------------------队列判空,若Q为空队列,则返回1,否则返回0---------------------------------

intQueueEmpty(PQueueQ)

{//若Q为空队列,则返回1,否则返回0

if(Q.front==Q.rear)

return1;

else

return0;

//--------------------------------建立后备队列---------------------------------

voidPoolQueue(PQueue*Q)

inti;

printf("

请输入进程的个数:

"

);

%d"

ProcessNum);

请输入%d个进程的信息(T代表时间)\n标示符进程名优先级服务T到达T\n"

ProcessNum);

for(i=1;

i<

=ProcessNum;

i++)

EnQueue(*Q);

//--------------------------------进程队列输出---------------------------------

intprint(PQueueQ)

p=Q.front->

next;

(T代表时间)\n标示符进程名优先级服务T到达T\n"

while(p!

=NULL)//当队列不空

{

printf("

%s\t%s\t%d\t%4.3f\t%4.3f\n"

PID,p->

Name,p->

PRI,p->

NeedTime,p->

p=p->

}

//--------------------------------先来先服务调度的对到达时间进行排序---------------------------------

Q)

QueuePtrtail,p=Q.front;

QueuePtrq=p->

tail=NULL;

for(;

next->

next!

=tail;

p=Q.front,q=p->

next)//选择排序

while(q->

=tail)

{

if(p->

StartTime>

q->

StartTime)

{

p->

next=q->

q->

next=q;

}

p=p->

q=p->

}

tail=q;

//--------------------------------调度---------------------------------

Q)

floatSumTurnaroundTime=0;

//定义周转时间总和并赋值0

floatSumRightTTime=0;

//定义带权周转时间总和并赋值0

floatdeltaT,Time=0;

//deltaT是时间差

QueuePtrp=Q.front->

(T代表时间)\n标示符进程名到达T服务T开始T完成T周转T带权周转T\n"

p!

=NULL;

p=p->

next)

if(p->

StartTime>

Time)

deltaT=p->

StartTime-Time;

Time=deltaT;

}

p->

RunBeginTime=Time;

OverTime=Time+p->

NeedTime;

TurnaroundTime=p->

OverTime-p->

StartTime;

RightTTime=p->

TurnaroundTime/p->

%s\t%s\t%4.3f\t%4.3f\t%4.3f\t%4.3f\t%4.3f\t%4.3f\n"

StartTime,p->

RunBeginTime,p->

OverTime,p->

TurnaroundTime,p->

RightTTime);

Time=p->

OverTime;

for(p=Q.front->

next)//计算平均周转时间和平均带权周转时间

SumTurnaroundTime=SumTurnaroundTime+p->

TurnaroundTime;

SumRightTTime=SumRightTTime+p->

RightTTime;

AverageTurnoverTime=SumTurnaroundTime/ProcessNum;

AverageRightTTime=SumRightTTime/ProcessNum;

此调度方式的平均周转时间为%4.3f,平均带权周转时间为%4.3f\n"

AverageTurnoverTime,AverageRightTTime);

//--------------------------------多级反馈队列调度---------------------------------

PQueueM,N;

InitQueue(M);

//初始化第二队列

InitQueue(N);

//初始化第三队列

FCFSsort(Q);

调度前进程排列如下:

\n"

print(Q);

QueuePtrp,q,r;

q=M.front;

r=N.front;

floati,deltaT,Time=0;

//deltaT是时间差

floatT1,T2,T3;

T1=2*1-1;

//第一队列Q的时间片

T2=2*2-1;

//第二队列M的时间片

T3=2*3-1;

//第三队列M的时间片

\n调度过程如下:

for(p=Q.front;

next)//第一队列的调度

for(i=Time+1;

=p->

printf("

第%4.3f时刻,等待队列到来!

i);

Time=Time+deltaT;

NeedTime<

=T1)

p->

UpTime=p->

第%4.3f时刻,进程标示符%s\t进程名%s运行中,已运行了%4.3f时刻!

i,p->

Name,i-Time);

printf("

第%4.3f时刻,进程标示符%s\t进程名%s运行完成!

Time=p->

else

UpTime=T1;

for(i=1;

=T1;

RunBeginTime+i,p->

Name,i);

q->

next=p->

q=q->

Time=Time+T1;

for(p=M.front;

next)//第二队列的调度

if((p->

NeedTime-p->

UpTime)<

=T2)

UpTime;

UpTime+i-Time);

=T2;

Time+i,p->

Name,i+p->

UpTime);

r->

r=r->

UpTime+T2;

Time=Time+T2;

r->

for(p=N.front;

next)//第三队列的调度

for(i=Time+1;

//--------------------------------调度方式选择---------------------------------

\n\n\n\t请选择调度方式:

===========================\n"

1.先来先服务调度\n"

2.多级反馈队列调度\n"

3.退出\n"

(按数字1、2、3,选择操作)\n"

i);

switch(i)

case1:

FCFSsort(Q);

先来先服务调度的对到达时间进行排序的排序结果如下:

print(Q);

\n调度后的结果如下:

Dispatcher(Q);

ManagesChooses(Q);

break;

case2:

FB(Q);

ManagesChooses(Q);

case3:

break;

//--------------------------------主函数---------------------------------

voidmain()

intn;

PQueueQ;

I

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1