优先级调度算法

算法介绍

优先调度算法的类型(用于作业调度)

1)非抢占式优先权调度算法
系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
2)抢占式优先权调度算法
只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

优先权类型

1)静态优先权
静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
优先级调度算法_第1张图片
2)动态优先权
优先级调度算法_第2张图片

算法实现

抢占式动态优先权:
优先级调度算法_第3张图片
PS:本人认为非抢占式静态优先权没有实际价值。

#include  
#include   
#include   
typedef struct node  
{  
   char name[10];  /*进程标识符*/  
   int prio;   /*进程优先数*/  
   int round;  /*进程时间轮转时间片*/  
   int cputime; /*进程占用CPU时间*/  
   int needtime; /*进程到完成还要的时间*/  
   int count;  /*计数器*/  
   char state; /*进程的状态*/  
   struct node *next; /*链指针*/  
}PCB;  
PCB *finish,*ready,*tail,*run; /*队列指针*/  
int N; /*进程数*/  
/*将就绪队列中的第一个进程投入运行*/  
firstin()  
{  
   run=ready;   /*就绪队列头指针赋值给运行头指针*/  
   run->state='R';   /*进程状态变为运行态*/  
   ready=ready->next;  /*就绪对列头指针后移到下一进程*/  
}  
/*标题输出函数*/  
void prt1(char a)  
{  
   if(toupper(a)=='P') /*优先数法*/  
      printf("  进程号   cpu时间  所需时间  优先数    状态\n");  
   else  
      printf("  进程号   cpu时间  所需时间   记数   时间片       状态\n");  
}  
/*进程PCB输出*/  
void prt2(char a,PCB *q)  
{  
   if(toupper(a)=='P')  /*优先数法的输出*/  
      printf("  %-10s%-10d%-10d%-10d %c\n",q->name,  
       q->cputime,q->needtime,q->prio,q->state);  
   else/*轮转法的输出*/  
      printf("  %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,  
       q->cputime,q->needtime,q->count,q->round,q->state);  
}  
/*输出函数*/  
void prt(char algo)  
{  
   PCB *p;  
   prt1(algo);  /*输出标题*/  
   if(run!=NULL) /*如果运行指针不空*/  
      prt2(algo,run); /*输出当前正在运行的PCB*/  
   p=ready;  /*输出就绪队列PCB*/  
   while(p!=NULL)  
   {  
      prt2(algo,p);  
      p=p->next;  
   }  
   p=finish;  /*输出完成队列的PCB*/  
   while(p!=NULL)  
   {  
      prt2(algo,p);  
      p=p->next;  
   }  
   getchar();  /*压任意键继续*/  
}  
/*优先数的插入算法*/  
insert1(PCB *q)  
{  
   PCB *p1,*s,*r;  
   int b;  
   s=q;  /*待插入的PCB指针*/  
   p1=ready; /*就绪队列头指针*/  
   r=p1; /*r做p1的前驱指针*/  
   b=1;  
   while((p1!=NULL)&&b)  /*根据优先数确定插入位置*/  
      if(p1->prio>=s->prio)  
      {  
     r=p1;  
     p1=p1->next;  
      }  
      else  
     b=0;  
   if(r!=p1)  /*如果条件成立说明插入在r与p1之间*/  
   {  
      r->next=s;  
      s->next=p1;  
   }  
   else  
   {  
      s->next=p1;  /*否则插入在就绪队列的头*/  
      ready=s;  
   }  
}  
/*优先数创建初始PCB信息*/  
void create(char alg)  
{  
   PCB *p;  
   int i,time;  
   char na[10];  
   ready=NULL; /*就绪队列头指针*/  
   finish=NULL;  /*完成队列头指针*/  
   run=NULL; /*运行队列指针*/  
   printf("输入进程号和运行时间:\n"); /*输入进程标识和所需时间创建PCB*/  
   for(i=1;i<=N;i++)  
   {  
      p=(PCB *)malloc(sizeof(PCB));  
      scanf("%s",na);  
      scanf("%d",&time);  
      strcpy(p->name,na);  
      p->cputime=0;  
      p->needtime=time;  
      p->state='w';  
      p->prio=50-time;  
      if(ready!=NULL) /*就绪队列不空调用插入函数插入*/  
     insert1(p);  
      else  
      {  
     p->next=ready; /*创建就绪队列的第一个PCB*/  
     ready=p;  
      }  
   }  
   printf("          优先数算法输出信息:\n");  
   printf("************************************************\n");  
   prt(alg);  /*输出进程PCB信息*/  
   run=ready; /*将就绪队列的第一个进程投入运行*/  
   ready=ready->next;  
   run->state='R';  
}  
/*优先数调度算法*/  
priority(char alg)  
{  
   while(run!=NULL)  /*当运行队列不空时,有进程正在运行*/  
   {  
      run->cputime=run->cputime+1;  
      run->needtime=run->needtime-1;  
      run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/  
      PCB *p;
      p=ready;
      while(p!=NULL)  
      {  
          p->prio=p->prio+1; /*每等待一次优先数升高1个单位*/    
          p=p->next;  
      }  
      if(run->needtime==0)  /*如所需时间为0将其插入完成队列*/  
      {  
         run->next=finish;  
         finish=run;  
         run->state='F';  /*置状态为完成态*/  
         run=NULL;  /*运行队列头指针为空*/  
         if(ready!=NULL) /*如就绪队列不空*/ 
         {  
            firstin(); /*将就绪对列的第一个进程投入运行*/  
         }
      }  
      else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/  
     if((ready!=NULL)&&(run->prioprio))  
     {  
        run->state='W';  
        insert1(run);  
        firstin(); /*将就绪队列的第一个进程投入运行*/  
     }  
      prt(alg); /*输出进程PCB信息*/  
   }  
}  
/*主函数*/  
main()  
{  
   char algo;  /*算法标记*/  
   printf("输入P确定算法:优先数算法\n");  
   scanf("%c",&algo); /*输入字符确定算法*/  
   printf("输入进程数:\n");  
   scanf("%d",&N); /*输入进程数*/  
   if(algo=='P'||algo=='p')  
   {  
      create(algo); /*优先数法*/  
      priority(algo);  
   } 
}

输出结果:

优先级调度算法_第4张图片
优先级调度算法_第5张图片

你可能感兴趣的:(操作系统,优先级调度算法,动态优先级)