- 操作系统教程
- 操作系统 - 首页
- 操作系统 - 需求
- 操作系统 - 概述
- 操作系统 - 历史
- 操作系统 - 组成部分
- 操作系统 - 结构
- 操作系统 - 架构
- 操作系统 - 服务
- 操作系统 - 属性
- 操作系统 - 周转时间 & 带权周转时间
- 操作系统进程
- 操作系统 - 进程
- 操作系统 - 进程调度
- 操作系统 - 调度算法
- 先来先服务 (FCFS) 调度算法
- 最短作业优先 (SJF) 调度算法
- 轮询调度算法
- 最高响应比优先 (HRRN) 调度算法
- 优先级调度算法
- 多级队列调度
- 上下文切换
- 进程操作
- 彩票进程调度
- 预测突发时间的最短作业优先调度
- 竞争条件漏洞
- 临界区同步
- 互斥同步
- 进程控制块
- 进程间通信
- 抢占式和非抢占式调度
- 操作系统同步
- 进程同步
- 操作系统内存管理
- 操作系统 - 内存管理
- 操作系统 - 虚拟内存
- 操作系统存储管理
- 操作系统 - 文件系统
- 操作系统类型
- 操作系统 - 类型
- 操作系统杂项
- 操作系统 - 多线程
- 操作系统 - I/O 硬件
- 操作系统 - I/O 软件
- 操作系统 - 安全
- 操作系统 - Linux
- 考试题库及答案
- 考试题库及答案
- 操作系统有用资源
- 操作系统 - 快速指南
- 操作系统 - 有用资源
- 操作系统 - 讨论
操作系统调度算法
进程调度器根据特定的调度算法,将不同的进程分配给CPU。本章将讨论六种常用的进程调度算法:
- 先来先服务 (FCFS) 调度
- 最短作业优先 (SJN) 调度
- 优先级调度
- 最短剩余时间优先
- 轮询 (RR) 调度
- 多级队列调度
这些算法是非抢占式或抢占式的。非抢占式算法的设计使得一旦一个进程进入运行状态,它就不能被抢占,直到它完成分配的时间,而抢占式调度是基于优先级的,当高优先级的进程进入就绪状态时,调度程序可以随时抢占低优先级的运行进程。
先来先服务 (FCFS)
- 作业按先来先服务的顺序执行。
- 这是一种非抢占式、可抢占的调度算法。
- 易于理解和实现。
- 其实现基于 FIFO 队列。
- 性能较差,因为平均等待时间较长。
每个进程的**等待时间**如下:
进程 | 等待时间:服务时间 - 到达时间 |
---|---|
P0 | 0 - 0 = 0 |
P1 | 5 - 1 = 4 |
P2 | 8 - 2 = 6 |
P3 | 16 - 3 = 13 |
平均等待时间:(0+4+6+13) / 4 = 5.75
最短作业优先 (SJN)
这也被称为**最短作业优先**,或 SJF。
这是一种非抢占式、可抢占的调度算法。
最小化等待时间的最佳方法。
易于在批处理系统中实现,其中所需的 CPU 时间是预先知道的。
无法在交互式系统中实现,因为所需的 CPU 时间是未知的。
处理器应该预先知道进程需要多长时间。
已知:进程表及其到达时间、执行时间
进程 | 到达时间 | 执行时间 | 服务时间 |
---|---|---|---|
P0 | 0 | 5 | 0 |
P1 | 1 | 3 | 5 |
P2 | 2 | 8 | 14 |
P3 | 3 | 6 | 8 |
每个进程的**等待时间**如下:
进程 | 等待时间 |
---|---|
P0 | 0 - 0 = 0 |
P1 | 5 - 1 = 4 |
P2 | 14 - 2 = 12 |
P3 | 8 - 3 = 5 |
平均等待时间:(0 + 4 + 12 + 5)/4 = 21 / 4 = 5.25
基于优先级的调度
优先级调度是一种非抢占式算法,也是批处理系统中最常见的调度算法之一。
每个进程都分配一个优先级。优先级最高的进程首先执行,依此类推。
具有相同优先级的进程按先来先服务的顺序执行。
优先级可以根据内存需求、时间需求或任何其他资源需求来决定。
已知:进程表及其到达时间、执行时间和优先级。这里我们认为 1 是最低优先级。
进程 | 到达时间 | 执行时间 | 优先级 | 服务时间 |
---|---|---|---|---|
P0 | 0 | 5 | 1 | 0 |
P1 | 1 | 3 | 2 | 11 |
P2 | 2 | 8 | 1 | 14 |
P3 | 3 | 6 | 3 | 5 |
每个进程的**等待时间**如下:
进程 | 等待时间 |
---|---|
P0 | 0 - 0 = 0 |
P1 | 11 - 1 = 10 |
P2 | 14 - 2 = 12 |
P3 | 5 - 3 = 2 |
平均等待时间:(0 + 10 + 12 + 2)/4 = 24 / 4 = 6
最短剩余时间优先
最短剩余时间 (SRT) 是 SJN 算法的抢占式版本。
处理器分配给最接近完成的作业,但它可以被一个具有更短完成时间的新就绪作业抢占。
无法在交互式系统中实现,因为所需的 CPU 时间是未知的。
它通常用于需要优先处理短作业的批处理环境。
轮询调度
轮询是一种抢占式进程调度算法。
每个进程都被提供一个固定的执行时间,这被称为**时间片**。
一旦一个进程执行了一定的时间段,它就会被抢占,然后其他进程执行一定的时间段。
上下文切换用于保存被抢占进程的状态。
每个进程的**等待时间**如下:
进程 | 等待时间:服务时间 - 到达时间 |
---|---|
P0 | (0 - 0) + (12 - 3) = 9 |
P1 | (3 - 1) = 2 |
P2 | (6 - 2) + (14 - 9) + (20 - 17) = 12 |
P3 | (9 - 3) + (17 - 12) = 11 |
平均等待时间:(9+2+12+11) / 4 = 8.5
多级队列调度
多级队列不是一个独立的调度算法。它们利用其他现有的算法对具有共同特征的作业进行分组和调度。
- 为具有共同特征的进程维护多个队列。
- 每个队列可以有自己的调度算法。
- 为每个队列分配优先级。
例如,CPU 密集型作业可以安排在一个队列中,所有 I/O 密集型作业安排在另一个队列中。然后,进程调度程序交替地从每个队列中选择作业,并根据分配给该队列的算法将它们分配给 CPU。