在多道程序环境下,主存中有着多个
进程,其数目往往多于处理机数目。这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行,这一过程称为调度。
调度的实质是一种资源分配。调度过程是指处理机根据调度策略从就绪队列中选择一个进程运行的过程。
简介
调度在计算机中是分配工作所需资源的方法。资源可以指虚拟的计算资源,如线程、
进程或
数据流;也可以指硬件资源,如
处理器、网络连接或
扩展卡。调度过程是指处理机根据调度策略从就绪队列中选择一个进程运行的过程。调度过程与很多因素有关。如调度方式、调度的基本准则、调度算法。在调度过程中还有进程间上下文切换这一过程。
进程调度方式
所谓进程调度方式是指当某一个进程正在处理器上执行时,若有某个更为重要或紧迫的进程需要处理,既有优先权更高的进程进入就绪队列,此时应如何分配处理器。通常有一下两种进程调度方式:
非剥夺调度方式
非剥夺调度方式又称为非抢占调度方式,是指当一个进程正在处理器上执行时,即使有某个更为重要或紧迫的进程进入就绪状态,仍然让正在执行的进程继续执行,知道该进程完成或发生某种时间而进入阻塞状态时,才把处理器分配给更为重要或紧迫的进程。
剥夺调度方式
剥夺调度方式又称为抢占方式,是指当一个进程正在处理器上执行时,若有某个更为重要或紧迫的进程需要使用处理器,则立即暂停正在执行的进程,将处理器分配给这个更为重要或紧迫的进程。
“剥夺”不是一种任意性行为,必须遵循一定的原则:
优先权原则,短进程优先原则和时间片原则。
基本准则
不同的调度算法具有不同的特性,在选择调度算法时,必须考虑算法所具有的特性。为了比较处理器调度算法的性能,人们提出很多评价准则,下面介绍主要的几种准则:
CPU利用率
CPU是计算机系统中最重要的资源之一,所以应尽可能使CPU保持在忙状态,是这一资源利用率最高。
系统吞吐量
系统吞吐量表示单位时间内CPU完成作业的数量。长作业需要消耗较长的处理器时间,因此会降低系统的吞吐量。而对于短作业,他们所需要消耗的处理器时间端,因此能提高系统的吞吐量。调度算法和方式的不同,也会对系统的吞吐量产生较大的影响。
周转时间
周转时间是指从作业提交到作业完成所经历的时间,包括作业等待、在就绪队列中排队、在处理器上运行以及进行输入输出操作所花费的时间的总和。
作业的周转时间=作业完成时间-作业提交时间
等待时间
等待时间是指进程处于等处理器状态时间之和,等待时间越长,用户满意度越低。处理器调度算法实际上并不影响作业执行或输入输出操作时间,只影响作业在就绪队列中等待所花的时间。因此,衡量一个调度算法优劣常常只需简单地考察等待时间。
响应时间
响应时间是指从用户提交请求到系统首次产生响应所有的时间。在交互式系统中,周转时间不可能是最好的评测准则,一般采用响应时间作为衡量调度算法的重要准则之一。从用户的角度来看,调度策略应尽量降低响应时间,使响应时间处在用户能够接受的范围之内。
典型算法
通常系统的设计目标不同,所采用的调度算法也不同。在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。下面介绍几种常用的调度算法:
FIFS先来先服务调度算法
特点:算法简单,但是效率低;有利于长作业,不利于短作业;有利于CPU繁忙型作业而不利于IO繁忙型作业。
SJF短作业优先调度算法
短作业(进程)优先调度算法是指对短作业祸端进程优先调度的算法。短作业优先调度算法是从后备队列中选择一个或若干个估计运算时间最短的作业,将他们呢掉入内存运行。
SJF调度算法的缺点:
1) 该算法对长作业不理。
2) 该算法完全未考虑作业的紧迫程度
3) 由于作业的长短只根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意的缩短其作业的估计运行时间,致使该算法不一定能真正做到算作业优先调度。
4) 注意:SJF调度算法的平均等待时间、平均周转时间最少。
高响应比优先调度算法
高响应比优先调度算法主要用于作业调度。同时考虑从每个作业的等待时间和估计需要运行的时间。
时间片轮转调度算法
多级反馈队列调度算法
多级反馈队列调度算法主要是时间片轮转调度算法和优先级调度算法的综合和发展。通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。
切换机制
当对处理机进行切换时,会发生两对上下文切换操作。在第一对上下文切换时,操作系统将保存当前进程的上下文,而装入分派程序的上下文,以便分派程序运行;在第二对上下文切换时,将移出分派程序,而把新选进程的 CPU 现场信息装入到处理机的各个相应寄存器中。
应当指出,上下文切换将花去不少的处理机时间,即使是现代计算机,每一次上下文切换大约需要花费几毫秒的时间,该时间大约可执行上千条指令。为此,现在已有通过硬件(采用两组或多组寄存器)的方法来减少上下文切换的时间。 一组寄存器供处理机在系统态时使用,另一组寄存器供应用程序使用。在这种条件下的上下文切换只需改变指针,使其指向当前寄存器组即可。