杨利霞 发表于 2021-4-9 15:39

优先级调度算法


优先级调度算法
算法介绍
优先调度算法的类型(用于作业调度)
1)非抢占式优先权调度算法
系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。
2)抢占式优先权调度算法
只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。优先权类型
1)静态优先权
静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
https://img-blog.csdn.net/20180424234537546?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDk2Mjk1NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/702)动态优先权
https://img-blog.csdn.net/2018042423463796?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDk2Mjk1NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70算法实现抢占式动态优先权: https://img-blog.csdn.net/20180424234727904?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDk2Mjk1NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70
PS:本人认为非抢占式静态优先权没有实际价值。
[*]

#include <stdio.h>


[*]

#include <stdlib.h>  


[*]

#include <string.h>  


[*]

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->prio<ready->prio))  


[*]

     {  


[*]

        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);  


[*]

   }


[*]

}



输出结果:
https://img-blog.csdn.net/20180424234901971?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDk2Mjk1NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70https://img-blog.csdn.net/20180424234916810?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDk2Mjk1NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70
原文:https://blog.csdn.net/weixin_40962955/article/details/80072769

页: [1]
查看完整版本: 优先级调度算法