操作系统进程调度
1. 进程调度的定义
在多进程并发的环境里,虽然从概念上看,有多个进程在同时进行,但是实际上,在单个CPU下在任何时刻只能有一个进程处于执行状态,其他进程则处于非执行状态。那么问题来了,我们如何确定在任意时刻到底由哪个进程执行呢?进程调度的任务就是选择下一个执行的进程。
程序使用CPU 的模式分为三种: 第一种是程序大部分时间在使用CPU,称为CPU导向或计算密集型程序;第二种是程序大部分时间在进行输入输出,称为I/O导向或者输入输出密集型程序;第三种是介于前两种模式之间,这种程序称为平衡型程序。对于I/O导向的程序来说,响应时间较重要;对于CPU导向的程序来说,周转时间较重要。
2. 进程调度的目标
CPU调度就是要达到极小化平均响应时间、极大化系统吞吐率、保持系统各个功能部件均处于繁忙状态和提供某种貌似公平的机制。
3. 进程调度算法
3.1 先来先服务调度算法
先来先到的一个隐含条件是不能抢占,一个程序一旦启动就一直运行到结束或者受阻塞为止。
3.2 时间片轮转算法
时间片轮转算法是对先来先服务算法的改进,其主要目的是改善程序的响应时间。其方法是周期性进行进程切换。
3.3 短任务优先算法
改善短任务排在长任务后面轮转而造成响应时间和交互体验下降的办法是短任务优先算法。这种算法的核心是短任务的优先级比长任务的高。
3.4 优先级调度算法
优先级调度的优点是可以赋予重要的进程以高优先级以确保重要任务能够得到CPU时间。低优先级的进程可能会饥饿,可以动态调节优先级。例如,在一个进程执行特定CPU时间后将其优先级降低一个级别,或者将处于等待进程的优先级提高一个级别。缺点是响应时间不能保证。
3.5 混合调度算法
之前介绍的所有算法都存在缺点,我们自然想设计一个算法合并它们的优点,摒弃它们的缺点。这就是所谓的混合调度算法。该算法的原理是将所有进程分成不同的大类,每个大类为一个优先级。如果两个进程处于不同的大类,则处于高优先级大类的进程优先执行;如果两个进程处于同一个大类,则采用时间片轮转来执行。
3.6 其他调度算法
除了上面介绍的各种算法外,有的操作系统还实现了一些其他算法,他们包括:保证调度、彩票调度、用户公平调度。保证调度算法保障每个进程使用1/n的CPU时间,保证调度不一定要轮转,每次给的时间片不一定要一样。彩票调度算法,在该算法里,给每个进程分发一定数量的彩票,而调度器则从所有彩票里随机抽取一张彩票,持有该彩票的进程就获得CPU。用户公平调度算法按照每个用户而不是每个进程来进行公平分配。
4. 实时调度算法
4.1 最早截止任务优先算法(EDF)
EDF调度算法就是最早截止的任务先做。如果新的工作来了,比正在运行的程序截止时间更靠前,那么就抢占当前进程。
4.2 最短周期优先算法(RMS)
与EDF算法相对的是所谓的RMS调度算法。该算法在进行调度前先计算出所有任务的优先级,然后按照计算出来的优先级进行调度,任务执行中间既不接收新的进程,也不进行优先级的调整或进行CPU抢占。
5. 优先级倒挂
优先级倒挂指的是一个低优先级任务持有一个被高优先级认为所需要的共享资源。这样高优先级任务因为资源缺乏而处于受阻状态,一直到低优先级任务释放资源为止。
三种方法防止优先级倒挂:
第一:使用中断禁止。这种办法的核心是通过禁止中断来保护临界区。在采用此种策略的系统中只有两个优先级:可抢占优先级和中断禁止优先级。
第二:优先级上限。思路是让共享的临界区有自己的优先级,并让访问临界区的进程获得临界区的优先级。这样,只要临界区的优先级设置得足够高,就可以避免优先级倒挂。
第三:优先级继承。如果要完全杜绝优先级倒挂,则需要在任何时候都确保等待资源的进程所具有的优先级必须低于持有资源的进程的优先级。在优先级继承的方式下,当一个高优先级进程等待一个低优先级进程所持有的资源的时候,这个低优先级进程将暂时获得高优先级进程的优先级级别。