本文发布且更新于个人博客 https://www.xerrors.fun/JobSchedulingProgram/
我相信一个好的算法应该是优美的,不需要过多的解释,代码前后自成一体;这也是我向往的目标,不过从目前的情况来看,我还是需要努力的。
这次的作业是「单道处理系统的作业调度模拟程序」要求实现 3 种作业调度算法:
- 先来先服务(FCFS)
- 最短作业优先(SJF)
- 响应比高者优先(HRRN)
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。
三种调度算法的原理
假设咱们学生就是一个「单道处理系统」(谦虚),当面对很多科作业到来的时候,有以下几种应对办法
FCFS 先来先服务:先布置的作业优先做,所有作业排好队,后来的作业放在最后面;
最短作业优先:哪个省事先做哪个,所有作业按照要花费的时间排成一个序列;
响应比高者优先:如果哪个先来先做哪个,可能导致比较紧急且简单的工作没法完成,比如老师让当堂交 3 道选择题,这推到后面是不合适的;如果使用最短作业优先呢?可能刚一开始留下的一个比较繁琐的任务一直没法做;比如说暑假开始了,你要准备学车,但是又想出去玩,又想打游戏,等到暑假结束,还是没去学车(亲身经历);所以要综合考虑等待时间以及处理的时间开销。
优 先 级 = 等 待 的 时 间 + 需 要 花 费 的 时 间 需 要 花 费 的 时 间 优先级 = \frac{等待的时间 + 需要花费的时间} {需要花费的时间} 优先级=需要花费的时间等待的时间+需要花费的时间
Python 实现
JCB 的数据结构
每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等;所以最终的 JCB 类就直接创建出来了,千言万语不如直接看代码
class JCB:
# 表示系统中的资源数量,其中 1 表示独占资源
srcs = [3, 2, 4, 1, 1, 1]
clock = 0 # 类的时钟
def __init__(self, name, time, srcs=None):
self.name = name # 名称
self.time = time # 所需时间
self.status = 'Wait' # 作业的状态
self.commit_time = JCB.clock # 作业到达时间
# 所需的资源,单道程序调度用不到的
self.srcs = srcs if srcs else [0] * len(JCB.srcs)
self.pointer = None # 链指针,不知道要用来干嘛
self.start_time = -1 # 作业开始执行的时间,未执行为 -1
self.rp = 0 # 优先级
JCB.clock += 1 # 类的时钟 +1
# 计算优先级,越大优先级越高,越靠前
def calcRp(self, clock):
if self.start_time =