📅  最后修改于: 2023-12-03 15:10:37.189000             🧑  作者: Mango
最短作业优先 (SJF) 调度程序是一种以作业执行时间为依据的调度算法。它按照作业执行时间的长短,对待执行的作业排序,优先执行执行时间短的作业。
在 SJF 调度算法中,一个新到达的作业会被加入到就绪队列中,然后就绪队列中的作业按照其执行时间进行排序,执行时间最短的作业首先被取出来执行,被执行的作业从就绪队列中删除,执行时间相等的作业按照 FCFS(先来先服务)的原则执行。
在 SJF 调度程序中,还有一种特殊的设置,即抢先调度(Preemptive Scheduling)。抢先调度会在新的作业到达时,如果其执行时间短于当前正在执行的作业,那么将会打断正在执行的作业,去执行新到达的作业。抢先调度通常被用于实时操作系统,以确保关键任务得到及时的响应。
下面是一个 Python 代码实现 SJF 调度程序(抢先)的示例:
from typing import List, Tuple
# 定义作业
class Job:
def __init__(self, name: str, arrival_time: int, execute_time: int):
self.name = name
self.arrival_time = arrival_time
self.execute_time = execute_time
# 定义 SJF 调度程序
class SJF:
def __init__(self, jobs: List[Job]):
self.jobs = sorted(jobs, key=lambda x: (x.arrival_time, x.execute_time))
self.current_time = self.jobs[0].arrival_time
self.finished_jobs = []
# 运行 SJF 调度程序
def run(self) -> Tuple[int, List[Tuple[str, int, int]]]:
result = []
while self.jobs:
min_execute_time_job_idx = self._get_min_execute_time_job_idx()
min_execute_time_job = self.jobs[min_execute_time_job_idx]
if min_execute_time_job.arrival_time <= self.current_time:
self.current_time += min_execute_time_job.execute_time
self.finished_jobs.append(min_execute_time_job)
result.append((min_execute_time_job.name, min_execute_time_job.arrival_time, self.current_time))
self.jobs.pop(min_execute_time_job_idx)
else:
self.current_time += 1
return self.current_time, result
# 获取执行时间最短的作业的索引
def _get_min_execute_time_job_idx(self):
min_execute_time_job_idx = 0
for i in range(1, len(self.jobs)):
if self.jobs[i].execute_time < self.jobs[min_execute_time_job_idx].execute_time:
min_execute_time_job_idx = i
return min_execute_time_job_idx
# 创建作业列表
jobs = [
Job("A", 0, 3),
Job("B", 2, 6),
Job("C", 4, 4),
Job("D", 6, 5)
]
# 创建 SJF 实例
sjf = SJF(jobs)
# 运行 SJF 调度程序
result = sjf.run()
# 打印结果
print("Finish time:", result[0])
print("Execution trace:")
for job in result[1]:
print(job[0], job[1], job[2])
输出:
Finish time: 18
Execution trace:
A 0 3
B 2 8
C 4 12
D 6 18