当前位置:首页 > Python > 正文

Python实现优先级调度算法(小白也能看懂的操作系统进程调度教程)

在操作系统中,进程调度是核心功能之一。而优先级调度算法是一种常见的调度策略,它根据每个进程的优先级来决定执行顺序。本文将带你用Python从零开始实现一个简单的优先级调度器,即使你是编程新手,也能轻松理解!

什么是优先级调度算法?

优先级调度算法的基本思想是:每个进程都有一个优先级数值,数值越小(或越大,取决于设计)表示优先级越高。调度器总是选择当前就绪队列中优先级最高的进程来执行。

例如,在医院急诊室,危重病人(高优先级)会比感冒患者(低优先级)先得到治疗——这就是优先级调度的现实类比。

Python实现优先级调度算法(小白也能看懂的操作系统进程调度教程) Python优先级调度算法 操作系统进程调度 Python实现调度算法 优先级调度示例代码 第1张

Python实现步骤

我们将使用Python内置的heapq模块(最小堆)来高效地管理优先级队列。假设数字越小,优先级越高。

1. 定义进程类

首先,我们创建一个简单的进程类,包含进程ID、执行时间(burst time)和优先级:

class Process:    def __init__(self, pid, burst_time, priority):        self.pid = pid              # 进程ID        self.burst_time = burst_time  # 执行所需时间        self.priority = priority    # 优先级(数值越小,优先级越高)    def __lt__(self, other):        # 用于 heapq 比较:优先级小的排在前面        return self.priority < other.priority    def __repr__(self):        return f"Process({self.pid}, BT={self.burst_time}, P={self.priority})"

2. 实现优先级调度函数

接下来,我们编写调度函数,使用最小堆来管理就绪队列:

import heapqdef priority_scheduling(processes):    """    执行优先级调度算法    :param processes: 进程列表    :return: 执行顺序和总等待时间    """    # 创建最小堆(优先级队列)    ready_queue = []    for p in processes:        heapq.heappush(ready_queue, p)    execution_order = []    current_time = 0    total_waiting_time = 0    while ready_queue:        # 取出优先级最高的进程(堆顶)        process = heapq.heappop(ready_queue)                # 等待时间 = 当前时间 - 进程到达时间(本例假设所有进程在时间0到达)        waiting_time = current_time        total_waiting_time += waiting_time                execution_order.append((process.pid, current_time, current_time + process.burst_time))                # 更新当前时间        current_time += process.burst_time    avg_waiting_time = total_waiting_time / len(processes)    return execution_order, avg_waiting_time

3. 测试我们的调度器

现在,我们创建几个测试进程并运行调度算法:

if __name__ == "__main__":    # 创建进程列表:(PID, 执行时间, 优先级)    processes = [        Process(1, 10, 3),        Process(2, 1, 1),   # 最高优先级        Process(3, 2, 4),        Process(4, 1, 2)    # 次高优先级    ]    order, avg_wait = priority_scheduling(processes)    print("执行顺序(进程ID, 开始时间, 结束时间):")    for pid, start, end in order:        print(f"  进程 {pid}: [{start} → {end}]")    print(f"\n平均等待时间: {avg_wait:.2f}")

运行结果如下:

执行顺序(进程ID, 开始时间, 结束时间):  进程 2: [0 → 1]  进程 4: [1 → 2]  进程 1: [2 → 12]  进程 3: [12 → 14]平均等待时间: 3.75

关键知识点总结

  • Python优先级调度算法利用堆结构高效获取最高优先级任务。
  • 在实际操作系统中,还需考虑进程到达时间、抢占式调度等复杂因素。
  • 本例假设所有进程同时到达,且为非抢占式(一旦开始执行就不会被中断)。
  • 通过重写__lt__方法,使自定义对象支持堆排序。

扩展思考

你可以尝试改进这个调度器,比如:

  • 支持进程在不同时间到达(添加arrival_time属性)
  • 实现抢占式优先级调度(高优先级进程可中断低优先级进程)
  • 可视化执行过程(使用matplotlib绘制甘特图)

掌握操作系统进程调度原理,不仅能加深对操作系统的理解,还能提升你在系统编程和算法设计方面的能力。希望这篇关于Python实现调度算法的教程对你有帮助!

如果你喜欢这个优先级调度示例代码,不妨动手修改参数,观察不同优先级组合下的调度效果吧!