SJF(短作业优先)操作系统调度

问题描述 投票:0回答:1

我正在尝试对齐代表调度模拟的甘特图。代码是:

def input_processes():
    while True:
        num_processes = int(input("Enter the number of processes (5 to 10): "))
        if 5 <= num_processes <= 10:
            break
        else:
            print("Invalid input. Number of processes should be between 5 and 10.")

    processes = {}

    for i in range(1, num_processes + 1):
        burst_time = int(input(f"Enter burst time for process {i} (5 to 15): "))
        arrival_time = int(input(f"Enter arrival time for process {i} (0 to 10): "))

        processes[f"P{i}"] = {
            'burst_time': burst_time,
            'arrival_time': arrival_time,
            'end_time': 0,
            'turnaround_time': 0,
            'waiting_time': 0
        }

    return processes


def calculate_times(processes):
    current_time = 0

    for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
        start_time = max(current_time, processes[process]['arrival_time'])
        end_time = start_time + processes[process]['burst_time']

        processes[process]['end_time'] = end_time
        processes[process]['turnaround_time'] = end_time - processes[process]['arrival_time']
        processes[process]['waiting_time'] = start_time - processes[process]['arrival_time']

        current_time = end_time

    return processes


def display_table(processes):
    print("\nProcess\t\tArrival Time\tBurst Time\tEnd Time\tTurnaround Time\tWaiting Time")
    for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
        p = processes[process]
        print(f"{process}\t\t{p['arrival_time']}\t\t{p['burst_time']}\t\t{p['end_time']}\t\t{p['turnaround_time']}\t\t{p['waiting_time']}")

def create_gantt_chart(processes):
    LEGEND_NAMES = " "
    TIMELINE = "|"
    LEGEND_TIME = "0"

    timings = 0

    for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
        burst_remaining = processes[process]['burst_time']
        arrival_time = processes[process]['arrival_time']
        burst_timing = processes[process]['burst_time']
        end_time = processes[process]['end_time']

        if arrival_time > timings:
            idle_timing = arrival_time - timings
            TIMELINE += '+' * idle_timing

            timings += idle_timing

        TIMELINE += '-' * burst_timing + '|'
        LEGEND_NAMES += ' ' * (arrival_time - timings) + str(process).center(burst_timing)
        LEGEND_TIME += ' ' * burst_timing + str(end_time)

        timings = end_time

    # Prepare the gantt
    GANTT = LEGEND_NAMES + "\n" + TIMELINE + "\n" + LEGEND_TIME + "\n"
    print(GANTT)


if __name__ == "__main__":
    processes = input_processes()
    processes = calculate_times(processes)
    display_table(processes)
    create_gantt_chart(processes)

输出为:

table and gantt

我希望 P 位于每个进程上方的中间或中心,并且下方的结束时间应始终位于条形 (|) 下方,如下所示

   P2  P3    P1    P4     P5
|+---|----|-----|------|-------|
0    4    8     13     19      26

尽管如此,用户输入它不会失去对齐

python algorithm operating-system
1个回答
0
投票

最简单的方法是手动跟踪每一侧的填充。这甚至可以处理突发时间为 1 的复杂情况。

def create_gantt_chart(processes):
    LEGEND_NAMES = " "
    TIMELINE = "|"
    LEGEND_TIME = ""

    timings = 0

    for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
        burst_remaining = processes[process]['burst_time']
        arrival_time = processes[process]['arrival_time']
        burst_timing = processes[process]['burst_time']
        end_time = processes[process]['end_time']

        this_timeline = ""
        this_name = str(process)
        this_time = str(timings)
        if arrival_time > timings:
            idle_timing = arrival_time - timings
            this_timeline += '+' * idle_timing

            timings += idle_timing
        this_timeline += '-' * burst_timing

        length = max(len(this_timeline) + 1, len(this_name) + 1, len(this_time) + 2)

        # timeline still has a "|" to add.
        if len(this_timeline) + 1 < length:
            left = (length - len(this_timeline) - 1)//2
            right = length - len(this_timeline) - 1 - left
            this_timeline = (" "*left) + this_timeline + (" "*right)
        this_timeline += "|"

        if len(this_name) < length:
            left = (length - len(this_name))//2
            right = length - len(this_name) - left
            this_name = (" "*left) + this_name + (" "*right)

        # Buffer only on the right.
        if len(this_time) < length:
            this_time += " " * (length - len(this_time))

        TIMELINE += this_timeline
        LEGEND_NAMES += this_name
        LEGEND_TIME += this_time

        timings = end_time

    # Prepare the gantt
    GANTT = LEGEND_NAMES + "\n" + TIMELINE + "\n" + LEGEND_TIME + str(timings) + "\n"
    print()
    print(GANTT)
© www.soinside.com 2019 - 2024. All rights reserved.