📌  相关文章
📜  最短作业优先 (SJF) 调度程序 |设置 2(抢先)(1)

📅  最后修改于: 2023-12-03 15:10:37.189000             🧑  作者: Mango

最短作业优先 (SJF) 调度程序 | 设置 2(抢先)

简介

最短作业优先 (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