时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx
《时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx》由会员分享,可在线阅读,更多相关《时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
TAIL——就需队列尾指针
FINISH——完成队列头指针
(3)程序说明
1.在优先数算法中,进程优先数的初值设为:
50-NEEDTIME
每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。
在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪队列尾,等待下一次调度。
2.程序的模块结构提示如下:
整个程序可由主程序和如下7个过程组成:
(1)INSERT1——在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;
(2)INSERT2——在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;
(3)FIRSTIN——调度就绪队列的第一个进程投入运行;
(4)PRINT——显示每执行一次后所有进程的状态及有关信息。
(5)CREATE——创建新进程,并将它的PCB插入就绪队列;
(6)PRISCH——按优先数算法调度进程;
(7)ROUNDSCH——按时间片轮转法调度进程。
主程序定义PCB结构和其他有关变量。
(4)运行和显示
程序开始运行后,首先提示:
请用户选择算法,输入进程名和相应的NEEDTIME值。
每次显示结果均为如下5个字段:
1.在state字段中,代表执行态,,,W,代表就绪(等待)态F”代表完成态。
2.应先显示"
R"
态的,再显示态的,再显示"
F"
态的。
3.在"
VT态中,以优先数高低或轮转顺序排队;
在"
F”态中,以完成先后顺序排队。
viewplaincopytoclipboardprint?
1./*
2.操作系统实验之时间片轮转算法和优先级调度算法
3.ByVisuaIC++6.0
4.*/
#include<
stdio.h>
stdlib.h>
#include〈string.h>
typedefstruetnode
char
name[20];
/*进程的名字*/
int
prio;
/*进程的优先级*/
round;
/*分配CPU的时间片*/
eputime;
/♦CPU执行时间*/
needtime;
/*进程执行所需要的时间♦/
charstate;
/*进程的状态,W就绪态,R执行态,F
完成态*/
intcount;
/*记录执行的次数*/
structnode*next;
/*链表指针*/
}PCB;
PCB*ready=NULL,*run=NULL,*finish=NULL;
/*定艾三个队列,就绪队列,执行
队列和完成队列*/
irrtnum;
void
GetFirst();
/*从就绪队列取得第一个节点*/
Output();
/*输出队列信息*/
1nsertPrio(PCB
*in);
/*创建优先级队列,规定优先数越小,优先级
越高*/
1nsertTime(PCB
/*时间片队列*/
lnsertFinish(PCB*in);
PrioCreate();
/*优先级输入函数*/
TimeCreateO;
/*时间片输入函数*/
PriorityO;
/*按照优先级调度*/
RoundRunO;
/*时间片轮转调度*/
main(void)
charchose;
printfC1请输入要创建的进程数目:
\nR);
seanf("
Ed"
&
num);
getchar();
printfC*输入进程的调度方法:
(P/R)\nM);
seanf&
chose);
switch(chose)
{
case1P'
:
case'
p*:
PrioCreate();
Priority();
break;
caseR:
r'
TimeCreate();
defauIt:
return0;
}
voidGetFirst()/*取得第一个就绪队列节点*/
run=ready;
if(ready!
=NULL)
run->
state='
R'
;
ready=ready->
next;
next=NULL;
voidOutput()/*输出队列信息*/
PCB*p;
p=ready;
printf(M进程名\t优先级\t轮数\tcpu时间\t需要时间\t进程状态\t计数器
\n"
);
while(p!
二NULL)
printf(n%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\nM,p->
name,p->
prio,p->
ro
und,p->
cputime,p->
needtime,p->
state,p->
count);
p二p->
p=finish;
printfC'
%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\nM,p->
prio,p->
und,
*/
p->
needtime,p->
p=p->
I
p=run;
printf(,,%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\nM,p->
name,p->
prio,p->
cputime,p->
lnsertPrio(PCB*in)/*创建优先级队列,规定优先数越小,优先级越低
PCB*fst,*nxt;
fst=nxt=ready;
if(ready==NULL)/*如果队列为空,则为第一个元素*/
in->
next二ready;
ready=in;
else/*查到合适的位置进行插入*/
if(in->
prio>
=fst->
prio)/*比第一个还要大,则插入到队
头*/
eIse
while(fst->
next!
=NULL)/*移动指针查找第一个别它小的
元素的位置进行插入*/
nxt=fst;
fst=fst->
if(fst->
next=NULL)/*已经搜索到队尾,则其优先级数置
小,将其插入到队尾即可*/
in->
next=fst->
fst->
next=in;
else/*插入到队列中*/
nxt=in;
in->
next二fst;
voidInsertTime(PCB*in)/*将进程插入到就绪队列尾部*/
PCB*fst;
fst
ready;
if(ready
NULL)
in->
while(fst->
=NULL)
voidInsertFinish(PCB*in)/*将进程插入到完成队列尾部*/
fst=finish;
if(finish==NULL)
next=finish;
finish=in;
fst->
voidPrioCreateO/*优先级调度输入函数*/
PCB*tmp;
irrti;
printf(”输入进程名字和进程所需时间:
\nH);
for(i=0;
i<
num;
i++)
if((tmp=(PCB*)malIoc(sizeof(PCB)))==NULL)
perror("
maIlocH);
exit
(1);
1
scanftmp->
name);
getchar();
/*吸收回车符号*/
scanfC^d"
,&
(tmp->
needtime));
tmp->
cputime=0;
state=,W'
prio=50-tmp->
needtime;
/*设置其优先级,需要的
时间越多,优先级越低*/
round=0;
/*按照优先级从离到低,插入到就绪队列
count=0;
InsertPrio(tmp);
voidTimeCreateO/*时间片输入函数*/
printfC1输入进程名字和进程时间片所需时间:
\nu);
perror(MmallocH);
scanf(n%sH,tmp->
scanf,&
InsertTime(tmp);
while(run!
=NULL)/*当就绪队列不为空时,則调皮进程如执行队列执
行*/
/*输出每次调度过程中冬个节点的状态*/
whiIe(fIag)
run->
prio-二3;
/*优先级减去三*/
cputime++;
/*CPU时间片加一*/
needtime—;
/*进程执行完成的剩余时间减一*/
if(run->
needtime==0)/*如果进程执行完毕,将进程状态置为F.
将其插入到完成队列*/
state=F;
run->
count++;
/*进程执行的次数加一*/
InsertFinish(run);
flag=0;
else/*将进程状态置为也入就绪队列*/
W'
InsertTime(run);
flag=1;
GetFirst();
/*继续取就绪队列队头进程进入执行队列*
intflag=1;
while(run!
while(fIag)
needtime—;
if(run->
needtime==0)/*进程执行完毕*/
state=F;
elseif(run->
count=run->
round)/*时间片用完*/
W*;
/*计数器清零,为下次做准备*
1;
flag