进程调度算法是操作系统用来决定哪些进程在何时执行的策略,目的是为了合理分配系统资源,提高系统的响应速度和资源利用率。不同的调度算法有不同的优缺点,适用于不同的应用场景。常见的进程调度算法可以分为以下几类:
1. 先来先服务(FCFS,First-Come, First-Served)
定义:
FCFS 是最简单的调度算法,按进程到达的顺序依次执行,先到达的进程先执行。
特点:
- 非抢占式:一旦一个进程开始执行,直到执行完毕才会切换到下一个进程。
- 易于实现,简单直观。
- 不适合实时系统和需要高响应性的场景。
缺点:
- 不公平性:长时间运行的进程可能会导致后续进程的等待时间过长(Convoy Effect)。
- 平均等待时间长:特别是当短作业排在长作业后面时,可能导致整个系统的平均等待时间增加。
适用场景:
- 对于大多数进程的执行时间大致相同的情况,FCFS 可以有效利用系统资源。
2. 最短作业优先(SJF,Shortest Job First)
定义:
SJF 调度算法优先选择执行估计运行时间最短的进程。它可以是非抢占式的(即已开始执行的进程不会被打断)或抢占式的(即当前进程如果有更短的作业进入,则会被抢占)。
特点:
- 抢占式:最短作业会被优先调度,即使当前进程正在运行。
- 非抢占式:只要一个进程开始执行,直到执行完毕。
优点:
缺点:
- 难以实现:需要知道进程的执行时间,但在大多数情况下,操作系统无法准确预测。
- 可能导致饥饿:长作业可能一直得不到调度,导致饿死现象。
适用场景:
- 如果能准确估计每个进程的执行时间,SJF 可以提供最优的性能。
3. 优先级调度(Priority Scheduling)
定义:
根据每个进程的优先级进行调度,优先级高的进程先执行。优先级调度可以是抢占式的,也可以是非抢占式的。
特点:
- 抢占式:如果新的进程优先级更高,则会抢占当前进程。
- 非抢占式:一旦进程开始执行,就会一直执行直到完成。
优点:
- 可根据进程的重要性进行调度,能够实现优先级任务的优先执行。
缺点:
- 饥饿问题:低优先级的进程可能永远得不到执行。
- 优先级反转:低优先级的进程可能因为占用资源而阻碍高优先级进程的执行。
适用场景:
- 用于需要区分不同任务重要性的场景,如实时操作系统。
4. 轮转调度(RR,Round Robin)
定义:
RR 调度算法是一种时间片轮转调度算法,所有进程按顺序轮流执行,每个进程分配一个时间片(Time Quantum)。如果进程在时间片内没有执行完,系统会将其挂起,换到下一个进程执行。
特点:
- 抢占式:每个进程会在分配的时间片内运行,时间片耗尽后会被挂起,执行下一个进程。
- 公平性:每个进程都能获得相等的 CPU 时间。
优点:
- 时间片分配使得每个进程的等待时间得到了控制,能够保证系统响应速度。
- 易于实现,且适用于大多数系统,特别是交互式系统。
缺点:
- 时间片的大小对性能影响很大。如果时间片过小,会增加上下文切换的开销;如果时间片过大,可能失去轮转调度的优势。
- 不一定能有效减少等待时间。
适用场景:
- 多任务操作系统,尤其是交互式系统,用户对响应时间有一定要求。
5. 多级反馈队列(Multilevel Feedback Queue,MLFQ)
定义:
多级反馈队列是一种改进的调度算法,它结合了多个队列,每个队列有不同的优先级。进程根据运行时间和行为被动态地调整到不同的队列中,优先级较高的队列使用较短的时间片,优先级较低的队列使用较长的时间片。
特点:
- 进程在队列之间移动,短作业和长作业分别被分配到不同的队列。
- 如果一个进程长时间没有完成,则会被移动到较低优先级的队列中。
优点:
- 结合了优先级调度和轮转调度的优点。
- 能够动态调整进程优先级,避免了饥饿问题。
缺点:
- 配置和实现相对复杂。
- 队列之间的优先级调度可能会引入不必要的复杂度。
适用场景:
- 多任务的操作系统,特别是需要平衡响应时间和公平性的场景。
6. 短期调度与长期调度
在进程调度中,通常有以下两种调度:
- 短期调度:在多个就绪进程中选择一个进程运行。一般由 CPU 调度算法(如 FCFS、SJF、RR、MLFQ)来实现。
- 长期调度:决定哪些新进程从外存调入内存,进入就绪队列等待调度。长期调度一般由操作系统的进程管理部分负责。
7. 调度算法的性能指标
进程调度算法的性能通常通过以下几个指标来衡量:
-
周转时间(Turnaround Time):一个进程从提交到完成所需的总时间。周转时间包括等待时间、执行时间和输入输出时间。
-
等待时间(Waiting Time):进程在就绪队列中等待 CPU 时间的总时长。
-
响应时间(Response Time):进程从提交到第一个响应之间的时间。对于交互式系统,响应时间是非常重要的。
-
吞吐量(Throughput):单位时间内完成的进程数,通常衡量系统的处理能力。