2.2.4.测试结果及说明
优先级调度算法运行情况如图1,图2,图3,图4所示
图1.输入进程块的数量
图2.输入每个进程的名称、时间、优先级
图3.输入所有的进程的相关信息
图4.所有进程调度算法完成
2.3.时间片轮转调度 2.3.1.算法思想
所有就绪进程按先来先服务的原则排成一个队列,将新来的进程加到就绪对列的末尾,每当执行进程调度时,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。也就是说CPU的处理时间划分成一个个相同的时间片,就绪队列的所有进程轮流运行一个时间片。当一个时间片结束时,如果运行进程用完它的时间片后还未完成,就强迫运行进程让出CPU,就把它送回到就绪队列的末尾,等待下一次调度。同时,进程调度又去选择就绪队列中的队首进程,分配给它一时间片,以投入运行。直至所有的进程运行完毕。
2.3.2.算法流程图
2.3.3.程序代码
#include
char name[10]; /*进程名*/
int count; /*计数器,判断是否=时间片的大小*/ int cputime; /*占用cpu时间*/
int needtime; /*要求运行时间*/ char state; /*状态*/ struct node *next; /*指针*/
}PCB;
PCB *ready,*run,*finish,*tail; /*就绪 执行 结束 尾指针*/ int N,round;
void prt() /*输出函数,可以方便看到进程执行的演示*/ { PCB *p;
printf(\ NAME CPUTIME NEEDTIME STATUS\\n\ if(run!=NULL)
printf(\ %-10s%-10d%-10d %c\\n\me,run->state); /*输出执行的进程的信息*/ p=ready;
while(p!=NULL) {
printf(\ %-10s%-10d%-10d %c\\n\state); /*输出就绪进程的信息*/ p=p->next;
p=finish; while(p!=NULL) {
printf(\ %-10s%-10d%-10d %c\\n\state); /*输出结束队列的信息*/ p=p->next; } getchar();
}
void insert(PCB *q) /*在队尾插入新的进程*/ {
PCB *p; p=ready;
while(p->next!=NULL) {
p=ready->next; }
tail=p;
tail->next=q; q->next=NULL; }
}
void create() { int i; */
for(i=0;i { p=(PCB *)malloc(sizeof(PCB)); /*为新进程开辟空间*/ scanf(\ /*输入进程名*/ PCB *p; ready=NULL; run=NULL; finish=NULL; printf(\ /*输入进程名、和 scanf(\ /*输入进程要求运行时间*/ p->cputime=0; p->state='W'; /*表示就绪队列中未在队首先执行,但也是就绪状态*/ if (ready!=NULL) insert(p); /*就绪队首不为NULL,插入新进程*/ else { p->next=ready; ready=p; tail=p; } } printf(\ Display is going to start: \\n\ printf(\ prt(); getchar(); run=ready; /*队列排好,run指向就绪队列队首*/ ready=ready->next; /*ready指向下一个进程*/ run->state='R'; } /*队首进程的状态为就绪*/ void count() { 队尾*/ while(run!=NULL) { run->cputime=run->cputime+1; /*运行一次cpu占用时间加一*/ run->needtime=run->needtime-1; /*运行一次要求运行时间减一*/ run->count=run->count+1; /*运行一次计数器加一*/ if(run->needtime==0) /*若要求运行时间为0时*/ { run->next=finish; /*退出队列*/ finish=run; /*finish为结束进程的队列 */ run->state='E'; /*修改状态为结束*/ run=NULL; /*释放run指针*/ if (ready!=NULL) /*创建新就绪队列的头指针*/ { run=ready; run->state='R'; ready=ready->next; } } else if(run->count==round) /*如果时间片到*/ { run->count=0; /*计数器置0*/ if(ready!=NULL) /*如就绪队列不空*/ { run->state='W'; insert(run); /*在进程队列中重新插入原来进程,插入