进程管理(二)调度
基本概念:
多道程序中,进程的数量往往多于处理机的个数,存在进程争用CPU情况。从就绪队列中按照一定的算法(公平、高效)选择一个进程并将CPU分配给它运行,以实现进程并发地执行
处理机调度时多道程序操作系统的基础,是操作系统设计的核心问题
调度层次:
一个任务从提交从开始直到完成,需要经历以下三级调度
- 作业调度(高级调度):负责从就绪队列中选择合适的作业或进程,将其调度到内存中准备执行。高级调度的目标是保持系统资源的良好利用和负载均衡,确保系统中始终有足够的作业在运行。高级调度通常涉及到进程的创建、撤销和进入就绪态,以及进程的调度到内存中
- 内存调度(中级调度):负责从内存中选择一部分进程暂时挂起或者换出到外存(如磁盘)中,以释放内存资源给其他进程使用。内存调度的目标是优化系统的内存利用率,避免内存过度占用和内存碎片化,以提高系统的性能和稳定性。内存调度通常涉及到进程的挂起、换入和换出等操作
- 进程调度(低级调度):低级调度也称为进程调度或CPU调度,它负责从就绪队列中选择一个进程分配CPU资源并执行。低级调度的目标是最大化系统的CPU利用率和响应速度,提高系统的吞吐量和性能。低级调度通常涉及到进程的抢占、上下文切换和CPU分配等操作。
进程调度方式:
定义: 调度方式指的是 某个进程正在CPU上执行时,若有个某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列。
非抢占调度方式:
- 在非剥夺调度方式下,一旦一个进程获得CPU资源开始执行,调度器将不会在其执行期间剥夺其CPU资源,除非该进程主动释放CPU或者进程自然结束。换句话说,进程只有在自愿放弃CPU时才会被调度器切换出去
- 非剥夺调度方式通常会导致长作业等待时间长,因为如果一个长时间运行的进程占用了CPU资源,其他等待CPU资源的短作业将无法获得CPU资源执行
抢占调度方式:
- 调度器可以在任何时候剥夺当前正在执行的进程的CPU资源,并将CPU分配给其他优先级更高的进程。换句话说,调度器可以在进程未完成时主动中断其执行,强制执行其他高优先级的进程
- 剥夺调度方式可以有效地避免长作业等待时间长的问题,提高系统的响应速度和吞吐量。但是它可能会增加系统的开销,因为频繁的上下文切换可能会导致性能下降
调度算法和准则
调度算法的性能和准则:
- CPU利用率:CPU时计算机中最重要和非常昂贵的资源,应尽可能的使CPU利用率最高
- 系统吞吐量:调度算法应该能够最大化系统的吞吐量,即单位时间内完成的进程数量。一个好的调度算法应该能够尽量减少进程的等待时间,提高系统的处理能力
- 周转时间(Turnaround Time):调度算法应该尽量减少进程的周转时间,即进程从提交到完成的时间。较短的周转时间可以提高系统的效率,减少资源的浪费
- 等待时间(Waiting Time):调度算法应该尽量减少进程的等待时间,即进程在就绪队列中等待执行的时间。较短的等待时间可以提高系统的效率和用户体验
- 响应时间(Response Time):调度算法应该能够尽快地响应用户的请求,并在较短的时间内完成任务。较低的响应时间可以提高系统的用户体验,使用户感觉系统更加快速和高效
常见调度算法:
-
FCFS(先来先服务)调度算法:
最简单的进程调度算法之一,也被称为先来先服务调度算法。它的原理很简单:按照进程到达就绪态的顺序来进行调度,先到达的进程先被执行,直到执行完或者进入等待状态
a. FCFS调度算法的优点包括简单易实现,公平性高,所有进程都有机会获得CPU资源执行
b. 存在导致长作业等待时间长的问题,因为一个长时间运行的进程会阻塞后面的进程,从而导致后面的进程等待时间较长;
c. 对于短作业和I/O密集型的进程不够友好,因为它们可能被长作业阻塞而等待较长时间
d. 进程的响应时间不确定,取决于前面进程的执行时间
-
SJF(短作业优先)调度算法:
一种按照进程的执行时间进行调度的算法,它选择预计执行时间最短的进程优先执行
a. 当一个进程到达就绪态时,它被放入就绪队列中等待执行。每个进程都有一个估计的执行时间,即预计完成所需的时间
b. 当CPU空闲时,调度器从就绪队列中选择预计执行时间最短的进程进行执行。即选择队列中估计执行时间最短的进程
c. 被选择的进程开始执行,直到完成、阻塞或者时间片结束; 当进程执行完毕时,它被移出系统;如果进程阻塞,它会被放回就绪队列等待继续执行
d. 进程在就绪队列中等待的时间即为它的等待时间。由于SJF算法优先选择执行时间最短的进程,因此平均等待时间通常会较短
*优点:*SJF调度算法的优点包括能够最小化平均等待时间,提高系统的吞吐量和响应速度
缺点:SJF调度算法需要准确估计每个进程的执行时间,而在实际应用中,很难准确预测每个进程的执行时间,因此可能会导致长作业等待时间长的问题。
如果有大量的短作业不断到达,长作业可能会长时间等待,产生饥饿现象
-
优先级调度算法:
优先级调度算法是一种根据进程的优先级来确定执行顺序的调度算法。每个进程都被赋予一个优先级,优先级越高的进程越早被执行
a.当一个进程到达就绪态时,它被放入就绪队列中等待执行。每个进程都被赋予一个优先级,通常由用户指定或者根据进程的特性动态调整
b.当CPU空闲时,调度器从就绪队列中选择优先级最高的进程进行执行。即选择队列中优先级最高的进程执行
c.被选择的进程开始执行,直到完成、阻塞或者时间片结束; 当进程执行完毕时,它被移出系统;如果进程阻塞,它会被放回就绪队列等待继续执行
*优点:*能够根据进程的重要性和紧急程度进行调度,能够灵活地适应不同类型的工作负载
*缺点:*如果一个低优先级的进程持有一个高优先级的资源而无法释放,可能会导致高优先级的进程无法执行,从而产生优先级反转问题
如果系统中有大量的优先级较高的进程不断到达,优先级较低的进程可能会长时间等待,产生饥饿现象
FREERTOS就是用了优先级调度算法
-
高响应比优先级调度算法:
高响应比优先调度算法(Highest Response Ratio Next,HRN)是一种动态调度算法,它通过考虑等待时间和服务时间的比率来确定下一个要执行的进程。HRN算法选择具有最高响应比的进程作为下一个要执行的进程。响应比定义为(等待时间 + 服务时间)/ 服务时间
a. 从就绪队列中选择具有最高响应比的进程作为下一个要执行的进程。即选择响应比最大的进程执行
b.被选择的进程开始执行,直到完成、阻塞或者时间片结束;
c. 在进程执行期间,等待时间会不断增加。当一个进程被选中执行时,其他进程的等待时间会随之增加
*优点:*能够考虑进程的等待时间和服务时间,使得短作业能够更快地得到响应;
能够考虑进程的等待时间和服务时间,使得短作业能够更快地得到响应
*缺点:*需要频繁地计算和更新响应比,增加了系统开销
可能会因为长作业的服务时间较长而导致短作业等待时间过长的问题
-
时间片轮转调度算法:
时间片轮转调度算法(Round Robin Scheduling)是一种基于时间片的调度算法,它将CPU的执行时间划分为多个时间片,每个进程被分配一个固定长度的时间片,在该时间片内执行。当时间片用完时,调度器将当前执行的进程置于就绪队列的末尾,选择下一个进程继续执行
a.系统将CPU的执行时间划分为固定长度的时间片,例如10ms或20ms。每个进程被分配一个时间片,在该时间片内执行
b. 当一个进程进入就绪态时,它被放入就绪队列的末尾等待执行。调度器选择就绪队列中的第一个进程执行,设置计时器开始计时,当计时器计时结束时,当前执行的进程被挂起,放回就绪队列的末尾,选择下一个进程执行
c.当一个进程被选中执行时,它开始执行,并在分配给它的时间片内运行,直到时间片结束或者进程主动放弃CPU
d.当一个进程的时间片用完时,调度器将其放回就绪队列的末尾,选择下一个进程执行。这个过程持续进行,直到所有进程都执行完毕
优点:
公平性高:所有进程都有机会获得CPU资源执行,避免了长作业占用CPU资源时间过长的问题
响应速度快:短作业可以在一个时间片内完成执行,提高了系统的响应速度
缺点:
时间片长度的选择会影响系统的性能,如果时间片过长,可能会导致响应时间较长;如果时间片过短,可能会增加上下文切换的开销
对于I/O密集型的任务,时间片轮转调度算法可能会导致频繁的上下文切换,影响系统的性能
-
多级反馈队列调度算法
一种结合了多级队列和反馈机制的调度算法,它允许进程在不同的队列之间进行转移,并根据进程的行为动态调整其优先级
a. 系统中维护多个就绪队列,每个队列具有不同的优先级。通常,优先级较高的队列具有较短的时间片,而优先级较低的队列具有较长的时间片
b.当一个进程进入就绪态时,它被放入初始的队列中等待执行。调度器选择优先级最高的队列中的第一个进程执行。如果一个进程在当前队列的时间片用完后还未完成,则它将被移动到下一个优先级较低的队列中等待执行
c.当一个进程在当前队列中等待执行时,如果它没有在时间片内完成执行,则它会被移动到下一个优先级较低的队列中,以获得更长的时间片
d.当一个进程被选中执行时,它开始执行,并在分配给它的时间片内运行,直到时间片结束、进程阻塞或者主动放弃CPU
e.如果一个进程在当前队列中的时间片用完后还未完成执行,则它会被移动到下一个优先级较低的队列中等待执行
优点:
根据进程的行为动态调整优先级和时间片长度,适应不同类型的任务
所有进程都有机会获得CPU资源执行,避免了长作业占用CPU资源时间过长的问题
缺点:
调度器需要频繁地移动进程和调整优先级,增加了系统开销
对于频繁进行进程切换的系统,可能会产生额外的上下文切换开销