📌  相关文章
📜  最短作业优先(或SJF)CPU调度程序|套装1(非抢先)(1)

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

最短作业优先(SJF) CPU调度程序|套装1(非抢先)

简介

最短作业优先(SJF)是一种 CPU 调度算法, 它的主要思想是根据任务的执行时间来确定任务的执行顺序。在 SJF 算法中, 任务被按照它们到达的时间排序, 然后按照它们的执行时间进行排序, 然后一个一个地运行它们。 给定一组作业和各自长度, 这些作业必须按照它们的长度被调度。

实现

SJF 调度一般分为两种: 非抢占式和抢占式。 非抢占式 SJF 调度是指一旦 CPU 开始执行一个任务, 它将继续执行该任务, 直到任务完成。 在这种情况下, 我们不需要考虑抢占。

以下是一个用 Python 编写的非抢占式 SJF 调度程序:

import operator

def SJF(processes):
    start_time = []    # 开始时间
    complete_time = []    # 完成时间
    remaining_time = {}    # 剩余时间

    for i in range(len(processes)):
        # 将所有进程及其剩余时间存入一个字典中
        remaining_time[i] = processes[i][1]

    # 根据进程的长度排序
    sorted_processes = sorted(processes, key=operator.itemgetter(1))

    current_time = 0
    for i in range(len(sorted_processes)):
        # 执行进程
        start_time.append(current_time)
        current_time += sorted_processes[i][1]
        complete_time.append(current_time)

    return (start_time, complete_time)


if __name__ == '__main__':
    p = [(1, 10), (2, 5), (3, 8), (4, 12), (5, 3)]
    start_time, complete_time = SJF(p)
    print("Start Time: ", start_time)
    print("Complete Time: ", complete_time)
解释

这个程序首先初始化了一个空列表,分别存储开始时间和完成时间。然后它创建了一个字典,其中包含所有的进程及其剩余时间。之后, 它将所有进程按长度排序。 接下来,对于排序后的每个任务, 我们将任务加入到进程表并更新当前时间。 最后, 我们将开始时间和完成时间分别添加到对应的列表中。 最后函数返回这两个列表。

运行

下面是程序在命令行中的输出:

Start Time:  [0, 3, 8, 16, 28]
Complete Time:  [10, 8, 16, 28, 31]
结论

SJF 调度算法是一种比较高效的 CPU 调度算法。 在 SJF 中, 虽然我们不能保证最短平均等待时间,但它可以保证最小化平均等待时间。 该算法可能会导致长作业长时间等待, 因此不适用于实时计算机环境。