5.1 基本概念
1)CPU调度:单处理器系统每次只允许一个进程运行,多道程序是为了是的CPU在任何时候都有某些进程运行,以使得CPU使用率最大化,采用的方式是当一个进程必须等待时,操作系统会从该进程拿走CPU使用权,将CPU使用权交给其他进程;
2)CPU-I/O区间周期:进程执行由CPU执行和I/O等待周期组成;
3)CPU调度程序:当CPU空闲时,通过CPU调度程序或短期调度程序从就绪队列选择一个进程来执行;
4)CPU调度决策发生环境:
a)当一个进程从运行状态切换到等待状态(非抢占);
b)当一个进程终止(非抢占);
c)当一个进程从运行状态切换到就绪状态,例如中断(抢占);
d)当一个进程从等待状态切换到就绪状态,例如I/O完成(抢占)。
5)分派程序:切换上下文;切换到用户模式;跳转到用户程序的合适位置,以重新启动程序;
6)分派延迟:分派程序停止一个进程而启动另一个所要花的时间;
5.2 调度准则
1)调度准则:
a)CPU使用率:需要使得CPU尽可能忙;
b)吞吐量:一个时间单元内所完成进程的数浪;
c)周转时间:从进程提交到进程完成的时间段;
d)等待时间:在就绪队列中等待的时间之和;
e)响应时间:从提交请求到产生第一响应的时间。
5.3 调度算法
1)先到先服务调度(FCFS):
a)方式:非抢占的;
2)最短作业有限调度(SJF):
a)方式:抢占的或者非抢占的,抢占可以成为最短剩余时间优先调度;
b)评价:最佳的(对于给定一组进程,该算法的平均等待时间最小);
c)问题:如果是抢占的可能造成饥饿,可以通过老化解决;对于无法知道下一个CPU区间长度,可采用如下方法预测下一个CPU区间长度(图为操作系统书第140页):
3)优先级调度(优先级可以通过内部或外部方式定义):
a)方式:抢占的或者非抢占的;
b)问题:无穷阻塞或饥饿;可以通过老化解决,就是逐渐增加在系统中等待很长时间的进程的优先级;
4)轮转法调度(RR)(专门为分时系统设计的):
a)方式:让就绪队列的第一个进程使用CPU的q个时间单元,q为时间片,在q时间单元之后,如果该进程还没有释放CPU,那么它被抢占并放到就绪队列的队尾,为抢占的;
b)注意:时间片需要适当选择,不能太大也不能太小,如果太大就成了FCFS调度,如果太小会因上下文切换而引起的调度开销过大,经验表明,80%的CPU区间 应该小于时间片;
5)多级队列调度:
a)概念:将就绪队列分成多个独立队列,一个进程被永久地分配到一个队列,每个队列都有自己的调度算法;队列之间也需要进行调度,可以采用固定优先级抢占调度或者划分时间片调度(轮转法调度);
6)多级反馈队列调度(最通用也是最复杂的CPU调度算法):
a)概念:类似于多级队列调度,但允许进程在队列之间移动,如果进程使用过多CPU时间则被转到更低优先级队列,如果进程等待过程时间则被转移到更高优先级队列,老化阻止饥饿;
5.4 多处理器调度
1)多处理器调度方法:
a)非对称多处理:让一个处理器(主服务器)处理所有的调度决定、I/O处理以及其他系统活动,其他的处理器只执行用户代码;
b)对称多处理(SMP):每个处理器自我调度;
2)处理器亲和性:避免将进程从一个处理器移至另一个处理器,而是努力使一个进程在同一个处理器上运行,减少不必要的开销;
3)负载平衡:保持所有处理器的工作负载平衡,可能需要从忙的处理器移动进程到空闲处理器,会抵消处理器亲和性,需要权衡处理选择
4)对称多线程(SMT或超线程技术):在物理处理器上提供多个逻辑处理器(硬件提供的);
5.5 线程调度
1)进程竞争范围PCS方法(cpu的竞争发生在属于相同进程的线程之间):在执行多对一和多对多模型的系统上,线程库调度用户级线程到一个有效的LWP上运行;
2)系统竞争范围SCS方法(cpu的竞争发生在系统的所有线程之间):决定哪个内核线程到CPU;
5.7 算法评价
1)确定模型:
a)方式:采用预先;的负荷,计算在给定负荷下每个算法的性能;
b)优点:简单、快速;
c)缺点:要求输入精确数字,而且答案只适用于这些情况,片面性;
2)排队模型:
a)方式:CPU是具有就绪队列的服务器,I/O系统是具有设备队列的服务器,因此可以通过测量到达率和服务率,计算使用率、平均队列长度、平均等待时间等——排队网络分析,见下图(图为操作系统书第160页);
3)模拟:
a)方式:对计算机系统进行建模,通过模拟数据驱动模拟,可以根据概率分布生成进程、CPU取件时间、到达时间、离开时间等,可以通过数学地(统一的、指数的、泊松的)或经验定义分布,也可以通过采用跟踪磁带完成上述两项工作;
b)优点:精确;
c)缺点:昂贵(费时、跟踪磁带费空间);
4)实现:
a)优点:高精度;
b)缺点:代价高昂;算法所使用的环境会改变;
c)关于实现中调度算法的建议:可设计为可以为系统管理员和用户所改变的调度算法;或者提供API以供修改进程或线程的优先级。