时间片轮转调度算法Word文档下载推荐.docx
《时间片轮转调度算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《时间片轮转调度算法Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
R'
:
运行,'
W'
:
等待,'
F'
结束*/
structnode*next;
/*指向下一个进程的链指针*/
}PCB;
PCB*finish,*ready,*tail,*run;
/*指向三个队列的队首的指针,
finish为完成队列头指针,
ready为就绪队列头指针,
tail为就绪队列的队尾指针,
run为当前运行进程头指针*/
intN;
/*定义进程的数目*/
voidfirstin(void);
//调度就绪队列的第一个进程投入运行;
voidprint1(chara);
//打印表头行信息
voidprint2(charchose,PCB*p);
//打印每一行的状态信息
voidprint(charchose);
//打印每执行一次算法后所有的进程的状态信息
voidinsert_prio(PCB*q);
//在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;
voidprior_init(charchose);
//进程优先级法初始化将进程按优先级插入到就绪队列里voidpriority(charchose);
//进程优先级算法总函数
voidinsert_rr(PCB*q);
//在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;
voidroundrun_init(charchose);
//循环轮转法初始化将就绪队列保存为FIFO队列
voidroundrun(charchose);
//循环轮转法总算法
voidmain()//主函数
charchose='
'
;
while((chose!
='
e'
)&
&
(chose!
E'
))
fflush(stdin);
system("
cls"
);
/*printf("
\t\t\t两种进程调度算法的模拟\n\n"
printf("
\tP.进程优先级算法模拟\n\n"
*/
\tR.循环轮转算法模拟\n\n"
\tE.退出程序\n\n"
\t请输入你的选择:
"
scanf("
%c"
&
chose);
if((chose!
/*if((chose=='
P'
)||(chose=='
p'
prior_init(chose);
priority(chose);
}*/
/*else*/if((chose=='
r'
roundrun_init(chose);
roundrun(chose);
}
\n\t\t谢谢使用!
!
\n"
voidfirstin(void)//调度就绪队列的第一个进程投入运行;
if(ready!
=NULL)
run=ready;
ready=ready->
next;
run->
state='
next=NULL;
else
run=NULL;
voidprint1(chara)//打印表头行信息
if(toupper(a)=='
)
namecputimeneedtimeprioritystate\n"
namecputimeneedtimecountroundstate\n"
voidprint2(charchose,PCB*p)//打印每一行的状态信息
if(toupper(chose)=='
%s\t%d\t%d\t%d\t%c\n"
p->
name,p->
cputime,p->
needtime,p->
prio,p->
state);
%s\t%d\t%d\t%d\t%d\t%c\n"
count,p->
round,p->
voidprint(charchose)//打印每执行一次算法后所有的进程的状态信息
PCB*p;
print1(chose);
if(run!
print2(chose,run);
p=ready;
while(p!
print2(chose,p);
p=p->
p=finish;
voidinsert_prio(PCB*q)/*在优先数算法中,将尚未
完成的PCB按优先数顺序插入到就绪队列中;
PCB*p,*s,*r;
/*p,r用来控制就绪队列滚动,S指向插入的队列*/
s=q;
r=p;
if(s->
prio>
ready->
prio)//要插入的进程的优先级大于ready的优先级
s->
next=ready;
ready=s;
else//要插入的进程的优先级不大于ready的优先级
while(p)
if(p->
=s->
prio)
break;
}//找到要插入的位置
next=p;
r->
next=s;
/*voidprior_init(charchose)/*进程优先级法初始化
将进程按优先级插入到就绪队列里
inti,time;
charna[10];
ready=NULL;
finish=NULL;
\t\t进程优先级算法模拟全过程\n\n"
输入进程的个数N:
%d"
N);
for(i=0;
i<
N;
i++)
p=(PCB*)malloc(sizeof(PCB));
输入第%d个进程名\n"
i+1);
%s"
na);
完成进程需要的时间片数\n"
time);
strcpy(p->
name,na);
p->
cputime=0;
needtime=time;
prio=50-time;
//设置进程优先值初值
if(ready==NULL)
ready=p;
insert_prio(p);
当前就绪队列的进程的信息\n"
print(chose);
%d个进程已按优先级从高到低进到就绪队列中\n"
N);
按回车键开始模拟优先级算法.....\n"
getchar();
firstin();
}*/
/*voidpriority(charchose)//进程优先级算法总函数
inti=1;
while(run!
cputime+=1;
needtime-=1;
prio-=1;
if(run->
needtime==0)
next=finish;
finish=run;
prio=0;
if((ready!
=NULL)&
(run->
prio<
prio))
insert_prio(run);
第%d次执行优先级算法\n"
i++);
if(run)
按回车键继续下一次优先级算法.....\n"
优先级算法模拟过程结束!
voidinsert_rr(PCB*q)//在轮转法中,将执行了一个时间片单位(为2),
//但尚未完成的进程的PCB,插到就绪队列的队尾;
tail->
next=q;
tail=q;
q->
voidroundrun_init(charchose)/*循环轮转法初始化
将就绪队列保存为FIFO队列*/
\t\t循环轮转算法模拟全过程\n\n"
count=0;
round=2;
insert_rr(p);
tail=p;
%d个进程已按FIFO进到就绪队列中\n"
按回车键开始模循环轮转算法.....\n"
voidroundrun(charchose)//循环轮转法总算法
count+=1;
count==run->
round)
insert_rr(run);
第%d次执行循环轮转算法\n"
按回车键继续下一次循环轮转算法.....\n"
循环轮转算法模拟过程结束!