OS学习笔记——处理器调度2

当引起进程调度的事件发生的时候,首先要保存当前进程A的上下文,然后执行调度程序,在调度程序的控制下确定是否要进行切换,以及切换到哪个进程。如果要切换到另一进程B,则需要记录放弃CPU的进程A的现场信息(如PC,通用寄存器的内容等),把CPU分配给B进程,并恢复进程B的上下文,从上次切换前位置继续执行进程B代码。


进程调度方式可以分为非抢占式和抢占式两种。


非抢占式:调度程序一旦把CPU分配给某一进程后便让其一直运行下去,直到进程完成或者发生某事件不能运行的时候,才将CPU分给其他进程。


抢占式:一个进程正在执行的时候,系统可以根据某种策略收回CPU,将其移入就绪队列,然后选择其他进程,将CPU分配给其他进程,使之运行。

使用抢占式进程调度的时候,需要遵循几个原则,主要有以下几个方面。

时间片原则:各进程按照系统分配给的一个时间片运行,当该时间片用完或者该进程等待某事件发生而发生阻塞的时候,系统将停止该进程的执行而重新调度。

优先级原则:每个进程均赋予一个调度优先级,通常一些重要和紧急的进程被赋予较高的优先级。当一个新的紧迫进程到达时,或者一个优先级高的进程从阻塞状态编程就绪状态,且这个进程的优先级比当前进程的优先级高,OS就停止当前进程的执行,将处理器分配给优先级高的进程,使之执行。


短进程优先原则:当新到达的作业对应的进程比正在执行的作业对应进程所运行事件明显短得多,系统就剥夺当前进程的执行,而将处理器分配给新的短进程,使短进程优先执行。

调度算法:


1.先来先服务。 这是一种最普遍最简单的方法。可以用于作业调度也可以用于进程调度。如果用于作业调度,会优先从后备队列中选择一个或者多个位于队列头部的作业,调入内存,分配所需资源/创建进程,然后放入就绪队列中。

FCFS算法是非抢占式的,若一个进程获得了处理器,就一直运行到结束 才会让出处理器。这样的算法对于短作业和重要作业是不公平的(使他们不得不等待在后面)

且这种算法平均周转时间比较长,对长作业有利。


2. 短作业(进程)优先(SJF)

这是一种被证明了的最佳调度算法,这是因为对于给定的一组进程,SJF算法的平均周转时间最小。


缺点是长作业进程有可能被饿死。缺少剥夺机制(不适用于分时系统或交互式事务处理环境)。无法准确知道作业(进程)的确切执行时间,致使该算法不一定能真正做到短作业优先调度。



3.优先级调度

确定优先级的算法有两种:动态优先级、静态优先级


静态优先级:静态优先级在系统创建时确定的,一旦确定在整个进程运行期间不再改变。通常系统进程的优先级高于高于用户进程的优先级。对于I/O服务请求比较密集的进程赋予较高的优先级。


动态优先级: 动态优先级是在进程运行前先确定一个优先级,进程运行过程中根据进程等待时间的长短、执行时间的多少、输入输出信息量大小等,通过计算得到新的优先级。



4.时间片轮转法

将系统中所有的就绪进程按照FCFS原则排成一个队列。每次调度的时候将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。在一个时间片结束时,发生时钟中断。调度程序暂停当前进程的执行,将其送到就绪队列的末尾,并通过CPU现场切换执行当前的队首进程。


时间片轮转算法中,时间片长度的选择十分关键。如果时间片长度果断,则调度程序剥夺处理机的次数增多,这将使进程上下文的交换次数大大增加,加重了系统开销。如果时间片长度。如果时间片长度选择过大,大到一个进程足以完成其全部工作所需时间,那么时间片轮转就会退化为先来先服务策略。



T(响应时间) = N(进程数目) * q (时间片)


5.多级队列调度算法

在进程可以容易地被分成不同组的情况下,可以使用多级队列调度算法。(Multilevle-Queue-Scheduling Algorithm) 例如,在系统中,对进程有一种划分方法,将进程分为前台(或交互式)进程和后台(批处理式)进程,这两种不同类型的进程具有不同的响应时间要求,也有不同的调度需要。另外,与后台进程相比,前台进程可能需要更高的优先级。


6.多级反馈队列调度。 多级反馈队列调度算法不必先知道各进程的执行时间,又可以满足各类型进程的调度需要。UNIX、Windows NT、OS/2都用到了类似的调度算法,也叫做多队列轮转法。


算法思想如下所示:

1. 需要设置多个就绪队列,并且为其分别赋予不同的优先级。队列1的优先级最高,其他队列优先级逐次降低。就绪队列1的优先级最高,其他逐级降低。每个队列分配不同的时间片,规定优先级越低时间片越长。


2. 新进程就绪后,先插入队列1的队尾,按照FCFS算法调度。若一个时间片未能 执行完,则降低插入到队列2的末尾;依次类推,降低到最后的队列。在最后的就绪队列中,按照时间片轮转算法调度直到完成。


3.进程由于等待事件放弃占用CPU之后,就进入等待队列,一旦等待的事件发生,则回到原来的就绪队列。


4.只有较高优先级的队列为空时,才调度较低优先级队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则需要重新调度,抢先执行新进程,将被抢先的进程插入原队列的末尾。


对于不同类型的作业而言,该方法都能获得较好的效率。对于短作业而言,在第一个就绪队列中就可以完成自己的工作,响应效率高。对于中型作业而言,在第一个就绪队列紧挨着的几个就绪队列中基本上就可以完成;而长作业随着时间推移降到最后一个使用RR算法的队列,系统总能保证长作业不会被饿死,而是在某个时刻获得运行。

7.高响应比优先调度

高响应比优先调度是指当前进程完成或被阻塞,需要重新调度的时候,从就绪队列中优先选择响应比大的进程投入运行。


响应比


由上式可以看出,在等待时间相同的时候,运行时间越短,优先级越高,对短作业有利。在要求服务时间相同时,等待的时间越长,优先级就越高。在这种算法中,长作业的优先级会随着等待时间加长而升高。因此长作业也会得到执行,不会被饿死。


这种算法是FCFS算法和SJF算法的有机结合。不足就是每次重新调度都要估计期待的服务时间,因而会增加计算量和系统开销。






猜你喜欢

转载自blog.csdn.net/Serenity0614/article/details/78754508