📌  相关文章
📜  最短作业优先(SJF)计划程序|套装2(先发制人)(1)

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

最短作业优先(SJF)计划程序|套装2(先发制人)

最短作业优先(SJF)是一种CPU调度算法,它根据进程的执行时间来安排进程的优先级,运行时间短的进程优先级较高,运行时间长的进程优先级较低。先发制人是一种进程调度算法,它根据进程的到达时间来安排进程的执行顺序,在时间到达时,CPU在就绪队列中选择最高优先级的进程执行。

程序介绍

本程序是一个基于先发制人调度算法的最短作业优先(SJF)计划程序,可以帮助用户模拟进程的执行顺序,并计算出进程的平均等待时间和平均完成时间。用户可以通过修改输入文件,来模拟不同的进程执行顺序,并观察不同调度算法对进程执行效率的影响。

程序实现

本程序是一个Python脚本,使用了pandas库进行数据处理,并将结果输出到文本文件。程序包含以下模块:

1. 输入模块

输入模块是由用户提供输入文件,该文件包含有关进程的信息,例如进程编号、到达时间和执行时间。程序可以接受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
2. 输出模块

输出模块负责将结果输出到文本文件。程序使用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)
3. SJF调度模块

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
4. 主函数

主函数负责程序的整个流程,它调用输入模块读取输入文件,然后调用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算法对进程进行调度,并计算出平均等待时间和平均完成时间。程序将结果输出到文本文件中。