多级反馈队列调度算法(附Python3实现代码)

article/2025/8/15 4:17:25

一、多级反馈队列调度算法

多级反馈队列调度算法是进程调度的一种算法,该调度算法可以不用事先知道各种进程所需的执行时间,还可以较好的满足各种类型进程的需要,是目前共认的一种较好的进程调度算法。

那你可能马上就要问了,多级反馈队列调度算法到底是怎么调度的呢?我认为很多算法都可以用一张图+一句话来表达,所以接下来我尽量用图像来使这个算法看起来非常清晰。

一句话:

多级反馈队列调度算法,“多级”在于有多个不同优先级的队列,“反馈”在于如果有进程加入优先级高的队列时立即停止当前任务,转去执行优先级高的队列中进程,上述过程循环调度就形成多级反馈队列调度算法。

一张图:

这里写图片描述

上图是一个调度的示例,进程有A(4),B(3),C(4),D(2),E(4),括号内是需要服务的时间。设第一队列时间片q=1,因为该算法中时间片的规则为:后一个时间片长度为前一个的2倍,所以第二队列时间片q=2,第三队列时间片q=4。

若不能执行完,则放到下一个队列尾部(橙色部分)

到最后一个队列的时候,则执行轮转调度(RR)算法,也就是每次执行一个时间片长度的服务,直到循环执行完所有的进程。

二、Python3实现代码

首先介绍一下程序中使用的结构体

1.“进程/任务”结构体

class  Process:def __init__(self,name,arrive_time,serve_time):self.name=name                              #进程名self.arrive_time=arrive_time                #到达时间self.serve_time=serve_time                  #需要服务的时间self.left_serve_time=serve_time             #剩余需要服务的时间self.finish_time=0                          #完成时间self.cycling_time=0                         #周转时间self.w_cycling_time=0                       #带权周转时间

进程的属性有进程名,到达时间,需要服务的时间,剩余需要服务的时间,完成时间,周转时间,带权周转时间。其中周转时间为提交时间与完成时间的间隔;带权周转时间为周转时间/实际运行时间。

2.队列

class Queue:def __init__(self,level,process_list):self.level=levelself.process_list=process_listself.q=0def size(self):return len(self.process_list)def get(self,index):return self.process_list[index]    def add(self,process):self.process_list.append(process)def delete(self,index):self.process_list.remove(self.process_list[index])

设置一个队列,初始化方法需要给队列的优先级,以及队列中所包含的进程列表,顺便定义获取队列一些属性的方法。

然后是具体使用的算法程序:
3.轮转调度算法(RR)

class RR:def __init__(self,process_list,q):self.process_list=process_listself.q=qdef scheduling(self):process_list.sort(key=lambda x:x.arrive_time)#按照.arrive_time进行排序len_queue=len(self.process_list) #进程队列的长度index=int(0)  #索引q=self.q      #时间片running_time=int(0)#已经运行了的时间#调度的循环while(True):#当前进程current_process=self.process_list[index%len_queue]#判断当前进程是否已经被完成if current_process.left_serve_time>0: #计算完成时间#还需要服务的时间大于等于时间片,则完成时间+时间片时间  此进程还没结束#还需要服务的时间小于时间片,则完成时间在原来基础上加上继续服务的时间if current_process.left_serve_time>=q:running_time+=q#print(current_process.name,running_time,index)current_process.left_serve_time-=qelse :#print('%s 还需要服务的时间小于当前时间片'%current_process.name)running_time+=current_process.left_serve_timecurrent_process.left_serve_time=0#已完成if current_process.left_serve_time==0:#计算完成时间current_process.finish_time=running_time#计算周转时间current_process.cycling_time=current_process.finish_time-current_process.arrive_time#计算带权周转时间current_process.w_cycling_time=float(current_process.cycling_time)/current_process.serve_time#打印print('%s 进程已完成的进程,详细信息如下:'%current_process.name)print('进程名称:%s  ,完成时间: %d    ,周转时间:%d  ,带权周转时间: %.2f'%(current_process.name,current_process.finish_time,current_process.cycling_time,current_process.w_cycling_time))#弹出self.process_list.remove(current_process)len_queue=len(self.process_list)#有进程完成任务后,index先回退,之后再加,以保持指向下一个需要调度的进程index-=1#index常规增加index+=1     #如果队列中没有进程则表示执行完毕if len(self.process_list)==0:break#改变index,避免因为index大于len,导致取模时出错if index>=len(self.process_list):index=index%len_queue

多级反馈队列调度算法用于执行最后一个队列中的进程,如果单独拿出来也是一个完整的算法实现代码,下面的代码中也有相应的测试代码。

4.多级反馈队列调度算法

