CPU调度算法Word文档下载推荐.docx
《CPU调度算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《CPU调度算法Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
structPCB*next;
}pcb;
inttime;
intn;
pcb*head=NULL,*p,*q;
voidrun_fcfs(pcb*p1)
{time=p1->
arrivetime>
time?
p1->
arrivetime:
time;
starttime=time;
printf("
\n现在时间是%d,开始运行作业%s\n"
time,p1->
name);
time+=p1->
servicetime;
state="
T"
;
finishtime=time;
turnaroundtime=p1->
finishtime-p1->
arrivetime;
weightedturnaroundtime=p1->
turnaroundtime/p1->
到达时间开始时间服务时间完成时间周转时间带权周转时间\n"
);
%6d%10d%10d%8d%10.1f%10.2f\n"
arrivetime,p1->
starttime,p1->
servicetime,p1->
finishtime,p1->
turnaroundtime,p1->
weightedturnaroundtime);
}
voidfcfs()
{inti,j;
p=head;
for(i=0;
i<
n;
i++)
{if(p->
state=='
F'
)
{q=p;
run_fcfs(q);
p=p->
next;
voidgetInfo()
{intnum;
\n作业个数:
"
scanf("
%d"
&
n);
for(num=0;
num<
num++)
{p=(pcb*)malloc(sizeof(pcb));
依次输入:
进程名到达时间服务时间\n"
%s%d%d"
p->
name,&
arrivetime,&
servicetime);
if(head==NULL)
{head=p;
q=p;
time=p->
if(p->
arrivetime<
time)time=p->
q->
next=p;
starttime=0;
finishtime=0;
turnaroundtime=0;
weightedturnaroundtime=0;
next=NULL;
state='
voidmain()
{system("
graftabl936"
先来先服务算法模拟"
getInfo();
fcfs();
getch();
2、非抢占SJF
conio.h>
#defineMAX100
structjcb{
floatarrivetime;
floatstarttime;
floatfinishtime;
floatservicetime;
floatzztime;
floatavezztime;
};
structjcba[MAX];
voidinput(jcb*p,intN)
{inti;
请分别输入\n\t进程名到达时间服务时间\n\n"
=N-1;
{printf("
请输入第%d个进程信息:
i+1);
%s%f%f"
p[i].name,&
p[i].arrivetime,&
p[i].servicetime);
\n"
}
voidPrint(jcb*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatavezztime,intN)
{intk;
printf("
调度顺序:
%s"
p[0].name);
for(k=1;
k<
N;
k++)
{printf("
-->
p[k].name);
\n\n"
\t\t\t进程信息:
\nname\tarrive\tservice\tstart\tfinish\tzz\tavezz\n"
for(k=0;
%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n"
p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].avezztime);
voidsort(jcb*p,intN)
{inti,j;
for(i=0;
for(j=0;
j<
=i;
j++)
if(p[i].arrivetime<
p[j].arrivetime)
{jcbtemp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
voiddeal(jcb*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&
zztime,float&
avezztime,intN)
for(k=0;
{if(k==0)
{p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;
else
{p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;
p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].avezztime=p[k].zztime/p[k].servicetime;
voidjcbf(jcb*p,intN)
{floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,avezztime=0;
intm,n,next,k,i=0;
floatmin;
sort(p,N);
for(m=0;
m<
N-1;
m++)
if(m==0)
p[m].finishtime=p[m].arrivetime+p[m].servicetime;
p[m].finishtime=p[m-1].finishtime+p[m].servicetime;
for(n=m+1;
n<
n++)
{if(p[n].arrivetime<
=p[m].finishtime)
i++;
min=p[m+1].servicetime;
next=m+1;
m+i;
{if(p[k+1].servicetime<
min)
{min=p[k+1].servicetime;
next=k+1;
{jcbtemp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);
Print(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);
intmain()
{intN,*b;
charch;
while
(1){
system("
CLS"
\t\t\t------短作业优先调度算法------\n"
输入进程个数:
scanf("
N);
if(N>
MAX){
\t!
!
输入的作业数目太大,请输入不大于%d的整数\n"
MAX);
按Q或者q退出程序,按其他任意键继续测试..."
ch=getch();
if(ch=='
Q'
||ch=='
q'
){
break;
elsecontinue;
input(a,N);
jcb*b=a;
jcbf(b,N);
return0;
getch();
3、可抢占优先权调度算法
dos.h>
time.h>
string.h>
typedefcharstring[10];
structtask{
stringname;
intarrTime;
intserTime;
intwaiTime;
intbegTime;
intfinTime;
intturTime;
intwTuTime;
intpriority;
intfinish;
}JCB[10];
intnum;
voidinput()
inti;
cls"
\n请输入作业数量:
num);
num;
\n请输入作业NO.%d:
i);
作业名称:
JCB[i].name);
到达时间:
JCB[i].arrTime);
服务时间:
JCB[i].serTime);
JCB[i].priority=0;
JCB[i].finish=0;
intHRN(intpre)
{
intcurrent=1,i,j;
JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime;
JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
if(!
JCB[i].finish)
current=i;
for(j=i;
JCB[j].finish)
if(JCB[current].arrTime<
=JCB[pre].finTime)
if(JCB[j].arrTime<
=JCB[pre].finTime&
&
JCB[j].priority>
JCB[current].priority)
current=j;
else
JCB[current].arrTime)
if(JCB[j].arrTime==JCB[current].arrTime)
if(JCB[j].priority>
returncurrent;
voidruning(inti,inttimes,intpre,intstaTime,intendTime)
if(times=0)
JCB[i].begTime=JCB[i].arrTime;
JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;
JCB[i].turTime=JCB[i].serTime;
JCB[i].wTuTime=1.0;
staTime=JCB[i].begTime;
if(JCB[i].arrTime>
JCB[pre].finTime)
JCB[i].begTime=JCB[pre].finTime;
JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;
JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;
if(times==num-1)
endTime=JCB[i].finTime;
JCB[i].finish=1;
voidprint(inti,inttimes)
if(times==0)
名称到达时间服务时间开始时间完成时间周转时间带权周转时间\n"
%3s%9d%9d%9d%9d%9d%9d\n"
JCB[i].name,JCB[i].arrTime,JCB[i].serTime,JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);
voidcheck()
inti;
intstaTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime;
intcurrent=0,times=0,pre=0;
JCB[pre].finTime=0;
JCB[i].finish=0;
staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime;
current=0;
times=0;
pre=0;
-------------------------------------------\n"
-------HRRN-------------------------------------\n"
for(times=0;
times<
times++)
current=HRN(pre);
runing(current,times,pre,staTime,endTime);
print(current,times);
pre=current;
sumTurTime+=JCB[i].turTime;
sumWTuTime+=JCB[i].wTuTime;
aveturTime=sumTurTime/num;
aveWTuTime=sumWTuTime/num;
<
计与平均值>
%9d%9d%9d%9d\n"
NULL,sumTurTime,aveturTime,aveWTuTime);
-------------------------------------------------------\n"
voidmain()
charagain;
system("
do{
请输入4组数据:
input();
check();
Continue...(Y/N):
again=getch();
}while(again!
='
Y'
again!
y'
N'
n'
}while(again=='
||again=='
六、运行结果
七、实验总结
1、FCFS算法,即先来先服务,就是每次从就绪队列中选择一个最先进入队列
的进程,把CPU分配给它,令它运行。
该进程一直运行下去,直到完成,或者由于某种原因而阻塞,才会放弃CPU。
FCFS算法比较有利于长作业,而不利于短作业。
另外,FCFS调度算法对CPU繁忙型作业较有利,而不利于I/O繁忙型作业。
2、短作业优先法(SJF),是指分派CPU时,把CPU优先分给最短的作业。
SJF算法在作业调度上用的很多。
它的缺点是对长作业不利,并且不能保证及时处理紧迫性作业。
3、优先权算法指后备作业中选择一批优先权相对高的调入存。
4、最高响应比优先法(HRN)是对FCFS方式和SJF方式的一种综合平衡。
HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
响应比R定义如下:
R=(W+T)/T=1+W/T。
5、作业调度的实现主要有两个问题:
一个是如何将系统中的作业组织起来;
另一个是如何进行作业调度。
6、为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如,作业名‘作业执行时间、指向下一个作业控制块的指针等信息。
这个记录作业相关信息的数据块称为作业控制块JCB,并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。