1.处理器调度的类型
1.1 调度类型简介
长程调度
:新作业提交时,决定是否将其送入内存,成为一个进程
。也称为作业调度
短程调度
:决定将CPU
分配给哪个就绪进程(CPU资源分配)
中程调度
:决定把哪些进程在内存与磁盘间交换
从这个图理解一下处理器调度的过程:首先是作业输入到磁盘的输入井(后备作业队列中),然后此时会发生长程调度
,长程调度的任务是从输入井中的作业挑选,挑选作业送入内存,送入内存后作业
就变成进程
了。
然后在内存中,会发生短程调度
,意思是变成进程后,进程需要运行,需要CPU资源,这时候短程调度会为他们分配资源,在这个过程中,进程会在运行、就绪、阻塞三种状态间来回切换
然后在内存和硬盘之间,会发生中程调度
,中程调度的任务是将在内存中的进程换入到硬盘中,也有从硬盘中的处于就绪挂起/阻塞挂起/态的进程换入到内存中的。
1.2 调度进程状态切换
经过1.1的知识分析,首先一个作业被输入到输入井,处于新建作业状态,此时该作业经过长程调度变成进程
,但是该进程可能存在硬盘也可能存在内存中,如果存在硬盘中,那就是就绪/挂起态的进程,如果存在内存中,那就是就绪态的进程。
然后阻塞挂起态的进程经过中程调度可以变成阻塞态,反之亦然。
就绪态的进程经过短程调度就可以变成运行态。
1.3 长程调度
在批处理系统或者OS的批处理部分中,新提交的作业放在磁盘的后备作业队列中,长程调度选择某些作业送入内存并创建进程。
长程调度的时机
:根据系统并发度
(即多道程序度,内存中的进程个数)决定,当老进程结束
或CPU空闲超过阈值
,启动长程调度。当调度不频繁(秒、分钟级),执行速度可以较慢。长程调度的选择
:先来先服务、优先级、预计执行时间、组合CPU密集型、和I/O密集型、组合不同I/O需求的作业等
在分时系统中,是不需要长程调度的,OS总是立即接收用户的请求并立即处理请求并创建进程,直到系统饱和。
1.4 中程调度
系统并发度
决定中程调度的时机
要考虑换入进程和换出进程的内存空间长度
1.5 短程调度
当前运行进程的时间片用完、阻塞、被抢占时,启动短程调度。
调度频繁(毫秒级):执行速度必须很快
问题:I/O密集型进程和CPU密集型进程,谁的CPU调度优先级应该更高?
答:I/O密集型进程:该进程需要进行大量的I/O,可能需要大量的CPU调度,CPU密集型进程:需要占用大量的CPU时间片,当一个CPU密集型进程获得高优先级时,其他许多低优先级的进程可能导致饥饿,而当一个I/O密集型进程获得高优先级时,由于其绝大多数时间都处于I/O,CPU可以轮换,此时,其他许多低优先级的进程有机会可以获得CPU资源,不容易导致饥饿。因此I/O密集型进程的CPU调度优先级应该更高
2. 调度算法
2.1 短程调度算法
- 优先级的使用,每个进程都有一个优先级(用优先数来表示)。UNIX SVR3,FreeBSD,Linux优先数越小,优先级越高。而在Windows下,优先数大者,优先级高
- 在现代的OS中,一般设置一组优先级递减的就绪队列:其中RQ0的优先级是最高的
- 调度程序总是优先选择最高优先级队列中的就绪进程执行。
- 优先级高的进程先执行的机制的一个基本问题就是,低优先级的进程可能会饥饿。
2.2 短程调度准则
面向用户的性能指标:对每个进程计算的指标
周转时间
:从作业提交到完成的时间间隔
,包括:服务时间
(运行态CPU执行的时间)+等待时间
(包括后备态等待进入内存、阻塞态等待资源、就绪态等待CPU)。适合批处理作业响应时间
:从提交请求到开始响应。适合分时(交互)进程最后期限
:进程完成/开始处理的截止期限。适合实时进程归一化周转时间(带权周转时间)
:(周转时间)=(服务时间+等待时间)/服务时间
面向系统的性能指标吞吐量
:单位时间内完成的进程个数处理器利用率
:CPU忙的时间比例=工作时间/总运行时间。单用户系统和实时系统不看重该系统指标
2.3 选择策略调度
两种调度方式:
- 非抢占式:当前进程一直运行,直至其终止或阻塞时,才再次分配CPU
- 抢占式:当其时间片结束或有更高级进程就绪时,将正运行进程转为就绪,再次分配CPU
2.3.1 先来先服务(FirstComeFirstService)
调度最先进入后备队列/就绪队列的作业/进程,直至运行完或阻塞时,再重新调度
FCFS通常与优先级策略相结合,如每个优先级一条队列,每条队列中的调度基于FCFS原则
FCFS利于长进程或CPU密集型的进程,不利于短进程或I/O密集型的进程
2.3.2 轮转策略(Round Robin)
各进程按提交顺序排成就绪队列,然后依次占用处理机,运行某一时间片(通常10-200ms),时间片用完就排入就绪队列尾
-
关键参数:时间片长度q
时间片太长,则轮转算法退化为FCFS,响应太慢]
时间片太短,则上下文切换频繁,开销大
时间片应略大于一次典型的交互所需要的时间
-
RR的平均周转时间可能较高,但响应时间更短
-
由于解除阻塞的进程被排入就绪队列尾部,轮转法不适合I/O密集型进程(上次的剩余时间片被浪费)
-
公平性优于轮转法的虚拟轮转法:
- 解除阻塞的进程被送入一个FCFS辅助队列
- 辅助队列的优先级高于就绪队列
- 辅助队列的进程被调度时,它的运行时间不长于
基本时间片
-它自从上一次在就绪队列中被选择运行
的总时间,即运行上次剩余的时间片
时间片轮转法,设时间片长度q =100ms,每次上下文切换时间需要 5ms,则用于上下文切换的开销比例是多少?
一个完整的运行时间片包括时间片的基本长度+每次上下文的切换时间
∴用于上下文切换的开销比例是5/(100+5) = 4.8%
2.3.3 最短进程优先(Shortest Process Next)
最短进程优先
(SPN):调度CPU执行时间预期最短的进程,直至运行完或阻塞时,再重新调度。
利于短进程;不利于长进程及紧迫任务。
通常,进程是“CPU执行和I/O”不断交替的过程,SPN的困难在于:如何预测下一CPU用时长度
?
一种解决方案是:通过指数平均法
预测(用以前的CPU用时长度估计下一CPU用时长度)
2.3.4 最短剩余时间(Shortest Remaining Time)
最短剩余时间优先
(SRT):新进程到达时,若新进程的预计运行时间比当前进程的剩余运行时间更短,则抢占当前进程。
2.3.5 最高响应比优先(Highest Response Ratio Next)
最高响应比优先算法
:综合了FCFS和SPN算法
- 当前进程完成或阻塞时发生调度。每次调度前,计算所有就绪进程的响应比,高者优先。
- 实际上,响应比就是一个进程在
某一时刻
的“归一化周转时间(即 带权周转时间)”
2.3.6 反馈(多级反馈队列)Multilevel Feedback
- 基于
时间片的抢占
+动态优先级调度。 - 设立
多个就绪队列
,优先级越高的队列,其时间片越小 - 同一队列内进程按
FCFS
调度,但末级队列按轮转法
调度 - 当进程在一个时间片内未运行完,则降到下一级队列末尾
- 当上级队列均无进程就绪时,才调度本级队列内进程
- 实用,能较好地满足交互型进程、短进程、长进程的要求
2.3.7 优先权调度
- 调度
优先级最高
的进程。就绪队列中进程按优先级递减排列,每次调度最高级队列的队首进程。- 可抢占:新到达的高级进程立即抢占当前进程。
- 不可抢占:当前进程继续运行,新到达的高级进程按照其优先级,进入合适的就绪队列。
- 静态优先权:创建进程时确定优先级,保持不变。低优先级进程可能·
饥饿Starvation
。 - 动态优先权:创建进程时赋予进程一个优先权初值,但随着进程的等待时间延长,其优先级会升高(称为老化Aging );
随着CPU执行时间的延长,其优先级会降低
2.4 性能比较
- 先来先服务FCFS:简单,偏向长进程,平均周转时间长。
- 轮转RR:公平
- 最短进程优先SPN:优于轮转。
- 最短剩余时间SRT:由于抢占,效率优于SPN。
- 最高响应比优先HRRN:性能介于FCFS和SPN之间
- 反馈FB:短进程带权周转/等待时间短。
2.5 公平共享调度
一个用户组
(group)可以由多个用户组成,一个用户的应用程序可以由多个进程(或线程)组成,
基于进程组的调度称为公平共享调度。调度时考虑相关进程组及每个进程的执行历史。
- 每个用户具有
权值
,规定了该用户能够使用系统资源的比例
。如用户A权值是用户B权值的两倍,则A能占用的资源是B的两倍(或者说,A能完成的工作量应该是B的两倍)。 - 每个进程具有
优先级
,起初分配一个基本优先级,之后该进程优先级随着进程使用CPU的时间、以及进程所属组使用CPU的时间增加而降低。
3. 传统的UNIX调度
保证前台交互用户的响应时间短,且低优先级的后台作业不会饥饿。多级反馈,每个优先级队列中轮转调度。
- 1秒抢占:若一个运行进程在1秒内未运行完或阻塞,它将被抢占,调度下一就绪进程。
- 每秒计算一次所有进程的优先数 P(i)。小者优先权高。
- cpu(i):被调度运行时,进程使用CPU时间的计数,每次时钟中断(滴答tick)时加1。
- cpu(i) = cpu(i-1)/2 ,即:未被调度时,进程在第 i 秒 的CPU时间计数是它第 i-1秒的CPU时间数的一半。