📅  最后修改于: 2023-12-03 15:40:16.816000             🧑  作者: Mango
最短作业优先(SJF)是一种CPU调度算法,它根据进程的执行时间来安排进程的优先级,运行时间短的进程优先级较高,运行时间长的进程优先级较低。先发制人是一种进程调度算法,它根据进程的到达时间来安排进程的执行顺序,在时间到达时,CPU在就绪队列中选择最高优先级的进程执行。
本程序是一个基于先发制人调度算法的最短作业优先(SJF)计划程序,可以帮助用户模拟进程的执行顺序,并计算出进程的平均等待时间和平均完成时间。用户可以通过修改输入文件,来模拟不同的进程执行顺序,并观察不同调度算法对进程执行效率的影响。
本程序是一个Python脚本,使用了pandas库进行数据处理,并将结果输出到文本文件。程序包含以下模块:
输入模块是由用户提供输入文件,该文件包含有关进程的信息,例如进程编号、到达时间和执行时间。程序可以接受txt,csv,xlsx格式的文件,并根据输入文件创建pandas数据框。
import pandas as pd
def read_file(file_path):
"""
读取输入文件,返回包含进程信息的 Pandas 数据框。
:param file_path: str 输入文件路径
:return: DataFrame 包含进程信息的 Pandas 数据框。
"""
if file_path.endswith('.txt'):
# 读取 txt 文件
df = pd.read_csv(file_path, sep='\s+', header=None)
df.columns = ['pid', 'arrival', 'burst']
elif file_path.endswith('.csv'):
# 读取 CSV 文件
df = pd.read_csv(file_path)
elif file_path.endswith('.xlsx'):
# 读取 Excel 文件
df = pd.read_excel(file_path)
else:
raise Exception('文件格式不支持')
return df
输出模块负责将结果输出到文本文件。程序使用CSV格式将结果输出到文件中。输出文件包括每个进程的执行顺序,平均等待时间和平均完成时间。
def write_file(df, result, file_path):
"""
将结果写入文本文件。
:param df: DataFrame 包含进程信息的 Pandas 数据框。
:param result: dict 执行结果。
:param file_path: str 保存结果的文件路径。
"""
with open(file_path, 'w') as f:
f.write('Job Execution Order\n')
for pid in result['order']:
f.write('{0:2d} '.format(pid))
f.write('\n\n')
f.write('Average Waiting Time: {:.2f}\n'.format(result['avg_waiting_time']))
f.write('Average Turnaround Time: {:.2f}\n\n'.format(result['avg_turnaround_time']))
df.to_csv(f, index=False)
SJF调度模块是一个函数,它使用先发制人算法对进程进行调度,并计算平均等待时间和平均完成时间。该函数的输入是一个Pandas数据框,其中包含有关进程的信息,例如进程编号,到达时间和执行时间。函数返回一个字典,其中包含进程的执行顺序,平均等待时间和平均完成时间。
def sjf(df):
"""
使用最短作业优先(SJF)算法调度进程。
:param df: DataFrame 包含进程信息的 Pandas 数据框。
:return: dict 包含执行结果的字典。
"""
# 按到达时间对进程进行排序
df = df.sort_values(by='arrival')
# 处理进程调度过程
waiting_time = []
turnaround_time = []
completion_time = 0
order = []
while len(df) > 0:
next_job = df.iloc[0, :]
diff = int(next_job['arrival']) - completion_time
if diff > 0:
completion_time += diff
completion_time += int(next_job['burst'])
waiting_time.append(completion_time - int(next_job['arrival']) - int(next_job['burst']))
turnaround_time.append(completion_time - int(next_job['arrival']))
order.append(int(next_job['pid']))
df = df.drop(index=0)
avg_waiting_time = sum(waiting_time) / len(waiting_time)
avg_turnaround_time = sum(turnaround_time) / len(turnaround_time)
result = {'order': order, 'avg_waiting_time': avg_waiting_time, 'avg_turnaround_time': avg_turnaround_time}
return result
主函数负责程序的整个流程,它调用输入模块读取输入文件,然后调用SJF模块对进程进行调度并计算平均等待时间和平均完成时间。最后,主函数调用输出模块将结果输出到文本文件中。
if __name__ == '__main__':
# 读取输入文件
input_file = 'input.xlsx'
df = read_file(input_file)
# 调度进程
result = sjf(df)
# 将结果保存到文件
output_file = 'output.csv'
write_file(df, result, output_file)
用户需要提供一个包含有关进程的信息的输入文件,例如进程编号,到达时间和执行时间。用户可以选择使用txt,csv或xlsx格式的文件。然后,用户可以启动程序,程序将调用SJF算法对进程进行调度,并计算出平均等待时间和平均完成时间。程序将结果输出到文本文件中。