class MulitlevedFeedbackQueue():def __init__(self,queue_list,q_first):self.queue_list=queue_listself.q_first=q_firstdef scheduling(self):q_list=self.queue_list  #当前队列集合q_first=self.q_first                #第一个队列的时间片for i in range(len(q_list)):#确定每个队列的时间片if i==0:q_list[i].q=q_firstelse :q_list[i].q=q_list[i-1].q*2#从第一个队列开始执行时间片#先判断是否是最后一个队列,最后一个队列直接执行RR调度算法#不是最后一个队列的话,就执行当前队列时间片后判断是否有必要加入到下一个队列的末尾if i==len(q_list)-1:print('**************对最后一个队列执行RR调度算法*************')#print(q_list[i].process_list[])#最后一个队列重新设置到达时间for t in range(len(q_list[i].process_list)):q_list[i].process_list[t].arrive_time=trr_last_queue=RR(q_list[i].process_list,q_list[i].q)rr_last_queue.scheduling()else:currentQueue=q_list[i]index=int(0)while(True):if currentQueue.get(index).left_serve_time>q_list[i].q:currentQueue.get(index).left_serve_time-=q_list[i].qprint('第  %d  队列时间片: %d'%(i,q_list[i].q))print('进程没有执行完毕,需要添加至下一队列末尾:进程名称:%s '%(currentQueue.get(index).name))#将当前进程扔到下一个队列的尾部q_list[i+1].add(currentQueue.get(index))index+=1  else:print('服务完成并弹出:',currentQueue.get(index).name)currentQueue.get(index).left_serve_time=0currentQueue.delete(index)if index==currentQueue.size():break

以上是多级反馈队列调度算法,最后一个队列使用第三个代码片中的RR算法,其它的则按照上面算法详情实现。

5.测试程序

'''
测试程序
'''    
if __name__=='__main__':'''产生进程'''process_list=[]processA=Process('A',0,4)processB=Process('B',1,3)processC=Process('C',2,4)processD=Process('D',3,2)processE=Process('E',4,4)process_list.append(processA),process_list.append(processB),process_list.append(processC)process_list.append(processD),process_list.append(processE)'''使用RR调度算法,时间片为1'''print('#################################################################')print('---------------------------轮转调度算法--------------------------')print('#################################################################')rr=RR(process_list,1)rr.scheduling()'''使用多级反馈队列调度算法'''print()print('#################################################################')print('-----------------------测试多级反馈队列调度算法----------------------')print('#################################################################')processA=Process('A',0,4)processB=Process('B',1,3)processC=Process('C',2,4)processD=Process('D',3,2)processE=Process('E',4,4)process_list0,process_list1,process_list2=[],[],[]process_list0.append(processA),process_list0.append(processB)process_list1.append(processC),process_list1.append(processD)process_list2.append(processE)#队列queue_list=[]queue0=Queue(0,process_list0)queue1=Queue(1,process_list1)queue2=Queue(2,process_list2)queue_list.append(queue0),queue_list.append(queue1),queue_list.append(queue2)#使用多级反馈队列调度算法,第一队列时间片为1mfq=MulitlevedFeedbackQueue(queue_list,1)mfq.scheduling()

实现结果:
这里写图片描述

最后总结一下多级反馈队列调度算法的优点:

  • 不用事先知道各种进程所需的执行时间,还可以较好的满足各种类型进程的需要

  • 既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比FCFS与高优先响应比调度算法的缺陷)。

  • 兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。

代码下载地址请戳
https://github.com/LIANGQINGYUAN/OperatingSystens/blob/master/Multilleved_Feedback_Queue.py

欢迎star,蟹蟹!!!


http://chatgpt.dhexx.cn/article/43Y4rexr.shtml

相关文章

调度:多级反馈队列

多级反馈队列(Multi-level Feedback Queue, MLFQ)是有Corbato在1962年提出的,用于兼容时分共享系统。现在其经过多年的优化,已经被应用于很多现代操作系统中。多级反馈队列是为了解决两方面问题。一:优化周转时间。在之…

多级队列调度和多级反馈队列调度算法的实现

多级队列调度算法 操作系统实验导航 实验一:银行家算法 https://blog.csdn.net/weixin_46291251/article/details/115384510 实验二:多级队列调度和多级反馈队列调度算法 https://blog.csdn.net/weixin_46291251/article/details/115530582 实验三&…

多级反馈队列调度算法模拟实现

实验一 多级反馈队列调度算法 一. 主要实现方法和代码介绍 ​ 1.编写进程类,其只包含所需的运行时间和进程编号两个属性,还有一个运行方法,此方法就是将所需的运行时间属性减去.传入的运行时间. ​ 2.创建进程函数:创建maxp个进程,(应该不超过10,在此创建九个,即暂时不进行进…

计操实验 多级反馈队列C语言

计操实验 多级反馈队列C语言 需求: 1.队列4级,每一级的队列长度均为10;第一级的时间片为T,第二级的时间片为2T,第三级的时间片为4T,第四级的时间片为8T;(T的大小自己定) …

【操作系统】轮转和多级反馈队列

随着计算机的技术逐渐步入家用后,新的调度指标接踵而来,周转时间已经不能满足人们日常工作的需求,更多时候人们更希望计算机能有更好的交互性,使其能更快地去响应任务,由此针对优化响应时间的调度策略也遍地开花&#…

多级反馈队列调度算法(c++)

如果对你有帮助,可以给卑微的博主留个赞、关注、收藏 (不是) (骗一下数据,说不定以后面试就过了,拜谢) 操作系统基本调度算法,多级反馈队列调度算法。在划分时间片的调度算法中,多级反馈队列算法兼顾提高系统吞吐…

多级反馈队列调度算法

实验目的: 在Linux下编程实现多级反馈队列调度算法,采用三级调度策略,所有进程先按到达顺序进入一级队列,按照时间片为2轮转一次,一个时间片内未完成的进程被依次移入二队列尾部。当一级队列中没有进程时,开…

多级反馈队列调度

多级反馈队列 ​ 多级反馈队列(Multi-level Feedback Queue, MLFQ),与上个世纪70年代提出,主要应用于时分共享系统。主要解决两方面问题:一个是优化周转时间,一个是要给用户很好的交互体验。ML…

多级反馈队列算法

步骤: 0时刻,P1到达就绪队列(时间片为4的)P1先执行2ms,P2到达还未到时间片,P1继续执行2ms后,时间片到达了,P1滑到下一个就绪队列(时间片为6的)此时&#xff…

linux多级反馈队列的实现,多级反馈队列调度算法详解

通常在使用多级队列调度算法时,进程进入系统时被永久地分配到某个队列。例如,如果前台和后台进程分别具有单独队列,那么进程并不从一个队列移到另一个队列,这是因为进程不会改变前台或后台的性质。这种设置的优点是调度开销低&…

对数线性模型

http://blog.csdn.net/pipisorry/article/details/52788947 特征和指示特征 对数线性模型log linear model 对数线性模型有:最大熵模型和逻辑斯谛回归。 [概率图模型原理与技术] [PGM:无向图模型:马尔可夫网 ] 皮皮blog 最大熵模型的一般形式…

广义线性模型(Generalized Linear Model)之三:Poisson回归

广义线性模型(Generalized Linear Model)之三:Poisson回归 一、泊松回归(Poisson regression)简介(一)泊松回归(二)计数数据(三)泊松分布1&#x…

MIT自然语言处理第五讲:最大熵和对数线性模型

MIT自然语言处理第五讲:最大熵和对数线性模型(第一部分) 自然语言处理:最大熵和对数线性模型 Natural Language Processing: Maximum Entropy and Log-linear Models 作者:Regina Barzilay(MIT,EECS Depar…

机器学习教程 之 线性模型:线性回归、对数几率回归、线性判别分析

常用的三个线性模型的原理及python实现——线性回归(Linear Regression)、对数几率回归(Logostic Regression)、线性判别分析(Linear Discriminant)。 这可能会是对线性模型介绍最全面的博客 文章目录 一、…

机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析

一、线性回归 线性回归(linear regression:试图学得一个线性模型以尽可能准确地预测实值输出标记。 1.最简单的形式:输入属性的数且只有一个, 最小二乘法:基于均方差误差最小化来进行模型的求解,在线性回…

对数线性模型:逻辑斯谛回归和最大熵模型

http://blog.csdn.net/pipisorry/article/details/52788947 对数线性模型log linear model 对数线性模型有:最大熵模型和逻辑斯谛回归。 特征和指示特征 对数线性模型的一般形式 [概率图模型原理与技术] 某小皮 对数线性模型的不同形式 因子图 将因子转换到对…

从线性到非线性模型-对数线性模型

从线性到非线性模型 1、线性回归,岭回归,Lasso回归,局部加权线性回归 2、logistic回归,softmax回归,最大熵模型 3、广义线性模型 4、Fisher线性判别和线性感知机 5、三层神经网络 6、支持向量机 code: https://…

论文总结3 对数线性模型 罗盛

研究变量之间的相互关系、列联表、对应分析 目录 一、模型介绍 二、比较-对数线性模型&对应分析 1.相同&不同 2.相互关系 三、应用实例 1.模型确立 2.列因素&因子负荷 四、总结经验 一、模型介绍 列联表分析无法系统地评价变量间的联系,无法…

对数线性模型之一(逻辑回归), 广义线性模型学习总结

经典线性模型自变量的线性预测就是因变量的估计值。 广义线性模型:自变量的线性预测的函数是因变量的估计值。常见的广义线性模型有:probit模型、poisson模型、对数线性模型等等。对数线性模型里有:logistic regression、Maxinum entropy。本篇是对逻辑回归的学习总结,以及…

机器学习篇——对数线性模型

建议首先看cs229讲的广义线性模型、exponential family(指数分布族) 对数线性模型包括逻辑回归、最大熵模型和条件随机场等 1、模型 条件概率分布(对数线性模型、概率模型)、判别模型 逻辑回归: 概率分布可由广…