📅  最后修改于: 2023-12-03 15:10:37.199000             🧑  作者: Mango
最短作业优先(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 中, 虽然我们不能保证最短平均等待时间,但它可以保证最小化平均等待时间。 该算法可能会导致长作业长时间等待, 因此不适用于实时计算机环境。