}
void main() { }
}
}
run=ready; /*重新置就绪队列的头指针*/ run->state='R';
ready=ready->next;
}
prt();
printf(\scanf(\
create(); /*模拟创建进程,并输入相关信息*/ count(); /*优先数调度算法*/
2.3.4.测试结果及说明
时间片轮转调度算法运行情况如图1,图2,图3所示
图1 所有的进程都在队列中
图2 其中一个进程执行完毕
图4 所有的进程都执行完毕
2.4.多级反馈队列调度 2.4.1算法思想
允许进程在队列之间移动。在系统中设置多个就绪队列,每个队列对应一个优先级,第一个队列的优先级最高,第二队列次之。以下各队列的优先级逐步低。各就绪队列中的进程的运行时间片不同,高优先级队列的时间片小,低优先级队列的时间片大。进程并非总是固定在某一队列中,新进程进入系统后,被存放在第一个队列的末尾。如果某个进程在规定的时间片内没有完成工作,则把它转入到下一个队列的末尾,直至进入最后一个队列。系统先运行第一个队列中的进程。当第一队列为空时,才运行第二个队列中的进程。依此类推,仅当前面所有的队列都为空时,才运行最后一个队列中的进程。当处理器正在第i个队列中为某个进程服务时,又有新进程进入优先级最高的队列(第1—(i-1)中的任何一个对列),则此新进程要抢占正在运行进程的处理器,即由调度程序把正在运行的进程放回第i队列的末尾,把处理器分配给新到的高优先级进程。除最低优先权队列外的所有其他队列,均采用相同的进程调度算法,即按时间片轮转的FIFO(先进先出)算法。最后一个队列中的进程按按时间片轮转或FCFS策略进行调度。它是综合了FIFO、RR和剥夺式HPF的一种进程调度算法。
2.4.2算法流程图
2.4.3程序代码
#include
typedef struct node { char name[10]; /*进程名*/ int num; /*进程所在队列数,也是该队列的时间片*/
int cputime; /*占用cpu时间*/ int needtime; /*要求运行时间*/ struct node *next; /*指针*/
}PCB;
PCB *qf1,*ql1;
PCB *qf2,*ql2;
PCB *qf3,*ql3;//定义三个队列的头指针和尾指针
int blog1,blog2,blog3; /*分别记录队列1,、队列2、队列3中进程数*/
void insert(PCB *q,PCB *qf,PCB *ql) {
q->num++;
if(qf==NULL&&ql==NULL) { //队列为空 qf=ql=q; }
else
{//队列不为空
ql->next=q; ql=q;
}
ql->next=NULL;
}
void create(int n)
{//创建进程,刚来的进程都进入队列1
PCB *p;
p=(PCB *)malloc(sizeof(PCB)); int i;
blog1=blog2=blog3=0; //各队列中进程数均为0 printf(\ /*输入进程名和所需时间*/
for(i=0;i scanf(\ /*输入进程要求运行时间*/ p->cputime=0; p->num=0; insert(p,qf1,ql1); blog1++; //队列中进程数加1 } int run(PCB *q,PCB *qf,PCB *ql) { PCB *p,*f,*l; /*p=(PCB *)malloc(sizeof(PCB)); f=(PCB *)malloc(sizeof(PCB)); l=(PCB *)malloc(sizeof(PCB));*/ p=q; f=qf; l=ql; if(q->needtime<=q->num) /*在时间片内完成*/ { //q->cputime+=q->needtime; q->needtime=0; free(q); return 0; } else /*不能在时间片内完成*/ { } //q->cputime+=q->num; q->needtime-=q->num; if(q->num<3) q->num++; insert(p,f,l); //进入下一个队列 return 1; } void prt() /*输出函数,可以方便看到进程执行的演示*/ { PCB *p; //p=(PCB *)malloc(sizeof(PCB)); int a; printf(\ NAME CPUTIME NEEDTIME STATUS\\n\while(blog1>0||blog2>0||blog3>0) { if(blog1>0) /*第一个队列不为空*/ { p=qf1; qf1=qf1->next; p->next=NULL; blog1--; printf(\ %-10s%-10d%\\n\ a=run(p,qf2,ql2); if(a==1) blog2++; } else if(blog2>0) { /*第二个队列不为空*/