目录
1.处理器调度的概念和类
调度是操作系统的基本功能,几乎所有的系统资源在使用前都要经过调度。
处理器是计算机系统中最重要的资源,其调度策略不仅对处理器的使用效率和用户进程的执行有影响,同时还与内存等其他资源的使用密切相关,并且常表示操作系统的某种特征,其算法的优劣对整个计算机系统的性能指标有重要影响。
从处理器调度的对象、时间、功能以及涉及层次的不同分为三类。
1.1作业调度(高级调度、宏观调度、长期调度)
主要工作和任务
根据某种策略或算法,从后备作业中选择若干作业,分配必要的资源(内存空间、外部设备等),建立相应的作业控制进程及为其服务的一组进程(如完成输入/输出接口),加载相应的程序和数据并等待进程调度为其指派处理器。(相当于为作业发放进入内存的入门卷,获得预选资格,成为以进程的身份参与对CPU的最后竞争。)
任务:作业完成后的善后工作。
时间尺度:通常是分钟、小时或天。
1.2中级调度(进程对换、中期调度、交换调度、内存调度)
设置原因:对CPU的竞争过程中出现的、对内存资源的新的要求。
1. 尽管已挑选了一批合适作业,由于内存资源的缺乏而挂起;
2. 内存中某些进程由于其他原因造成阻塞而无法继续运行;
3. 内存中进程数目过多,特别是一些低优先级进程可能等待较长时间。
主要工作:
动态地将一些进程部分或全部从内存交换到外存,或反之,由此来决定哪些进程被允许参与竞争处理器;短期调整系统负荷,改善系统性能,常用于具有虚拟存储技术的系统或分时系统中。换
句话说,就是当内存不足时,某些进程可以被调换到磁盘上。中级调度负责决定哪个进程应该保留在内存中、哪个进程暂时存放在磁盘上,因此有时中级调度程序也被称为内存调度程序。由于从磁盘调入调出进程的代价比较高,所以这样的行为应该适度或更少。如果内存的内容经常反复挪动,会浪费大量的磁盘带宽、减慢文件的IO速度。
作用:
1. 为了优化系统的性能,内存调度程序应仔细考虑需要在内存中保留多少个进程,以及保留的进程类型。通常的做法是在内存中混合保存计算密集型和IO密集型的进程,比如,若某类进程计算大约占20%的时间,那么保留5个此类进程就是使CPU忙碌的正确数量。
2. 另外,内存调度程序应周期性地考察磁盘上的每个进程,以决定是否需要调一个进程到内存,参考的依据一般为:进程被调出的时间长度、进程已经消耗的CPU时间、进程的大小、进程的重要性。
1.3进程调度(微观调度、低级调度、短期调度)
主要工作:
按某种策略或算法选取某个(或某几个)就绪进程占用处理器,并实现进程间处理器的转接。
作为操作系统内核的主要部分,必须常驻内存以满足其高频率的执行要求;其所选用的策略或算法以及处理器在进程间的转接速度对整个系统的性能有很大影响。
时间尺度:毫秒级。
1.4三级调度之间的关系
- 作业调度负责完成作业到进程的身份的转换,并将作业调入内存;
- 中级调度主要是用于各进程在竞争处理器的过程中内存资源紧张或不足时的情况
- 进程调度实现处理器资源的真正指派。
- 系统中可只设立二级调度,但至少要有一级进程调度。
调度方案(要求)
为保证有较好的响应时间,系统规定进入后备状态的作业数不超过60个;
为保证进入内存的多道作业有较充分的页面(内存资源),减少缺页次数,系统限制进入内存的作业道数为8个,并且在内存中运行2秒钟之后必须交换到外存上,变为在外存上就绪,以便让其它作业进入内存运行。说明:
1. 实现小范围内实行多道,即对8道用户程序在进程调度控制下,几个毫秒调度一次;实现大范围内实行分时,即每隔2秒种进行一次对换。
2. 小范围调度属进程调度,多道用户程序的进程竞争的是处理器资源;大范围调度属中级调度,作业竞争的资源是内存,在MULTICS系统中统称为作业调度。
2作业调度性能评价
2.1调度的实质与设计目标
调度的实质:达到主观上的设计目标。
操作系统的设计目标
1. 每次运行尽可能多的作业;
2. 使处理机保持“忙”;
3. 使I/O设备得以充分利用;
4. 对所有的作业都是公平合理的。
公平很重要。换句话说,相似的进程应该得到相似的服务,类似进程给予明显不同的CPU时间就是不公平的,不同类型的进程则采用不同的方式处理。比如计算机中的安全控制进程和工资发放进程之间就应区别对待,并且这种区别策略应得到强制执行,即便会延迟发放工资进程的执行。
2.2设计调度算法的因素
1. 选择算法应与系统的整个设计目标一致。
- 批处理系统应侧重提高处理器的使用效率,尽量增加系统的吞吐量
- 分时系统应保证用户能忍受的响应速度,即尽量少的响应时间(用户发出命令到得到响应的时间间隔)。比如有后台进程运行(从网络上读取和存储电子邮件)的个人计算机上,用户请求启动一个程序或打开一个文件应优先于后台的工作,能够让所有的交互式请求首先运行的服务就是好服务。
- 实时系统要保证及时响应和处理与时间有关的事件,而忽略系统效率。比如一个以正常速率产生数据的设备,若数据收集进程出现失败,就会导致数据丢失,因此实时系统最主要的要求就是满足所有或大多数的截止时间要求。在多数实时系统中,可预测性是很重要的,调度程序必须具备高度可预测性和规律性。
2. 注意系统资源的均衡使用,将I/O繁忙的作业与CPU繁忙的作业搭配运行。
比如,在内存中既有一些计算密集型进程又有一些IO密集型进程就是一个较好的办法,好于先调入和运行所有的CPU密集型作业、之后再调入和运行所有的IO密集型作业的办法。后一种办法中,在CPU密集型进程运行时,它们要竞争CPU而磁盘在空转;稍后当IO密集型作业到来后,它们要竞争磁盘而CPU空转。
3. 应保证提交的作业在规定的截止时间内完成,防止某些作业长期得不到调度。
4. 尽量公平合理。
5. 算法不应过于复杂、开销不能太大。
2.3有关指标说明
与用户相关的指标:
- 周转时间:是指作业从提交到完成(得到结果)所经历的时间,包括进程在收容队列中的等待时间、占用处理器的时间、在就绪队列和阻塞队列中的等待时间等。
- 响应时间:是指用户输入一个请求(如击键)到系统给出首次响应(如屏幕显示)的时间。它是分时系统中衡量系统交互性能的指标,实时系统中则是采用截止时间(开始截止和完成截止时间)衡量系统的实时性。
- 公平性:是指调度算法不会因作业或进程本身的特性而使上两个指标过分恶化,故应设计优先级以使关键任务得到更好的性能指标。
与系统相关的指标:
1. 吞吐量 是指单位时间内完成的作业数,与作业本身特性及调度算法都相关。
2. 作业平均周转时间
T = (∑ Ti) / n 其中,n为被测定作业流中的作业数,
Ti=Tci﹣Tsi(即作业执行时间 + 等待调度时间), Tci = 作业i的完成时刻,Tsi=作业i的提交时刻。
T愈短,意味着这些作业的总体在系统中停留的时间愈短,系统的吞吐量就大,从而使更多的用户感到满意。作业平均周转时间常用来衡量不同调度算法对同一作业流的调度性能。
3. 作业平均带权周转时间
W = (∑ Wi) / n 其中,Wi= Ti/tRi 每个作业的带权周转时间
Wi=(实际执行时间+等待调度时间) / 实际执行时间 = 1+ (等待调度时间/ 实际执行时间)。
Ti=作业i周转时间
tRi=作业i实际执行时间,
W反映了作业对单位执行时间所付出的平均等待时间,即作业本身的性质,常用于衡量某种调度算法对不同作业流的调度性能。
4. 系统利用率 指处理器的利用率及各种设备的均衡利用率
。
3.作业调度
3.1 单道批处理系统的调度算法
一个作业的cpu及io全部完成之后才进行下一个作业,io是cpu会空闲 ~与多批道处理系统的区别
主要解决作业之间的自动接续问题,减少人工干预,提高系统资源利用率,故算法相对简单。
先来先服务算法FCFS
按作业到达的先后次序进行调度,优先考虑在系统中等待时间最长的作业,而不论其要求的执行时间的长短。
示例 四道作业情况如下:
作业号 提交时间(小时) 运行时间(小时)
1 8.00 2.00
2 8.50 0.50
3 9.00 0.10
4 9.50 0.20
分析:执行顺序:1 2 3 4
假如在时间点00.00提交 1作业提交用了8小时,即8点才提交成功,我们可将提交时间看作时间点
1作业从8运行至10 周转时间=等待+运行=0+2=2
2作业从10运行至10.5 周转时间=等待+运行=1.5+0.5=2
3作业从10.5运行至10.6 周转时间=等待+运行=1.5+0.1=1.6
4作业从10.6运行至10.8 周转时间=等待+运行=1.1+0.2=1.3
所以 T=(2+2+1.6+1.3)/ 4 = 1.725
带权周转时间就是周转时间/运行时间 如2/2=1 2/0.5=4 1.6/0.1=16 1.3/0.2=6.5
所以 W=(1+4+16+6.5)/ 4 =6.875
短作业优先算法SJF
短作业优先调度要求运行时间最短的作业,作业长短是以作业要求运行的时间长短来衡量
示例同上 按SJF调度 顺序为1 3 4 2 1来之前没有进程只能运行1,然后其他三个等待,再选最短T T=(2+1.1+0.8+2.3)/ 4 =1.55
W =(1+11+4+4.6)/ 4 =5.15
短作业优先的算法优于FCFS算法。缺点是假若系统中不断有短作业进入,会造、成长作业无限制延迟而得不到调度,(类似数据库中的活锁) 原因在于SJF算法只考虑要求运行时间而忽略等待时间。
响应比高者优先算法HRN
既优先短作业,又考虑作业在系统内的等待时间过长者的利益。
响应比定义 RP = (作业响应时间tR) / 要求执行时间
其中tR =到此次调度时已等待的时间tW + 要求执行时间,
故 RP = 1 + 作业已等待时间 / 要求执行时间。(跟带权周转时间计算方式貌似一样欸')
示例同上 按HRN调度
Rp分别为:2.3.4:(1.5+0.5)/0.5=4 (1+0.1)/0.1=11 (0.5+0.2)/0.2=3.5
所以当前执行顺序应为:1.3.2.4
当执行完3后我认为应该需要再计算一次HRN优先级,判断2.4的顺序,这里优先级正好没有改变
T =(2+1.1+2.1+1.3)/ 4 =1.625
W =(1+11+4.2+6.5)/ 4 =5.675
四点说明:
- 一个作业的响应比随等待时间的增加而增高,一个长期未被调度的作业只要等待足够长的时间,总有可能成为响应比高者而获得执行的机会。
- 同样长短的作业(要求执行时间相等),其RP值因等待时间的长短可以区分,从而照顾了先来后到。
- 同样等待时间的作业,要求执行时间少的作业RP值高,从而照顾了短作业。
- 缺点:算法较为复杂,每当调度时都要进行每道作业响应比RP的计算,开销大。
3.2 多道批处理系统的调度算法
多道并行的基础是作业的I/O操作可由通道代替而解放了CPU,空闲的CPU可分配给另一道作业,故多道技术中就要考虑CPU对I/O的等待时间。
由于不同作业中各作业执行时间中包含的I/O操作时间比例不同,难以确定安排作业的道数使得CPU对I/O的等待时间接近于零,难以准确确定一个作业的完成时间,即定量地计算T和W变得困难。
一般情况下,多道并行会使T和W减少,从而使系统吞吐量增大,提高系统性能。(但有时会有反复)(定性评价)。
多道程序运行情况的概率计算
设某程序或进程,对于IO等待时间占其在内存中的时间的比例为p,则n个同类进程同时等待的概率为(单位时间内),即CPU空转的概率,则CPU利用率为u=1-(utilization)。
1)设系统内存为16M,每个进程4M,则n=4,p=0.8,u=1-=60%。
为增加程序道数
+16M =32M n=8 u=1- =83%,则吞吐量增加(83-60)/60 = 38%;
+16M =48M n=12 u=1- =93%,则吞吐量增加(93-83)/83 = 12%;
则第2个16M不划算。
2)设p=0.8,各作业到达时间和要求CPU时间如下,多道时采用轮转,平均分配CPU时间。
作业 到达时间 CPU时间
1 0 4
2 10 3
3 15 2
4 20 2
请计算T和W。(计算过程保留小数点后一位)
分析:由题知,
时间段0-10:作业1运行,u=0.2,运行CPU时间为t11=10*0.2=2;
时间段10-15:作业1/2运行,u=0.36,分别运行CPU时间为t12=t21=(5*0.36)/2=0.9;
时间段15-20:作业1/2/3运行,u=0.488,分别运行CPU时间为t13=t22=t31=5*0.488/3=0.8;
此时各作业剩余CPU时间为:
作业1 4-(2+0.9+0.8)=0.3
作业2 3-(0.9+0.8)=1.3
作业3 2-0.8=1.2
按运行原则,作业1首先完成,则
时间段20-T1:作业1/2/3/4运行,u=0.6,分别运行CPU时间为t14=t23=t32=t41=(T1-20)*0.6/4=0.3,则T1=22;
此时各作业剩余CPU时间为:
作业2 3-(0.9+0.8+0.3)=1,
作业3 2-(0.8+0.3)=0.9;
作业4 2-0.3=1.7;
按运行原则,作业3首先完成,则
时间段T1(22)-T3:作业2/3/4运行,u=0.488,分别运行CPU时间为t24=t33=t42=(T3-22)*0.488/3=0.9,则T3=22+5.6=27.6;
此时各作业剩余CPU时间为:
作业2 3-(0.9+0.8+0.3+0.9)=0.1,
作业4 2-(0.3+0.9)=0.8;
按运行原则,作业2首先完成,则
时间段T3(27.6)-T2:作业2/4运行,u=0.36,分别运行CPU时间为t25=t43=(T2-27.6)*0.36/2=0.1,则T2=27.6+0.6=28.2;
此时仅剩作业4,剩余CPU时间为:
作业4 2-(0.3+0.9+0.1)=0.7;
按运行原则,作业4完成,则
时间段T2(27.6)-T4:作业4运行,u=0.2,分别运行CPU时间为t44=(T4-28.2)*0.2=0.7,则T4=28.2+3.5=31.7;
由上,各作业周转时间为:
作业1 T1-0=22
作业2 T2-5=28.2-5=23.2
作业3 T3-10=27.6-10=17.6
作业4 T4-15=31.7-15=16.7
平均周转时间T,平均带权周转时间W,计算略。
基于先来先服务算法
按作业进入的先后顺序建立一个后备队列,调度时从队首开始扫描找到一个资源能够得到满足的作业为止,作为所选中的作业。
基于优先级调度算法
每道作业都设一定的优先级(用户自定、系统设定或计算确定),调度者按优先级高者优先,相同优先级按先来后到。
示例 IBM 360/370系统中按作业的类别划分优先级。如图:
A类:I/O繁忙的作业
B类:I/O和CPU均衡的作业
C类:CPU繁忙的作业
X类:其它一般的作业
调度原则:
1. 用户说明其作业类别及该类中的优先数。
2. 作业注册程序对作业先按类排列,在同一类中按优先数排序。
3. 系统将主存的用户区分四个分区,每一分区规定其所接纳的作业类型
4. 当某分区作业完成后并释放该分区时,由作业调度从该分区服务的那类作业中挑选优先级高的作业投入运行。
分时和优先级相结合调度算法
主要用于分时系统及某些引入分时机制的多道批处理系统中。
示例 MULITICS系统采用分时和优先级相结合的调度算法
1. 后备作业按优先级分为多个队列。
2. 每个作业被指定一个优先级范围(L1,L2)且开始时处于L1级,该范围表明作业应获得哪种类型的服务,任何时刻该作业的优先级Li都满足
L1< Li < L2(1≤L1 < Li< L2≤n)
3. 会话型作业(分时作业)优先级从1到P1,非会话型(批处理)作业优先级从P2到n,P2可小于P1(P值越小,优先级越高)。
如图
4. 每一后备作业队列分配一相应时间片qi,且qi+1 = 2qi。
5. 调度优先当前最高优先级队列的作业,若其分配的时间片用完,则将其返回低一级的后备队列中以等待下次调度。
综合考虑资源要求调度算法
综合考虑一个作业对资源的要求。
示例 有的系统把作业对CPU时间的要求、存储空间的要求M和输出行数L从调度角度上建立某种等效关系,统统折算为对CPU的时间,作为其优先级计算的根据。
4进程调度
4.1进程调度的功能
1. 记录系统中所有进程的执行情况。包括将各进程的执行情况、状态特征记录在各进程的PCB表中,根据各进程的状态特征和资源特征将各进程的PCB表排出相应的队列并负责动态队列转换,根据PCB变化掌握系统中各进程的执行情况及状态特征,并在适当时机从就绪队列中选出一个进程占据处理机。
2. 选择占有处理器的进程。按一定策略选择一个处于就绪状态的进程,使其获得处理器执行,不同系统的设计目的有不同的选择策略。
3. 进行进程上下文切换。包括是否允许做进程上下文切换,保留有关被切换进程的足够信息,选择一个新的处于就绪状态的进程并装配该进程的上下文,将CPU的控制权转换到被选中进程。进程切换的代价包括:
- a:用户态切换到核心态,保护当前进程的状态,包括在进程表中存储寄存器值便于以后装载,许多系统中,内存映像(比如页表内的内存访问位)必须保存;
- b:调度一个新进程,新进程的内存映像重新装入内存管理单元并开始运行,进程切换也使得整个内存高速缓存失效、强迫高速缓存从主存重新装入2次(进入内核1次、离开内核1次)。因此,如果切换进程次数太多,会耗费大量CPU时间。
进程行为特性
几乎所有进程都交替突发(磁盘)IO请求或计算,比如CPU不停地运行一段时间,然后发出一个系统调用读写文件,完成系统调用之后CPU又开始计算,直至需要读或写更多的数据为止。注意,仅当一个进程等待外部设备完成工作而被阻塞时才算IO。
某些进程花费绝大多数时间在计算上、某些进程则在等待IO上花费绝大多数时间,前者称为计算密集型、后者称为IO密集型,典型的计算密集型进程具有较长时间的CPU集中使用和较少频度的IO等待,IO密集型进程是指在IO请求之间较少地进行计算而非特别长时间的IO请求。有必要指出,随着CPU变得越来越快,更多的进程倾向为IO密集型,因为CPU的改进比磁盘的改进快得多。因此,未来对IO密集型进程的调度处理则更为重要。
4.2进程调度的时机
与引起进程调度的原因与进程调度的方式有关。
引起进程调度的原因
- 正在执行的进程执行完毕;
- 执行中的进程由于请求某个事件的发生(I/O请求、等待信号、信件的到来)而受到阻塞时,自动放弃处理器(即让权等待)而进入阻塞队列中等待;
- 分时系统中时间片用完;
- 在允许强占式(剥夺式)调度中,就绪队列中某进程的优先级高于当前执行进程的优先级。
进程调度的方式
1. 可强占式(剥夺式)调度 出于紧急处理需要,把正在执行进程占据的处理器强行剥夺并转给一个优先级比之更高的就绪进程。
2. 不可强占式(非剥夺式)调度:即使出现优先级高于当前执行进程的就绪进程,也不能强行剥夺执行进程的处理器控制权,只有当某种原因造成处理器空闲时,才将处理器转给该进程。
4.3 进程调度性能评价
定性指标
- 调度的可靠性 主要指进程调度是否可能引起数据结构的破坏,要求选择调度时机和保存CPU现场应十分谨慎。
- 调度的简洁性 调度程序不应过于繁琐和复杂,尽量降低系统开销。
定量指标
- CPU的利用率。
- 进程在就绪队列中的等待时间与执行时间的比率。
由于随机性而使定量分析十分困难。
4.4 进程调度算法
4.4.1 简单轮转法(时间片轮转法、时间片时钟法)
所有就绪进程按FCFS原则形成一个队列,从队首挑选一个进程并分给一个固定大小的时间片q投入运行,当时间片到而又未完成的进程将再次加入队尾,等待下一轮的调度,调度模型如图。
1.关于时间片q的分析
q = T / N,其中T是系统的响应时间,N是系统规定的同时就绪的进程数。
系统响应时间是计算机对用户的输入或请求作出反应的时间
- a. 系统要求响应速度高,即T小,则q随之减小;
- b. 系统要求的N值大,则q也相应减小;
- c. 若CPU速度高,处理能力强,则q可适当减小;
- d. q值应远远大于进程切换所需的时间i, 即q>>i。
示例
假设进程切换时间为1ms,时间片为4ms,则CPU在做完4ms有用的工作后将花费1ms进行进程切换,因此CPU20%的时间被浪费在管理上了。为提高CPU效率,假设时间片为100ms,则浪费的时间不足1%。
假如分时系统中有10个交互用户几乎同时按下回车键,那么可能有10个进程被挂在就绪队列中,若CPU空闲,则启动第1个进程,第2个进程大约100ms后启动,类推,假设每个进程都用足它们的时间片,则最后一个进程不得不等待1秒钟才能获得运行机会,多数用户就会感觉到1条命令1秒钟的响应停滞现象。
q过短会增大进程切换次数,加重系统开销;q过长,将退化为FCFS算法,使系统响应时间变长。(时间片太短会导致过多的进程切换,降低CPU效率,过长则可能引起对短的交互请求的响应时间过长。)
2.特点:简单、方便、公平、缺乏灵活性。
4.4.2 固定周期轮转法(时间片可变)
设某一轮调度i 中就绪进程数为ni,保持响应时间T值不变,计算出qi=T / ni,若还有到达的就绪进程,暂不允许进入队列,至下一轮调度i+1(i是第几轮)时再加入就绪队列,形成新ni+1值,计算出新qi+1。
即每一轮调度中所得q值大小,仅在这一轮调度中有效,其目的是当就绪进程数目不足时,保持T不变、增大q值,使短作业尽快完成,减小进程切换次数,减轻系统开销。
4.4.3 优先级高者优先调度
最常用的调度算法,系统总是将处理器分配给就绪队列中具有最高优先级的进程,进程的优先级可由其所属的作业继承或由系统代为规定。
设定优先级(数)方式
1)静态优先级(数)法 进程建立时由系统指定一个优先级(数)并在其生命期中一直保持不变。
- a按进程类型 赋予不同的优先级,系统进程高于用户进程;
- b按资源需求量 赋予不同的优先级,使用资源愈少的进程其优先级愈高;
- c外部标准 按收费标准设置不同的优先级,由用户指定。
特点 简单易行,但优先级确定欠精确,调度性能不高,管理效果欠佳。
2)动态优先级(数)法 进程建立时所指定的优先级在进程运行过程中可不断变化,以获得更好的调度性能。
- a线性修改优先级,在固定时刻增加或减少进程优先级。进程I/O请求受阻时适当增加优先级,一是为其弥补损失的CPU时间,增加调度机会,二是经常发生I/O请求的作业常为短作业;进程长期用满时间片而中断,适当降低其优先级。
- b非线性修改优先级,进程进入系统的初期其优先级不变或线性改变,若其等待调度的时间超过一定限度,则突然增加优先级,使其得以调度并很快投入运行。保证调度的优先级计算
基本思想是,若同时有n个进程运行,并且这些进程等价,则每个进程将获得1/n的CPU时间。基本办法是,跟踪各进程,计算自创建以来已使用的CPU时间,计算应获得的CPU时间,计算比率,比率最低的优先,比率0.5说明一个进程只获得了应得时间的一半,比率2.0则说明它获得了应得时间的2倍,该算法转向比率最低的进程,直至该进程的比率超过它的最接近竞争者为止。
短进程优先的优先级计算
基于短作业优先,短作业表示短的响应时间。在交互式环境中,计算每个进程的估计运行时间,优先估计运行时间最小的进程。假设每个进程的估计运行时间为T0,下一次运行时间的测量值为T1,则加权计算新的估计运行时间aT0 +(1 – a)T1。
通过a值选择,可以决定尽快忘掉或是很长时间记住老的运行时间。比如a=1/2,得到估计运行时间的序列为,……,3轮过后。T0在新的估计值中所占比例下降到1/8。这种技术称为老化算法,适用于预测值必须基于先前值的情况。老化算法在a=1/2时很容易实现,只需将新值加到老值并右移1位即可。
4.4.4多级队列调度
按优先级高低不同设两级或多级队列,进程调度先从高优先级就绪队列中挑选进程;若高优先级队列为空,则从较低优先级就绪队列中选取。同一队列实行FCFS或轮转法调度,若实行轮转法,高优先级就绪队列的q值较小。
比如CTSS设立优先级类,属于最高级类的进程为1个时间片,次高优先级类的进程为2个时间片,再次一级4个时间片,类推,当一个进程用完分配的时间片后,便移到下一类。假设某进程需要连续计算100个时间片,则被分配1,2,4,8,16,32及64个中用掉37个便可结束。该进程需要7次切换,若简单轮转则需要100次切换。优先级不断降低,运行频度逐渐放慢,有利于短的交互进程获得CPU。
4.4.5带反馈多级队列调度
依据进程运行的不同情况进行带反馈的调整,改变其所在队列。
- 进程创建时进入高优先级队列。
- 若进程只有在时间片完时才放弃CPU,则在时间片中断时投入低优先就绪队列;
- 请求终端I/O的进程,由于要频繁接受终端打入的命令,故其I/O完成后进入高优先队列;
- 页面I/O请求进程,由于涉及盘对换区的I/O且一般由缺页中断发生(属系统程序),故赋予高优先就绪;
- 请求盘I/O进程在I/O完成后进入中优先队列。
比如伯克利的XDS940系统设计4个优先级类,分别是终端、磁盘IO、短时间片、长时间片。若等待终端IO的进程被唤醒,则进入最高优先级类,等待磁盘IO的进程进入第2类,用完时间片则进入第3类,若多次用完时间片且从未等待终端或其它IO,则进入最低优先级类。
这些类似的策略,目的就是讨好交互用户和进程,不惜牺牲后台进程。
4.4.6其它调度
彩票调度
向进程提供彩票,当发生调度时,则随机抽取一张彩票,拥有该彩票的进程获得运行,比如CPU调度中可使用每秒50次的一种彩票,每个获奖者可得到20ms的CPU时间。
如果出售了100张彩票,某个进程持有其中的20张,那么每一次抽奖中该进程就有20%的取胜机会,在较长的运行中,该进程会得到20%的CPU时间。
如果一个新进程出现并得到一些彩票,那么在下一次抽奖时,该进程就拥有同它所持彩票数量比例相同的机会赢得奖励。因此,彩票调度反应迅速。
协作进程可以进行彩票交换。一个客户进程向服务器进程发送消息后就被阻塞,该客户进程可将其所有彩票交给服务器,增加该服务器运行的机会,服务器运行完毕后再把彩票还给客户进程,客户进程又可以运行了。
某视频服务器有3个进程向它们的客户提供视频流,每个视频流的帧速率不同,分别是10、20、25帧/每秒,则可以给这些进程分别分配10、20、25张彩票,那么它们会按照大致正确的比例划分CPU的使用。
基本思想是,所有的进程是平等的,但某些进程更平等一些,可以给重要的进程额外的彩票,增加它们获胜的机会。
公平分享调度
设用户1拥有4个进程ABCD,用户2拥有1个进程E,系统使用轮转调度,则用户1将得到80%的CPU时间而用户2将得到20%的CPU时间。
若考虑进程拥有者因素,即每个用户平均得到相等的CPU时间,调度程序将强制选择进程。
若仍采用轮转调度且满足限制条件的调度序列为:AEBECEDE…。
若限制用户1得到用户2两倍的CPU时间,则调度序列为:ABECDE…。
限制条件与公平的定义相关。
实时调度
实时调度是时间起主导作用的调度方案。设系统中有n个事件,各事件发生的周期为p[1..n],各事件需要CPU时间为c[1..n],则系统是“可调度的”的条件是∑c[i]/p[i] <= 1。设系统中有3个实时事件,p1=100ms, c1=50ms, p2=200ms, c2=30ms, p3=300ms, c3=60ms,则该系统是可调度的。
对于非周期性事件,则调度方案针对性强。实时调度要求一定的可预测性和规律性。
机制策略分离
到目前为止,我们隐含地假设系统中所有进程分属不同的用户并且进程间相互竞争CPU。通常情况下确实如此,但有时也有这样的情况:一个进程有许多子进程并在其控制下运行。例如一个数据库管理系统可能有许多子进程,每一个子进程可能处理不同的请求,或每一个子进程实现不同的功能(如请求分析,磁盘访问等),主进程完全可能掌握哪一个子进程最重要 (或最紧迫) 而哪一个最不重要。
但是,以上讨论的调度算法中没有一个算法从用户进程接收有关的调度决策信息,这就导致了调度程序很少能够做出最优的选择。解决问题的方法是将调度机制(scheduling mechanism)与调度策略(scheduling policy)分离(著名的原则,Levin等人,1975),也就是将调度算法以某种形式参数化,而参数可以由用户进程填写。我们再来看一下数据库的例子,假设内核使用优先级调度算法,但提供一条可供进程设置(并改变)优先级的系统调用,这样,尽管父进程本身并不参与调度,但它可以控制如何调度子进程的细节。在这里,调度机制位于内核,而调度策略则由用户进程决定。