CPU调度
即按一定的调度算法从就绪队列中选择一个进程,把CPU的使用权交给被选中的进程,如果没有就绪进程,系统会安排一个系统空闲进程或idle进程。
CPU调度时机
发生在内核对中断/异常/系统调用处理后返回到用户态时,具体来说有以下情况:
- 进程正常终止 或 由于某种错误而终止;
- 新进程创建 或 一个等待进程变成就绪;
- 当一个进程从运行态进入阻塞态;
- 当一个进程从运行态变为就绪态。
进程切换
是指一个进程让出处理器,由另一个进程占用处理器的过程,包括以下两部分工作:
- 切换全局页目录以加载一个新的地址空间;
- 切换内核栈和硬件上下文,其中硬件上下文包括了内核执行新进程需要的全部信息,如CPU相关寄存器。
CPU调度算法衡量指标
吞吐量 (Throughput): 每单位时间完成的进程数目;
周转时间TT (Turnaround Time):每个进程从提出请求到运行完成的时间;
响应时间RT(Response Time):从提出请求到第一次回应的时间;
CPU利用率(CPU Utilization):CPU做有效工作的时间比例;
等待时间(Waiting time):每个进程在就绪队列(ready queue)中等待的时间;
……
批处理系统中采用的调度算法
衡量指标:吞吐量,周转时间,CPU利用率,公平平衡
先来先服务算法(FCFS——First Come First Serve):按照进程就绪的先后顺序使用CPU。特点:非抢占,公平,实现简单,长进程后面的短进程需要等很长时间,不利于用户体验。
最短作业优先(SJF——Shortest Job First):具有最短完成时间的进程优先执行,非抢占。
最短剩余时间优先(SRTN——Shortest Remaining Time Next):SJF抢占式版本,即当一个新就绪的进程比当前运行进程具有更短完成时间时,系统抢占当前进程,选择新就绪的进程执行。
特点:有最短的平均周转时间,但不公平,源源不断的短任务到来,可能使长的任务长时间得不到运行,从而产生 “饥饿”现象 (starvation)。
最高响应比优先算法(HRRN——Highest Response Ratio Next):是一个综合算法,调度时,首先计算每个进程的响应比R,之后总是选择R最高的进程执行。
{响应比R = 周转时间 / 处理时间 =(处理时间 + 等待时间)/ 处理时间 = 1 +(等待时间 / 处理时间)}
特点:折中权衡
交互式系统采用的调度算法
衡量指标:响应时间,公平平衡。
时间片轮转调度算法(Round Robin——RR): 每个进程被分配一个时间片,允许该进程在该时间段运行,如果在时间片结束时该进程还在运行,则剥夺CPU并分配给另一个进程,如果该进程在时间片结RR束前阻塞或结束,则CPU立即进行切换。
特点:公平;有利于交互式计算,响应时间快;由于进程切换,时间片轮转算法要花费较高的开销;对进程表中不同进程的大小差异较大的有利,而对进程都是相同大小的不利。
虚拟轮转法(Virtual RR):主要基于时间片轮转法进行改进,解决在CPU调度中对于I/O密集型进程的不友好。其设置了一个辅助队列,对于I/O型进程执行完一个时间片之后,则进入辅助队列,CPU调度时总是先检查辅助队列是否为空,如果不为空总是优先调度辅助队列里的进程,直到为空,才调度就绪队列的进程。
优先级调度算法(Priority Scheduling Algorithm——PSA)即给每个作业一个优先级,优先级越高越紧迫,应该先执行。通常:系统进程优先级高于用户进程;前台进程优先级高于后台进程;操作系统更偏好 I/O型进程。
特点:实现简单,但不公平,可能导致优先级低的进程产生饥饿现象;
可能产生优先级反转问题(基于优先级的抢占式算法),即一个低优先级进程持有一个高优先级进程所需要的资源,使得高优先级进程等待低优先级进程运行。
多级反馈队列调度算法(Multilevel Feedback):设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,依次递减优先级。对于各个队列进程执行时间片的大小也不同,优先级越高的队列,分配到的时间片越少。当第一级队列为空时,再第二级队列进行调度,依次类推,各级队列按照时间片轮转方式进行调度。当一个新进程创建后,首先把它放入第一队列的末尾。按照FCFS原则排队等待调度。当轮到该进程执行时,如它在该时间片完成,便可准备撤离系统,如果它在一个时间片结束时尚未完成,则调度程序便将该进程转入第二队列的末尾,再同样地按照FCFS原则等待调度执行。依次类推。
特点:更偏好I/O型进程,对CPU型进程不太友好。
各种调度算法总结比较: