优先级调度算法

article/2025/9/16 1:14:25

算法介绍

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

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

输出结果:

这里写图片描述
这里写图片描述


http://chatgpt.dhexx.cn/article/RkFD3wHQ.shtml

相关文章

进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法

一、 实验目的和要求 1. 了解进程调度算法的特点 2. 掌握进程调度算法&#xff0c;如先来先服务调度算法&#xff08;first come first served,FCFS&#xff09;、短作业优先调度算法&#xff08;shotjob first,SJF&#xff09;、时间片轮转调度算法。 二、 实验内容 …

操作系统调度算法--高响应比优先调度算法解析

高响应比优先调度算法&#xff08;Highest Response Radio Next&#xff0c;HRRN&#xff09;是一种对CPU中央控制器响应比的分配的算法。HRRN是介于FCFS&#xff08;先来先服务算法&#xff09;与SJF&#xff08;短作业优先算法&#xff09;之间的折中算法。FCFS算法所考虑的只…

进程调度算法

操作系统常见的进程调度算法 调度算法是指&#xff1a;根据系统的资源分配策略所规定的资源分配算法。常见的进程调度算法有&#xff1a; 1.先来先去服务 2.时间片轮转法 3.多级反馈队列算法 4.最短进程优先 5.最短剩余时间优先 6.最高响应比优先 7.多级反馈队列调度算法 一、…

【操作系统】调度算法

目录 &#x1f3eb;基本概念 &#x1f3e5;先来先服务&#xff08;FCFS, First Come First Serve) &#x1f3e9;短作业优先&#xff08;SJF, Shortest Job First) &#x1f346;细节 ⛪️高响应比优先&#xff08;HRRN,Highest Response Ratio Next&#xff09; &#x…

调度算法

1.先来先服务调度算法&#xff08;FCFS&#xff09;&#xff1a; 按照到达的先后顺序进行调度。 周转时间完成时间 - 到达时间 带权周转时间周转时间 / 运行时间 等待时间周转时间 - 运行时间 特殊情况&#xff1a;当有I/O操作&#xff08;输入/输出&#xff09;的进程的时候…

操作系统——调度算法

文章目录 前言一、先来先服务(FCFS)二、最短时间优先(SJF)三、最高响应比优先(HRRN)四、时间片轮转(RR)五、优先级调度六、多级反馈队列总结 前言 本文的主要内容是调度算法的介绍&#xff0c;包括先来先服务(FCFS)、最短时间优先(SJF)、最高响应比优先(HRRN)、时间片轮转(RR)…

调度算法-优先级调度算法+例题详解

1. 优先级调度算法的类型 优先级进程调度算法&#xff0c;是把处理机分配给就绪队列中优先级最高的进程。这时&#xff0c;又可进一步把该算法分成如下两种。 非抢占式优先级调度算法。抢占式优先级调度算法。 2. 优先级的类型 静态优先级 静态优先级是在创建进程时确定的&…

【操作系统】常用的调度算法

文章目录 前言先来先服务调度算法&#xff08;FCFS&#xff09;短作业/短进程优先算法&#xff08;SJF/SPF&#xff09;时间片轮转调度算法&#xff08;RR&#xff09;高响应比优先调度算法&#xff08;HRRF&#xff09;优先级调度算法&#xff08;PSA&#xff09;静态优先级动…

【操作系统】几种常用调度算法

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09;二、短作业优先调度算法&#xff08;SJF&#xff09;最短作业优先调度算法&#xff08;SJF&#xff09;最短剩余时间优先调度算法&#xff08;SRTF&#xff09; 三、响应比最高者优先调度算法&#xff08;HRRF&…

【操作系统】_7种进程调度算法

书中一共描述了七种进程调度算法&#xff0c;为了学到这几种调度算法&#xff0c;后边做了几道练习题。 1. 先来先服务&#xff08;FCFS&#xff09;调度算法 先来先服务调度算法是最简单的调度方法。其基本原则是&#xff0c;按照进程进入就绪队列的先后次序进行选择。对于进…

