调度(scheduling):决定处理器要执行哪些进程。
一、调度类型
1、长程(作业)调度
决定进程是否加入待执行的进程池中。
- 决定哪些新建进程可以进入系统准备执行;
- 控制多道程序系统的并发程度;
- 进程越多则各进程对CPU的使用百分比越小;
在创建新进程时,执行长程调度,决定是否把进程添加到当前活跃的进程集合中。因此它控制着系统并发度,一旦允许进入,一个作业或用户程序就成为一个进程并被添加到供短程调度程序使用的队列中等到调度。
2、中程(交换)调度
决定加入部分或全部在内存中的进程集合中。是交换功能的一部分。
- 决定交换哪些主存-辅存进程;
- 基于多道程序设计的管理需要;
决定进程的换入和换出:要执行但不在内存中的进程换入进程,而在内存中但被阻塞的进程换出。
3、短程(进程)调度
决定哪一个可运行的进程将被处理器执行。
- 决定下一个使用CPU的进程
当可能导致当前进程阻塞或可能抢占当前运行进程的事件发生时,调用短程调度程序
这是执行得最频繁的调度,精确地决定下一次执行哪个进程。
二、调度与进程状态转换
进程在不同状态之间的切换需要进行不同类型的调度,切换的操作本质是一样的,只是描述的方式不一样。
进程的创建和终止:长程调度;
进程的挂起和唤醒:中程调度;
进程在就绪、阻塞与运行状态之间切换:短程调度;
三、短程调度
短程调度可以是进程正常(或异常)终止时发生(通过中断实现),也可以由时钟或I/O中断、系统调用和信号量操作实现。
1、调度模式
非剥夺式(nonpreemptive):
- 让进程运行直到结束或阻塞的调度方式;
- 容易实现,但只适合专用系统,不适合通用系统;
剥夺式:
- 允许将逻辑上可继续运行的进程在运行过程中暂停的调度方式;
- 可防止单一进程长时间独占CPU,但系统开销较大;
2、调度过程
进程切换:当前进程让出CPU,新进程占用CPU;
基本过程:
- 保存现场;
- 根据某种调度算法选择下一个要运行的进程,如果没有就绪进程,系统会安排一个空闲进程(idle),没有其他进程时该进程一直运行,在执行过程中可接收中断。
- 恢复现场
3、调度目标
包括面向用户的目标和面向系统的目标。
- 公平:确保每个进程都获得合理的CPU份额;
- 效率:使CPU及其他系统资源尽量忙碌;
- 响应时间:从发出请求,到请求得到响应的时间,要尽可能的短;
- 周转时间:也称为驻留时间,进程从提交(发出执行请求)到结束(进程结束),要尽可能短;
- 吞吐量:单位时间内完成的进程数,要尽可能的大;
- 实时性:可以指定进程完成的最后期限;
四、进程调度算法
1、先来先服务(FCFS)
当前进程结束后选中最早到达就绪队列的那个进程执行(非剥夺式)。
这种算法相对于I/O密集型来说更适用于处理器密集型进程。因为I/O密集型进程在获得CPU执行权后很快就又执行I/O操作,进入阻塞态,这时CPU权限继续转让给其他进程,所以I/O密集型进程会处理得很慢。
2、最短进程优先(Shortest Process Next, SPN)
每次调度选取估计运行时间最短的进程(非剥夺式)。
理论上来说SPN算法的吞吐量最大,但它对长进程最不利,可能造成饥饿。
3、最短剩余优先(Shortest Remaining Time, SRT)
新进程进入就绪队列时将引发重新调度,然后选取估计剩余时间最短的那个进程执行。(剥夺式)
4、最高响应比优先(Highest Response Ratio Next, HRRN)
每次调度选取响应比最大的进行执行(非剥夺式),响应比=(w+s)/s。
其中w为等待CPU的时间,s为估计的执行时间。
5、时间片轮转(Time Slicing Round Robin, RR)
把CPU划分成若干个时间片,并且按顺序分配给就绪队列中的各个进程。当时间片用完而当前进程尚未结束时系统剥夺该进程的CPU,将该进程排列到就绪队列的末尾,同时选中就绪队列头部的进程执行。(剥夺式)
利于CPU密集型进程,不利于I/O密集型进程。
为了不让CPU密集型进程不公平地使用了大部分处理器时间从而导致I/O密集型的进程性能降低,提出了改进的轮转法——虚拟轮转法(VRR):当一个进程因为I/O而被阻塞时,它加入一个I/O队列,解除了I/O阻塞的进程都被转移到一个采用FCFS的辅助队列中,进行进程调度时辅助队列中的进程优先于就绪队列中的进程被调用。
6、多级队列反馈(Multilevel Feedback, FB)
- 设立多个优先级就绪队列,各个队列运行时间片可能不同(优先级越高时间片越小);
- 优先级从高到低:0,1,2,...,n,...;对应的可执行时间片为1,2,3,...,2^n,...(时间片可以自己设置,不是固定为2^n的)
- 新的就绪进程进入最高优先级队列;
- 进程由于时间片用完被抢占而放弃CPU,下降一个优先级队列(排到队列的末尾)。若不是被抢占则不用降级。
- 进程由于等待而放弃CPU后进入等待队列,一旦等待的事件发生,则回到原来的就绪队列。
- 各优先级队列采用FCFS的方式。
- 有最低优先级队列,达到最低优先级后即使被抢占也不会降级,只会继续排到队尾。
总体而言,多级队列反馈还是属于剥夺式的调度。
7、算法性能比较
归一化周转时间=周转时间/服务时间。该值表示了一个进程的相对延迟。
其中周转时间是进程的驻留时间(等待时间+服务时间),服务时间是进程理论上的服务时间(即无任何干扰、等待地完成该进程的时间)。
8、例子(来源于《操作系统:精髓与设计原理》一书)
需要考虑的进程:
各调度算法的执行结果:
对于FCFS方式,严格按照队列的模式先执行队首进程,等到队首进程完全结束后将其出队,继续执行队首进程,如此反复。
对于RR(q=1或者q=4)方式,即是时间片轮转,每个进程每次执行一个(或四个)时间片的方式。这种方式下可以把整个待执行进程集合看成一个队列,每次取队首进程执行,执行一个时间片后若进程执行完成则将进程出队,否则将进程放到队尾。若有新进程入队,则先将新进程入队(置于队尾),再将执行完上一个时间片的进程放置队尾。
此时队列情况为:(队首)[待执行进程,..., 新进程,刚执行完的进程](队尾)
RR(q=1)方式可以列出下表来模拟调度过程
RR(q=4)方式可以列出下表来模拟调度过程
SPN方式和SRT方式要区别开,前者是非剥夺式的后者是剥夺式的。SRT在新进程入队时重新调度,各进程仍然处于队列中,所有待执行进程的剩余执行时间一样则取队首进程执行。