【操作系统】4.进程调度算法
进程调度算法决定了进程在何时、以何种顺序被分配到 CPU 上执行。不同的调度算法适合不同类型的操作系统和应用需求,以下是一些常用的进程调度算法:
1. 先来先服务调度(FCFS: First-Come, First-Served)
- 算法原理:按进程到达的先后顺序分配 CPU,先到达的进程先被处理。
- 优点:简单易实现,公平性好。
- 缺点:可能导致“饥饿”问题,即后来的短任务可能要等待很长时间,导致平均等待时间较长。
- 适用场景:适合需要简单管理的系统,但不适用于需要快速响应的实时系统。
2. 短作业优先调度(SJF: Shortest Job First)
- 算法原理:选择估计运行时间最短的进程先执行,可以是非抢占式或抢占式。
- 优点:在理想情况下可实现最小的平均等待时间。
- 缺点:无法准确预测进程的执行时间(尤其是动态任务);可能导致长作业“饥饿”。
- 适用场景:适合批处理系统,适用于已知任务长度的情况。
3. 最短剩余时间优先(SRTF: Shortest Remaining Time First)
- 算法原理:这是 SJF 的抢占式版本。每次有新进程到达时,若新进程的剩余时间短于当前进程,则抢占当前进程。
- 优点:能进一步减少平均等待时间。
- 缺点:实时性差,长任务可能长期等待。
- 适用场景:与 SJF 类似,适合批处理系统。
( 短作业优先 =》减少平均等待时间 )
4. 优先级调度(Priority Scheduling)
- 算法原理:为每个进程分配一个优先级,优先级高的进程优先执行。可以是抢占式或非抢占式。如果两个进程优先级相同,则采用 FCFS 的方式调度。
- 优点:能保证高优先级任务及时执行。
- 缺点:可能出现“优先级反转”(低优先级进程占用资源,导致高优先级进程无法执行)和“饥饿”(长时间得不到调度)问题。通过引入老化机制(逐渐提高长时间等待的进程优先级)可以缓解饥饿。
- 适用场景:适用于需要根据任务优先级灵活分配资源的系统,如实时系统。
5. 时间片轮转调度(Round Robin)
- 算法原理:为每个进程分配一个固定的时间片,超出时间片则切换到下一个进程,未完成的进程会被放回队列等待下一次轮到。
- 优点:简单公平,适合多任务系统,能保证每个任务都能得到处理。
- 缺点:时间片长度设置不当可能导致较频繁的上下文切换,增加了系统开销;时间片过长又会导致响应变慢。需要根据系统的负载和应用场景来调整,一般在几毫秒到几十毫秒之间。
- 适用场景:广泛应用于分时系统、交互式系统,适合多用户环境。
6. 多级反馈队列调度(Multilevel Feedback Queue Scheduling)
- 算法原理:进程被分配到多个优先级队列中,每个队列有不同的时间片长度和优先级。优先级高的队列时间片较短,优先处理高优先级队列的进程。在任务执行过程中,可以动态优先级调整,即长时间等待的低优先级进程会被提升到更高的优先级队列,以避免长作业饥饿。
- 优点:结合了 短作业优先 和 时间片轮转 的优点,能够高效地处理不同类型的任务。它通过根据任务的执行时间动态调整优先级,可以有效地减少平均等待时间,同时避免长时间的任务阻塞短任务。
- 缺点:算法复杂,管理多个队列需要额外开销。
- 适用场景:适用于需要处理不同类型任务的系统,尤其是需要高响应速度和公平性的操作系统。
7. 实时调度算法
实时系统中需要特殊的调度算法,以确保任务在特定时间完成。以下是常见的实时调度算法:
- 最早截止时间优先(EDF: Earliest Deadline First):优先执行最接近截止时间的任务,适用于动态优先级实时系统。
- 最低松弛时间优先(LST: Least Slack Time):计算任务的松弛时间(截止时间减去剩余执行时间),选择松弛时间最小的任务执行。
这些实时调度算法保证了系统在特定时间内完成高优先级任务,适合控制系统和嵌入式系统等需要精确时序控制的场景。
拓展:
现代操作系统通常会根据实际需求,将多种调度算法结合起来使用,以实现最佳的性能和响应速度。例如,Windows 和 Linux 中使用的调度算法结合了优先级、时间片轮转和多级反馈队列,以适应不同类型的任务和用户需求。
1). Windows 操作系统的调度算法
Windows 的调度算法基于优先级调度和多级反馈队列,同时结合了抢占式调度。Windows 中将进程分为不同优先级级别,从 0 到 31,其中:
- 0 级用于系统空闲进程(Idle Process),
- 1 到 15 级用于普通进程(普通用户进程),
- 16 到 31 级用于实时进程(Real-Time Processes)。
Windows 调度算法的关键特点
-
优先级调度:
- Windows 会根据进程的优先级来进行调度,高优先级的进程优先获得 CPU。优先级包括 静态优先级 和 动态优先级,动态优先级在进程执行过程中可能会发生调整,例如长时间没有获得 CPU 的低优先级进程会被提升优先级,以避免饥饿现象。
-
抢占式调度:
- 如果一个高优先级进程准备运行,那么操作系统会立即中断当前低优先级进程的执行,并将 CPU 资源分配给高优先级进程。
-
时间片轮转调度:
- Windows 为普通优先级的进程分配了固定长度的时间片(时间片长度基于系统的设置和进程的优先级)。在同一优先级的进程间,采用时间片轮转方式来保证公平性。实时进程则不会被时间片轮转机制影响。
-
多级反馈队列:
- Windows 的调度器使用多级反馈队列,使系统能灵活管理不同类型的进程,并保证高优先级进程的快速响应。
调度算法的应用场景
Windows 的调度算法设计适合桌面环境和交互式系统,确保高优先级任务快速响应,用户操作流畅,同时可以保证普通应用的并行执行。对于实时任务,例如某些驱动程序和系统服务,高优先级可确保其在需要时立即得到 CPU 资源。
2). Linux 操作系统的调度算法
Linux 的调度算法发展经历了多个版本,不同版本的调度算法特性有所不同。目前,Linux 采用的是基于完全公平调度器(CFS, Completely Fair Scheduler)算法,并结合了优先级和抢占式调度特性。
Linux 调度算法的关键特点
-
完全公平调度器 (CFS):
- CFS 的核心思想是分时公平,即每个进程都能够公平地获得 CPU 时间。CFS 采用一个 红黑树 数据结构来组织进程,红黑树中的节点按照进程的 虚拟运行时间 排序。CFS 会优先调度虚拟运行时间最少的进程,保证每个进程能够平等地获得 CPU 资源。
- CFS 不使用时间片的概念,而是计算每个进程的虚拟运行时间来实现公平调度。虚拟运行时间会受到进程优先级的影响,优先级越高的进程,其虚拟运行时间的增加速率越慢,从而优先获得调度机会。
-
抢占式调度:
- CFS 支持抢占式调度,当有优先级较高或虚拟运行时间较少的进程进入就绪状态时,操作系统会抢占当前正在运行的进程。
-
实时调度类:
- 除了普通进程,Linux 还支持 实时进程。实时进程分为 SCHED_FIFO 和 SCHED_RR 两种调度策略:
- SCHED_FIFO(先进先出调度):实时进程根据优先级进行调度,优先级高的先执行,没有时间片限制。
- SCHED_RR(时间片轮转调度):在同优先级的实时进程间轮流分配 CPU 时间片。
- 实时进程的优先级高于普通进程,在系统资源紧张的情况下,实时进程会优先获得 CPU 调度。
- 除了普通进程,Linux 还支持 实时进程。实时进程分为 SCHED_FIFO 和 SCHED_RR 两种调度策略:
调度算法的应用场景
Linux 的 CFS 适合服务器环境,其设计目标是确保系统的公平性和高吞吐量,适合长时间运行的任务。在实时性需求较高的场景中,Linux 也提供了实时调度策略,可以保证高优先级的实时任务得到优先调度。
=》 Windows 与 Linux 调度算法的对比:
特性 | Windows 调度 | Linux 调度 |
---|---|---|
调度策略 | 优先级调度、多级反馈队列 | 完全公平调度 (CFS) + 实时调度 |
优先级范围 | 0-31 | 普通优先级进程 + 实时优先级进程 |
时间片 | 支持时间片轮转调度 | CFS 没有时间片概念,实时进程使用时间片 |
抢占机制 | 高优先级任务抢占低优先级任务 | 高优先级任务抢占低优先级任务 |
数据结构 | 多级反馈队列 | 红黑树(CFS) |
适用场景 | 桌面环境、交互式应用 | 服务器环境、高吞吐量、多任务并发 |
总结来说,Windows 更侧重于交互式用户体验的优化,强调响应速度;而 Linux 的 CFS 则更加关注任务的公平性和系统的高吞吐量,适合长时间运行的后台任务。此外,Linux 中的实时调度选项也使其在实时系统中更具灵活性。