常用的调度算法(包含实例)|操作系统

目录 1.先来先服务调度算法&#xff08;FCFS&#xff09;2.优先级调度算法3.最短作业优先调度算法&#xff08;SJF&#xff09;4.最高响应比优先调度算法&#xff08;HRRN&#xff09;5.轮转调度算法&#xff08;RR&#xff09;6.多级反馈轮转调度算法7.实时系统的调度算法 1.先…

几种常见的调度算法

文章目录 1.先来先服务算法&#xff08;FCFS,First Come First Service&#xff09;2.短作业优先算法&#xff08;SJF,Short Job First&#xff09;3.高响应比优先算法4.时间片轮转算法5.优先级调度算法6.多级反馈队列算法 1.先来先服务算法&#xff08;FCFS,First Come First …

videojs播放m3u8格式视频

videojs 是不支持m3u8格式&#xff0c;需要配合videojs-contrib-hls插件 npm install --save video.js npm install --save videojs-contrib-hls 不加muted 刷新时不会自动播放&#xff0c;但是加上就会没有声音了&#xff0c;因为业务不需要声音所以没有影响

一个可以在线播放解析m3u8,mp4的网站 m3u8player.lantianye3.top

自己写的一个可以在线播放m3u8的网页&#xff0c;在这里分享一下。借助m3u8 player网页播放器&#xff0c;只需将您的M3U8文件地址或者mp4链接复制粘贴到播放器地址栏中然后点击播放即可。 网站 http://m3u8player.lantianye3.top/ 如有不足&#xff0c;多多指教。 首页截图&am…

视频工具下载(m3u8、MP4)

下载视频m3u8工具 FFmpeg 转 ts 格式 笔记有点乱 都是一笔带过&#xff08;有链接&#xff09;&#xff0c;可以参考别人教程 1、下载m3u8工具&#xff08;支持win和liunx&#xff09; 下载链接 20201019 &#xff08;都是2020年的&#xff0c;还是可以用&#xff09; 使用…

前端如何播放m3u8格式的视频

m3u8格式的视频是将文件分成一小段一小段的ts文件&#xff0c;播放完一个在播放下一个&#xff0c;由于每次请求的ts文件都很小&#xff0c;所以基本可以做到无延时播放。目前WEB上主流的直播方案主要是HLS和RTMP&#xff0c;移动端主要是HLS&#xff0c;PC端主要是RTMP。 HLS…

如何下载m3u8格式视频

小编记得以前手机流量少的时候&#xff0c;电脑上下课程或电影再存到手机上看还是很容易的 现在虽然这种需求比较少&#xff0c;但还是有一些视频想下载下来&#xff0c;不过却发现下不了了因为很多的视频都不提供下载地址或下载的是加密的视频格式 即使我们能通过工具采集到…

Android m3u8网络视频播放

最近在做 m3u8网络视频播放&#xff0c;踩了不少坑&#xff0c;也试了不少的 框架&#xff0c;特别记录一下其中用的比较多的三种 第一种&#xff1a;media:ijkplayer media:ijkplayer 是由 bilbil 提供的开源的视频 框架&#xff0c;但是由过之后感觉不太好用&#xff1a; …

网页在线视频下载教程(m3u8格式介绍及下载教程)

简介&#xff1a; m3u8文件是苹果公司使用的HTTP Live Streaming&#xff08;HLS&#xff09;协议格式的基础。HLS是新一代流媒体传输协议&#xff0c;其基本实现原理为将一个大的媒体文件进行分片&#xff0c;将该分片文件资源路径记录与m3u8文件&#xff08;即playlist&…

什么是m3u8?

什么是m3u8? ​  m3u8是苹果公司推出的视频播放标准&#xff0c;是m3u8的一种&#xff0c;只是编码格式采用的是UTF-8。 m3u8准确来说是一种索引文件&#xff0c;使用m3u8文件实际上是通过它来解析对应的放在服务器上的视频网络地址&#xff0c;从而实现在线播放。使用m3u8…