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

article/2025/9/15 16:17:45

  高响应比优先调度算法(Highest Response Radio Next,HRRN)是一种对CPU中央控制器响应比的分配的算法。HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之间的折中算法。FCFS算法所考虑的只是作业等待时间,而忽视了作业的运行时间(类似我们在生活中排队买东西)。而SJF算法正好与之相反,只考虑作业的运行时间,而忽视了作业的等待时间。

  而高响应比优先算法,则是考虑了作业的等待时间,又考虑了作业运行时间的调度算法,因此照顾了短作业,又不致使长作业等待时间过长,从而改善了处理机的调度的性能。

  这个算法相当于给与每个作业一个动态的优先级,这个优先级是随着时间变化的变化的,等待时间不断地增加,这将让长作业的优先级在等待期间不断地增大,等待足够的时间,必然会得到处理机。该优先级的变化规则可以描述为:

优先级 = (等待时间+要求服务时间)/要求服务时间。又因为,等待时间与要求服务时间之和为系统对作业的响应时间,所以优先级 = 响应时间/要求服务时间。

规律:1.作业的等待时间相同,则要求服务的越短,优先级越高,类似于SJF算法。2.当要求服务的时间相同时,等得越久优先级越高,类似于FCFS算法。3.对于长作业来说,该算法实现了较好的折中。

优点:算法折中,长短作业兼顾,时间分配较为均匀。

缺点:每次计算响应比都会花费一定时间,即时间开销,其性能比SJF算法略差。

下面有道例题,可参考:

算法代码:

#include <stdio.h>
#define N 10
typedef struct {
int hour;
int min;
}time;
typedef struct hrrf{
char hrrf_id[20];
double hrrf_run;  //运行时间
time hrrf_entertime; //进入时间
int enter;
time hrrf_needtime;  //调度时间
int needtime;
time hrrf_endtime;   //结束时间
int endtime;
int hrrf_longtime;  //周转时间
int hrrf_waittime;   //等待时间
double hrrf_pjlongtime; //平均周转时间
double hrrf_rate;       //响应比
struct hrrf* next;
}HRRF;
//输入作业信息
void hrrfinput(HRRF s[N],int k)
{
printf("\t请输入第%d个作业名:",k+1);
scanf("%s",&s[k].hrrf_id);
printf("\t请输入%s作业进入时间:",s[k].hrrf_id);
scanf("%d:%d",&s[k].hrrf_entertime.hour,&s[k].hrrf_entertime.min);
s[k].enter=s[k].hrrf_entertime.hour*60+s[k].hrrf_entertime.min;
printf("\t请输入%s作业运行时间:",s[k].hrrf_id);
scanf("%lf",&s[k].hrrf_run);
}
//计算作业的响应比
void rate(HRRF s[N],int k,int m)
{
double ratenum;
ratenum = (s[k].hrrf_run+(double)(s[m].endtime-s[k].enter))/(s[k].hrrf_run);
s[k].hrrf_rate=ratenum;
printf("\n\t每次算响应比:%s---%f\n",s[k].hrrf_id,s[k].hrrf_rate);
}
//按响应比对作业进行排序(降序排序)
void ratesort(HRRF s[N],int k,int m)
{
int maxratenum;
HRRF temp;
int i,j;
for(i=k;i<m;i++)         //简单选择排序
{
maxratenum=i;
for(j=i+1;j<m;j++)
if(s[j].hrrf_rate>s[maxratenum].hrrf_rate)
maxratenum=j;
if(maxratenum!=i)
{
temp=s[i];
s[i]=s[maxratenum];
s[maxratenum]=temp;
}
}
}
//打印表单
void print(HRRF s[N],int k)
{
printf("\t序号\t作业名\t进入时间\t调度时间\t结束时间\t运行时间\t等待时间\t周转时间\n");
int i,j;
for(i=0;i<k;i++)
printf("\t%d\t%s\t%d:%d\t\t%d:%d\t\t%d:%d\t\t%.0f min\t\t%d\t\t%d min\n",i+1,s[i].hrrf_id,(s[i].enter/60),(s[i].enter%60), (s[i].needtime/60),(s[i].needtime%60),(s[i].endtime/60),(s[i].endtime%60),s[i].hrrf_run,s[i].hrrf_waittime,s[i].hrrf_longtime);
}
//hrrf算法
void HRRF_run(HRRF s[N],int k)
{
int i,j=k,n;
double sum;
HRRF temp;
//按到达时间进行排序
while(j>1)
{
for(i=0;i<j-1;i++)
{
if(s[i+1].enter<s[i].enter)
{
temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
}
j--;
}
printf("\n\t--------------------------------------------初始状态------------------------------------------------\n");
print(s,k);
j=0;
//执行
do{
if(j==0)
{
s[j].needtime=s[j].enter;
s[j].hrrf_waittime=0;
s[j].endtime=s[j].enter+s[j].hrrf_waittime+(int)(s[j].hrrf_run);
s[j].hrrf_longtime=s[j].endtime-s[j].enter;
}
else
{
s[j].needtime=s[j-1].endtime;
s[j].hrrf_waittime=s[j-1].endtime-s[j].enter;
s[j].endtime=s[j].needtime+(int)(s[j].hrrf_run);
s[j].hrrf_longtime=s[j].endtime-s[j].enter;
}
j++;  //到了第几个作业
//计算响应比
n=j-1;  //此次已经执行完的作业序号-1,因为数组从0开始
for(i=j;i<k;i++)
{
rate(s,i,n);    //计算响应比
}
ratesort(s,j,k);    //按响应比由大到小排序
printf("\n\t-----------------------------------------每次响应比排序---------------------------------------------\n");            print(s,k);
}while(j<k);
printf("\n\t--------------------------------------------作业调度------------------------------------------------\n");
print(s,k);
for(i=0;i<k;i++)
{
sum+=(double)(s[i].hrrf_longtime);
}
printf("\n\t平均周转时间为:%.2f\n",sum/k);
}
int main()
{
HRRF a[N]={0};
int i,j;
printf("请输入创建作业数为:");
scanf("%d",&i);
for(j=0;j<i;j++)  //输入作业信息
hrrfinput(a,j);
//HRRF算法
HRRF_run(a,j);
return 0;
}


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

相关文章

进程调度算法

操作系统常见的进程调度算法 调度算法是指&#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…

M3U8是什么

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

video.js播放m3u8视频

m3u8 是一种基于HTTP Live Streaming&#xff08;HLS&#xff09;文件视频格式&#xff0c;它主要是存放整个视频的基本信息和分片(Segment)组成。目前 由 Apple.inc 率先提出的 HLS 协议在 Mac 的 Safari 上原生支持。 video.js是H5视频播放器&#xff0c;支持播放m3u8视频。这…