1、进程调度
进程调度即处理机调度。再多道程序环境中,进程数往往多于处理机数,这将导致多个进程互相争夺处理机。进程调度的任务是 控制 ,协调进程对于CPU的竞争,按照一定的调度算法,使某一就绪进程获得CPU的控制权,转换成运行状态。
进程调度也叫低级调度。实际上进程调度完成一台物理的CPU转变成多台虚拟的(或逻辑的)CPU的工作。
2、调度的层次
一个作业从提交开始直到完成,往往要经历以下三级调度:
- 作业调度。又称高级调度,.其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。简言之,就是内存与辅存之间的调度。对于每个作业只调入一次、调出一次。多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度。作业调度的执行频率较低,通常为几分钟一次。
- 中级调度。又称内存调度。引入中级调度是为了提高内存利用率和系统吞吐量。为此,应使那些暂时不能运行的进程,调至外存等待,把此时的进程状态称为挂起状态。当它们已具备运行条件且内存又稍有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程,再重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待。
- 进程调度。又称为低级调度,其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。进程调度是操作系统中最基本的一种调度,在一般操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
3、进程调度的主要功能
- 记录系统中所有进程的执行状况;
- 根据一定的调度算法,从就绪队列中选出一个进程来,准备把CPU分配给它;
- 把CPU分配给进程,即把选中进程的进程控制块内有关的现场信息,如 程序状态字、通用寄存器等内容送入处理器相应的寄存器中,从而让它占用CPU运行;
4、进程调度的时机
执行进程调度一般是在下述情况下发生的:
- 正在执行的进程运行完毕;
- 正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态;
- 正在执行的进程调用了P原语操作,从而因资源不足而被阻塞;或调用了V原语操作激活了等待资源的进程队列;
- 执行中的进程提出I/O请求后被阻塞;
- 在分时系统中时间片已经用完;
【注意】:
以上都是在CPU为不可抢占方式下的引起进程调度的原因。
在CPU方式是可抢占方式时,还有下面的这条原因:
就绪队列中的某个进程的优先级变得高于当前运行进程的优先级,从而也将引起进程调度。
不能进行进程调度与切换的几种情况:
- 在处理中断的过程中:中断处理过程复杂,在实现上很难做到进程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源;
- 进程在操作系统内核程序临界区中:进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放;
- 其他需要完全屏蔽中断的原子操作过程中:如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换;
- 如果在上述过程中发生了引起调度的条件,并不能马上进行调度和切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度与切换;
5、进程调度的方式
所谓进程调度方式是指当某一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更髙的进程进入就绪队列,此时应如何分配处理机。
通常有以下两种进程调度方式:
可抢占方式:
即就绪队列中一旦有优先级高于当前运行进程的优先级的进程存在时,便立即进行进程调度,转让处理机。
釆用剥夺式的调度,对提高系统吞吐率和响应效率都有明显的好处。但“剥夺”不是一种任意性行为,必须遵循一定的原则,主要有:优先权、短进程优先和时间片原则等。
不可抢占方式:
一旦把CPU分配给一个进程,它就一直占用CPU,直到该进程自己因调用原语操作或等待I/O而进入阻塞状态,或时间片用完时才让出CPU,重新进行进程调度。
这种方式的优点是实现简单、系统开销小,适用于大多数的批处理系统,但它不能用于分时系统和大多数的实时系统。
6、进程调度的指标
- CPU利用率:CPU是计算机系统中的稀缺资源,所以应在有具体任务的情况下尽可能使CPU保持忙,从而使得CPU资源利用率最高。
- 吞吐量:CPU运行时的工作量大小是以每单位时间所完成的进程数目来描述的,即称为吞吐量。
- 周转时间:指从进程创建到作进程结束所经过的时间,这期间包括了由于各种因素(比如等待I/O操作完成)导致的进程阻塞,处于就绪态并在就绪队列中排队,在处理机上运行所花时间的总和。
- 等待时间:即进程在就绪队列中等待所花的时间总和。因此衡量一个调度算法的简单方法就是统计进程在就绪队列上的等待时间。
- 响应时间:指从事件(比如产生了一次时钟中断事件)产生到进程或系统作出响应所经过的时间。在交互式桌面计算机系统中,用户希望响应时间越快越好,但这常常要以牺牲吞吐量为代价。
这些指标其实是相互有冲突的,响应时间短也就意味着在相关事件产生后,操作系统需要迅速进行进程切换,让对应的进程尽快响应产生的事件,从而导致进程调度与切换的开销增大,这会降低系统的吞吐量。
7、进程调度算法
进程调度算法解决以何种次序对就绪进程进行处理机的分配以及按何种时间比例让进程占用处理机。
进程调用的主要目标就是采用某种算法合理有效的把处理机分配给进程,其调度算法应尽可能提高资源的利用率,减少处理机的空闲时间。对于用户作业采用较为合理的平均响应时间,以及尽可能的增强处理机的处理能力,避免有些作业长期不能投入运行。
选取进程投入运行,是根据对PCB就绪队列的扫描并应用调度算法决定的;
就绪队列有两种组成方法:
一是每当一个进程进入就绪队列时,根据其优先数的大小放到“正确的”优先位置上,当处理机变成空闲时,从队列的顶端选取进程投入运行;
二是把进程放到就绪队列的尾部,当需要寻找一个进程投入运行时,调度程序必须扫描整个PCB就绪队列,根据调度算法挑选一个合格的进程投入运行。
进程占用处理机的时间长短与进程是否完成、进程等待、具有更高优先数的进程需要处理机、时间量用完、产生某种错误等因素有着密切的关系。
【几种常用的进程调度算法】:
先进先出算法(FIFO:First-In-First-Out)
该算法按照进程进入就绪队列的先后次序来选择。即每当进入进程调度,总是把就绪队列的队首进程投入运行。
时间片轮转算法(RR:Round-Robin)
这主要是分时系统会使用的一种算法。轮转法的基本思想是:将CPU的处理时间划分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片。当时间片结束时,就强迫运行进程让出CPU,该进程进入就绪队列,等待下一次调度。同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行;
如此轮流调度,使得就绪队列中的所有进程在一个有限的时间T内都可以依次轮流获得一个时间片的处理机时间,从而满足系统对用户分时响应的要求。
在轮转法中,时间片长度Q的选取非常重要,将直接影响系统开销和响应时间。如果时间片长度很小,则调度程序剥夺处理机的次数频繁,加重系统开销;反之,比如一个时间片就能保证就绪队列中所有进程都执行完毕,则轮转法就会退化成先进先出算法了。
【以下是影响时间片值设置的几个主要因素】
- 系统响应时间:当进程数目一定时,时间片Q值的大小正比于系统对响应时间的要求。
- 就绪进程的数目:当系统响应时间T一定时,时间片Q值的大小反比于就绪进程数。
- 计算机的处理能力:计算机的处理能力直接决定了每道程序的处理时间,显然,处理速度愈高,时间片值就可愈小。
最高优先级算法(HPF:Highest Priority First)
进程调度每次将处理及分配给具有最高优先级的就绪进程。
进程优先数的设置可以是静态的,也可以是动态的。静态优先数是在进程创建时根据进程初始特性或用户要求而确定的,在进程运行期间不能改变;动态优先数则是指在进程创建时先确定一个初始优先数,以后在进程运行中随着进程特性的改变(如等待时间增长),不断修改优先数。
多级队列反馈法
设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二队次之,其余队列优先级依次降低。仅当第1~i-1个队列均为空时,操作系统调度器才会调度第i个队列中的进程运行。赋予各个队列中进程执行时间片的大小也各不相同。在优先级越高的队列中,每个进程的执行时间片就越小或越大(Linux-2.4内核就是采用这种方式)。
当一个就绪进程需要链入就绪队列时,操作系统首先将它放入第一队列的末尾,按FCFS的原则排队等待调度。若轮到该进程执行且在一个时间片结束时尚未完成,则操作系统调度器便将该进程转入第二队列的末尾,再同样按先来先服务原则等待调度执行。如此下去,当一个长进程从第一队列降到最后一个队列后,在最后一个队列中,可使用FCFS或RR调度算法来运行处于此队列中的进程。
如果处理机正在第i(i > 1)队列中为某进程服务时,又有新进程进入第k(k < i)的队列,则新进程将抢占正在运行进程的处理机,即由调度程序把正在执行进程放回第i队列末尾,重新将处理机分配给处于第k队列的新进程。
从MLFQ调度算法可以看出长进程无法长期占用处理机,且系统的响应时间会缩短,吞吐量也不错(前提是没有频繁的短进程)。所以MLFQ调度算法是一种合适不同类型应用特征的综合进程调度算法。