基于优先数的时间片轮转调度算法调度处理器.docx
《基于优先数的时间片轮转调度算法调度处理器.docx》由会员分享,可在线阅读,更多相关《基于优先数的时间片轮转调度算法调度处理器.docx(14页珍藏版)》请在冰豆网上搜索。
![基于优先数的时间片轮转调度算法调度处理器.docx](https://file1.bdocx.com/fileroot1/2022-11/25/a1d8ead6-ffbd-4f94-8928-696bc4261850/a1d8ead6-ffbd-4f94-8928-696bc42618501.gif)
基于优先数的时间片轮转调度算法调度处理器
基于优先数的时间片轮转调度算法调度处理器
题目4基于优先数的时间片轮转调度算法调度处理器
一、实验目的
在采用多道程序设计的系统中,同时处于就绪态的进程往往有多个,当就绪态的进程数大于处理器的个数时,就需按照某种策略进行分配处理器。
本次设计模拟在单处理器情况下采用基于优先数的时间片轮转调度算法进行处理器调度,加深了解处理器调度工作过程。
二、实验内容及要求
1、设计一个程序实现基于优先数的时间片轮转调度算法调度处理器。
2、假定系统有5个进程,每个进程用一个进程控制块PCB开代表,进程控制块的结构如下图1.2所示:
进程名
指针
到达时间
要求运行时间
已运行时间
优先数
进程状态
图1
其中:
进程名:
作为进程的标识。
指针:
进程按顺序排成循环链表,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址。
要求运行时间:
假设进程需要运行的单位时间数。
已运行时间:
假设进程已经运行的单位时间数,初值为0。
状态:
可假设有两种状态,就绪状态和结束状态。
进程的初始状态都为就绪状态。
3、每次运行所设计的处理器调度程序调度进程之前,为每个进程任意确定它的要求运行时间。
4、此程序是模拟处理器调度,因此,被选中的进程并不实际启动运行,而是执行
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位时间。
.5、在所设计的程序中应有显示或打印语句,能显示或打印每次被选中的进程名以及运行一次后进程队列的变化。
6、为进程任意确定要求运行时间,运行所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
7、设有一个就绪队列,就绪进程按优先数(优先数范围0-100)由小到大排列(优先数越小,级别越高)。
当某一进程运行完一个时间片后,其优先级应下调(如优先数加2或3)。
8、例如一组进程如下表:
进程名
A
B
C
D
E
F
G
H
J
K
L
M
到达时间
0
1
2
3
6
8
12
12
12
18
25
25
服务时间
6
4
10
5
1
2
5
10
4
3
15
8
三、实验报告
1、程序中使用的数据结构及符号说明。
2、给出主要算法的流程图
3、给出程序清单并附上注释
4、打印程序运行时的初值和运行结果。
(运行一个进程输出一次结果)
三、实验代码
#include
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))//为进程创建一个空间
structworktime{
floatTb;//作业运行时刻
floatTc;//作业完成时刻
floatTi;//周转时间
floatWi;//带权周转时间
};
structjcb{
charname[10];//作业名
floatsubtime;//作业到达时间
floatruntime;//作业所需的运行时间
charresource;//所需资源
floatRp;//后备作业响应比
charstate;//作业状态
intworked_time;//已运行时间
structworktimewt;
intneed_time;//要求运行时间
intflag;//进程结束标志
structjcb*link;//链指针
}*ready=NULL,*p;
typedefstructjcbJCB;
floatT=0;
intN;
JCB*front,*rear;//时间轮转法变量
voidsort()
{
JCB*first,*second;
intinsert=0;//插入数
if((ready==NULL)||((p->subtime)<(ready->subtime)))
{
p->link=ready;
ready=p;
T=p->subtime;
p->Rp=1;
}
else
{
first=ready;
second=first->link;
while(second!
=NULL)
{
if((p->subtime)<(second->subtime))
{
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=p;
}
}
voidSJFget()
{
JCB*front,*mintime,*rear;
intipmove=0;
mintime=ready;
rear=mintime->link;
while(rear!
=NULL)
{
if((rear!
=NULL)&&(T>=rear->subtime)&&(mintime->runtime)>(rear->runtime))
{
front=mintime;
mintime=rear;
rear=rear->link;
ipmove=1;
}
else
rear=rear->link;
}
if(ipmove==1)
{
front->link=mintime->link;
mintime->link=ready;
}
ready=mintime;
}
voidHRNget()
{
JCB*front,*mintime,*rear;
intipmove=0;
mintime=ready;
rear=mintime->link;
while(rear!
=NULL)
if((rear!
=NULL)&&(T>=rear->subtime)&&(mintime->Rp)<(rear->Rp))
{
front=mintime;
mintime=rear;
rear=rear->link;
ipmove=1;
}
else
rear=rear->link;
if(ipmove==1){
front->link=mintime->link;
mintime->link=ready;
}
ready=mintime;
}
voidcreatJCB()//为每个作业创建一个JCB并初始化形成一个循环链队列
{
JCB*p,*l;
inti=0;
l=(JCB*)malloc(sizeof(JCB));
printf("\n请输入作业的个数:
");
scanf("%d",&N);
printf("\n作业号No.%d:
\n",i);
printf("\n请输入作业的名字:
");
scanf("%s",l->name);
printf("\n请输入作业的时间:
");
scanf("%d",&l->need_time);
l->state='r';//作业初始状态为就绪
l->worked_time=0;
l->link=NULL;
l->flag=0;
front=l;
for(i=1;i{
p=(JCB*)malloc(sizeof(JCB));
printf("\n作业号No.%d:
\n",i);
printf("\n请输入作业的名字:
");
scanf("%s",p->name);
printf("\n请输入作业的时间:
");
scanf("%d",&p->need_time);
p->state='r';
p->worked_time=0;
p->flag=0;
l->link=p;
l=l->link;
}
rear=l;rear->link=front;
}
voidoutput()//进程输出函数
{
intj;
printf("nameruntimeneedtimestate\n");
for(j=1;j<=N;j++){printf("%-4s\t%-4d\t%-4d\t%-c\n",front->name,front->worked_time,front->need_time,front->state);
front=front->link;
}
printf("\n");
}
intjudge(JCB*p)//判断所有进程运行结束
{
intflag=1,i;
for(i=0;i{
if(p->state!
='e')
{
flag=0;
break;}
p=p->link;
}
returnflag;
}
voidRRget()//时间片轮转算法
{
JCB*s;
intflag1=0;
s=(JCB*)malloc(sizeof(JCB));
s=front;
printf("\n--------------------------------------------\n");
output();
printf("请输入任意一键继续\n");
getch();//按任意键继续
s=front;
while(flag1!
=1)
{
if(s->state=='r')
{
s->worked_time++;
s->need_time--;
if(s->need_time==0)
s->state='e';
output();
printf("请输入任意一键继续...\n");
getch();
}
if(s->state=='e'&&s->flag==0)
{
printf("进程%s已经运行完成!
\n\n",s->name);
s->flag=1;
}
s=s->link;
flag1=judge(s);
}
printf("--------------------------------------------\n");
}
voidinput()
{
inti,num;
printf("\n请输入作业的个数:
");
scanf("%d",&num);
for(i=0;i{
printf("\n作业号No.%d:
\n",i);
p=getpch(JCB);
printf("\n输入作业名:
");
scanf("%s",p->name);
printf("\n输入作业到达时刻:
");
scanf("%f",&p->subtime);
printf("\n输入作业运行时间:
");
scanf("%f",&p->runtime);
printf("\n");
p->state='w';
p->link=NULL;
sort();
}
}
intspace()
{
intl=0;JCB*jr=ready;
while(jr!
=NULL)
{
l++;
jr=jr->link;
}
return(l);
}
voiddisp(JCB*jr,intselect)
{
if(select==3)printf("\n作业到达时间服务时间响应比运行时刻完成时刻周转时间带权周转时间\n");
elseprintf("\n作业到达时间服务时间运行时刻完成时刻周转时间带权周转时间\n");
printf("|%s\t",jr->name);
printf("|%.2f\t",jr->subtime);
printf("|%.2f\t",jr->runtime);
if(select==3&&p==jr)printf("|%.2f",jr->Rp);
if(p==jr){
printf("|%.2f\t",jr->wt.Tb);
printf("|%.2f",jr->wt.Tc);
printf("|%.2f\t",jr->wt.Ti);
printf("|%.2f",jr->wt.Wi);
}
printf("\n");
}
intdestroy()
{
printf("\n作业[%s]已完成.\n",p->name);
free(p);
return
(1);
}
voidcheck(intselect)
{
JCB*jr;
printf("\n****当前正在运行的作业是:
%s",p->name);
disp(p,select);
jr=ready;
printf("\n****当前就绪队列状态为:
\n");
while(jr!
=NULL)
{
jr->Rp=(jr->runtime+T-jr->subtime)/jr->runtime;
disp(jr,select);
jr=jr->link;
}
destroy();
}
voidrunning(JCB*jr)
{
if(T>=jr->subtime)jr->wt.Tb=T;
elsejr->wt.Tb=jr->subtime;
jr->wt.Tc=jr->wt.Tb+jr->runtime;
jr->wt.Ti=jr->wt.Tc-jr->subtime;
jr->wt.Wi=jr->wt.Ti/jr->runtime;
T=jr->wt.Tc;
}
intmain()
{
intselect=0,len,h=0;
floatsumTi=0,sumWi=0;
printf("\t---*****************---\n");
printf("请选择作业调度算法的方式:
\n");
printf("\t1.FCFS2.SJF3.HRN4.RR\n\n");
printf("\t---*****************---\n");
printf("请输入作业调度算法序号(1-4):
");
scanf("%d",&select);
if(select==4)
{creatJCB();
RRget();}
else
{
input();
len=space();
while((len!
=0)&&(ready!
=NULL))
{
h++;
printf("\n执行第%d个作业\n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
running(p);
sumTi+=p->wt.Ti;
sumWi+=p->wt.Wi;
check(select);
if(select==2&&hif(select==3&&hprintf("\n按任意一键继续......");
getchar();
getchar();
}
printf("\n\n作业已经完成.\n");
printf("\t此组作业的平均周转时间:
%.2f\n",sumTi/h);
printf("\t此组作业的带权平均周转时间:
%.2f\n",sumWi/h);
getchar();}
}
四、运行结果截图