【操作系统-19】优先级调度算法
优先级调度算法(Priority Scheduling)
定义:
优先级调度算法(Priority Scheduling)是一种 非抢占式 或 抢占式 的调度算法,任务根据其 优先级 来进行调度,优先级高的任务先执行。任务的优先级可以是一个固定的整数值,优先级较大的任务先执行,较低优先级的任务则会等待。优先级调度有两种主要形式:
- 非抢占式优先级调度:任务一旦开始执行,直到完成,不会被打断,除非它执行完毕或自愿释放 CPU。
- 抢占式优先级调度:任务在运行过程中,如果有优先级更高的任务到来,当前任务会被中断,CPU 会立即分配给优先级更高的任务。
优先级调度算法能够有效满足系统对不同任务优先级的需求,适用于实时系统和有优先级需求的系统。
特点:
-
任务调度依据优先级: 每个任务有一个优先级值,调度器根据优先级进行任务选择。
-
适用于实时任务处理: 特别适合那些任务有明确优先级的场景,比如实时系统中紧急任务需要优先执行。
-
可能导致饥饿现象: 如果低优先级的任务长时间没有高优先级任务来打断,可能会出现饥饿现象,导致低优先级任务无法得到执行。
优缺点:
优点:
-
灵活性高: 根据任务的优先级进行调度,可以使得重要的任务得到优先处理。
-
适用于有优先级需求的任务: 如实时操作系统、处理紧急任务的系统等,可以根据任务的紧急程度合理安排执行顺序。
-
系统响应较好: 高优先级任务能够得到及时处理,减少了响应延迟。
缺点:
-
可能出现饥饿现象: 低优先级的任务可能因为总有高优先级的任务被调度执行而长时间无法得到执行,导致“饥饿”问题。(解决方案:通常采用“老化”技术,即逐渐提高等待过久任务的优先级)。
-
难以动态调整: 如果任务的优先级是固定的,可能会导致一些任务长时间得不到执行。如果优先级动态调整,可能会带来额外的计算和管理开销。
-
优先级反转问题: 在一些复杂的系统中,低优先级任务持有共享资源时,高优先级任务可能因为等待资源而被阻塞,导致优先级反转。(解决方案:优先级继承或优先级天花板)。
适用场景:
优先级调度算法适用于那些任务优先级差异较大的场景,特别是在实时系统中。例如,操作系统、嵌入式系统中,对某些时间要求严格的任务,需要优先调度执行。对于任务有明确优先级或紧急任务处理需求的系统,优先级调度能够帮助合理分配资源。
优先级调度算法例题
假设有 4 个任务,它们的到达时间、服务时间和优先级如下:
| 任务 | 到达时间 (Arrival Time) | 服务时间 (Burst Time) | 优先级 (Priority) |
|---|---|---|---|
| P1 | 0 | 4 | 3 |
| P2 | 1 | 3 | 1 |
| P3 | 2 | 2 | 4 |
| P4 | 3 | 1 | 2 |
步骤 1:根据优先级进行排序
优先级调度算法的核心是 根据优先级高低决定任务执行顺序。假设优先级数值越小,表示优先级越高。
- P1:优先级 3,较低优先级。
- P2:优先级 1,最高优先级。
- P3:优先级 4,最低优先级。
- P4:优先级 2,次高优先级。
由于优先级 1 的任务最高,优先执行 P2。
步骤 2:任务调度过程
- P2 执行:到达时间为 1,服务时间为 3,执行 3 单位时间后完成。完成时间 = 1 + 3 = 4。
- 任务执行顺序为 P2 → P4 → P1 → P3。
- P4 执行:到达时间为 3,服务时间为 1,执行 1 单位时间后完成。完成时间 = 4 + 1 = 5。
- P1 执行:到达时间为 0,服务时间为 4,执行 4 单位时间后完成。完成时间 = 5 + 4 = 9。
- P3 执行:到达时间为 2,服务时间为 2,执行 2 单位时间后完成。完成时间 = 9 + 2 = 11。
步骤 3:计算周转时间 (Turnaround Time) 和等待时间 (Waiting Time)
P2:
- 周转时间 = 完成时间 - 到达时间 = 4 - 1 = 3
- 等待时间 = 周转时间 - 服务时间 = 3 - 3 = 0
P4:
- 周转时间 = 完成时间 - 到达时间 = 5 - 3 = 2
- 等待时间 = 周转时间 - 服务时间 = 2 - 1 = 1
P1:
- 周转时间 = 完成时间 - 到达时间 = 9 - 0 = 9
- 等待时间 = 周转时间 - 服务时间 = 9 - 4 = 5
P3:
- 周转时间 = 完成时间 - 到达时间 = 11 - 2 = 9
- 等待时间 = 周转时间 - 服务时间 = 9 - 2 = 7
总结表格
| 任务 | 到达时间 | 服务时间 | 完成时间 | 周转时间 | 等待时间 |
|---|---|---|---|---|---|
| P2 | 1 | 3 | 4 | 3 | 0 |
| P4 | 3 | 1 | 5 | 2 | 1 |
| P1 | 0 | 4 | 9 | 9 | 5 |
| P3 | 2 | 2 | 11 | 9 | 7 |
-
平均等待时间 = (0 + 1 + 5 + 7) / 4 = 3.25
-
平均周转时间 = (3 + 2 + 9 + 9) / 4 = 5.75
分析
- 优先级调度的公平性:优先级调度算法确保高优先级的任务能够优先执行,从而提高了系统对关键任务的响应时间。但是,这也可能导致 低优先级任务的饥饿问题。在这个例子中,P1 和 P3 的等待时间较长,表明它们处于低优先级,等待了较长时间才得以执行。
- 平均等待时间和周转时间:在本例中,平均等待时间是 3.25,平均周转时间是 5.75,表明高优先级任务的优先调度改善了这些任务的响应时间,但低优先级任务的性能受到影响。
改进策略
为了避免饥饿问题,优先级调度算法可以与 老化 技术结合,即随着任务等待时间的增加,任务的优先级逐渐上升,这样可以避免低优先级任务被无限期地推迟。
总结
优先级调度算法适用于那些任务具有明显优先级差异的系统,尤其是实时系统。然而,饥饿问题是其主要缺点之一,因此需要通过额外的机制(如优先级老化)来确保低优先级任务能够得到公平的执行机会。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)