优先级调度算法

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

优先权类型
1)静态优先权 
静态优先权在创建进程时确定,且在进程的整个运行期间保持不变。
è¿éåå¾çæè¿°

2)动态优先权 
这里写图片描述

算法实现

抢占式动态优先权: 

è¿éåå¾çæè¿°


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://blog.csdn.net/weixin_40962955/article/details/80072769 
 

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
优先级调度算法(Priority Scheduling Algorithm)是一种用于任务调度的算法,根据任务的优先级进行排序和执行。该算法根据任务的重要性或优先级来确定任务的执行顺序。在目前提供的引用,并没有特别提及优先级调度算法的具体实现和代码。引用提到了一个动态优先级编程算法的Matlab代码,但没有明确指出这个算法是优先级调度算法。引用提到了遗传算法(Genetic Algorithms),但并没有提到优先级调度算法。引用提到了一段Matlab代码,但没有提到与优先级调度算法相关的内容。 因此,在这种情况下,我们无法提供关于优先级调度算法在Matlab的具体实现和代码。如果您需要了解更多关于优先级调度算法的信息,建议您参考相关的计算机科学和调度算法的教材、论文或在线资源。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [动态优先级调度算法代码matlab-scheduler:CPU调度模拟器](https://download.csdn.net/download/weixin_38735541/18905280)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【优化调度】基于matlab遗传算法求解工件的并行调度组合优化问题【含Matlab源码 2234期】](https://blog.csdn.net/TIQCmatlab/article/details/127970490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值