CPU调度是多道程序操作系统的基础,通过在进程之间切换CPU,操作系统可以提高计算机的生产效率

 

 

基本概念:

  CPU-I/O区间周期:

    CPU的成功调度依赖于进程的如下观测属性:进程执行由CPU执行和I/O等待周期组成。进程在这两个状态之间切换。

    这些CPU区间的长度已经被大量地测量过,具有大量短CPU区间和少量长CPU区间。有助于人们选择合适的CPU调度算法

  CPU调度程序:

    每当CPU变为空闲时,操作系统就必须从就绪队列中选择一个进程来执行。进程选择由短期调度程序执行。  

(FIFO)队列,可实现为(FIFO)队列、优先队列、树或仅仅是无序链表

  可抢占式调度:CPU调度决策可在如下四种环境下发生:

    1 当一个进程从运行状态切换到等待状态(I/O请求或调用wait以等待一个子进程的终止)

    2 当一个进程从运行状态切换到就绪状态(当出现中断时)

    3 当一个进程从等待状态切换到就绪状态

    4 当一个进程终止时

    当调度只能发生在第一和第四两种情况时,称调度方法是非抢占的,否则调度方案是可抢占的。

    采用非抢占调度,一旦CPU被分配给一个进程,那么该进程会一直使用CPU直到进程终止或切换到等待状态时释放CPU

    可抢占式调度是有代价的。例如:两进程共享数据的情况,需要新机制来协调对共享数据的访问。

  分派程序:

    分派程序是一个模块,用来将CPU的控制交给由短期调度程序所选择的进程,其功能包括:

      1 切换上下文

      2 切换到用户模式

      3 跳转到用户程序的合适位置以重新启动这个程序

    分派程序应尽可能快,因为在每次进程切换时都要使用。

    分派程序停止一个进程而启动另一个进程执行所要花费的时间称为分派延迟。

 

 

调度准则:

  不同的CPU调度算法具有不同属性,且可能对某些进程更为有利。

  为了比较CPU调度算法,分析员提出了许多准则:

    1 CPU使用率:需要使CPU尽可能忙,对于真实系统,应从40%(轻负荷系统)到90%(重负荷系统)

    2 吞吐量:如果CPU忙于执行进程,那么就要评估其工作量。一种测量工作量地方法称为吞吐量,它指一个时间单元内所完成进程的数量。对于长进程,吞吐量为每小时一个进程,对于短进程,可能为每秒十个进程。

    3 周转时间:从一个特定进程的角度来看,重要准则是运行该进程需要花费多长时间。从进程提交到进程完成的时间间隔称为周转时间。周转时间是所有时间段之和。

    4 等待时间:CPU调度算法并不影响进程运行和执行I/O的时间量,它只影响进程在就绪队列中等待所花费的时间。等待时间是在就绪队列中等待所花时间之和。

    5 响应时间:对于交互式系统,周转时间并不是最佳准则。因此,另一时间度量是从提交请求到产生第一响应的时间,这种度量称为响应时间,是开始响应所需要的时间,而不是输出该响应所需要的时间。周转时间通常受输出设备速度的限制。

  人们需要使CPU使用率和吞吐量最大化,而使周转时间、等待时间和响应时间最小化。绝大多数情况下,要优化平均度量值。

 

 

调度算法:

  CPU调度处理从就绪队列中选择哪个进程并为之分配CPU的问题。一些现有的CPU调度算法:

  先到先服务调度:

  最短作业优先调度:

  优先权调度算法:

    优先权可通过内部或外部方式来定义。

      内部定义优先权使用一些可测量数据以计算进程优先权:时间极限、内存要求、打开文件数量等

      外部优先权是通过操作系统之外的准则来设置的:进程重要性、政治等

    优先权调度可以是可抢占的或者非抢占的。当一个进程到达就绪队列时,进行比较,如果优先权高,那么抢占优先权调度算法会抢占CPU,非抢占优先权调度算法只是将新进程加到就绪队列的头部。

    优先权调度算法的一个主要问题是无穷阻塞。低优先权进程有可能会一直阻塞。

    地优先权进程无穷等待问题的解决方案之一是老化:老化是一种技术,以逐渐增加在系统中等待很长时间的进程的优先权。

  轮转法(RR)调度:

    定义一个较小时间单元,称为时间量或时间片。CPU调度程序循环就绪队列,为每个进程分配不超过一个时间片间隔的CPU。

    RR算法的性能很大程度上依赖于时间片的大小。人们希望时间片要比上下文切换时间长,时间片又不能太大。根据经验,80%的CPU区间应该小于时间片

  多级队列调度:

    将就绪队列分成多个独立队列。根据进程的某些属性,进程会被永久地分配到一个队列。每个队列有自己的调度算法。

    例子:1 系统进程 2 交互式进程 3 交互式编辑进程 4 批处理进程 5 学生进程

  多级反馈队列调度:

    允许进程在队列之间移动。主要思想是根据不同CPU区间特点以区分进程。如果进程使用过多CPU时间,那么它会被移到更低优先权队列。这种方案会将I/O约束和交互式进程留在较高优先级队列。

    例子:一个多级反馈队列调度程序,有三个队列,从0到2。首先执行队列0内的所有进程,分配一个8ms的时间片,如果不能在这一时间内完成,那么它就被移到队列1的尾部,队列0为空,队列1头部进程会得到一个16ms的时间片。

    多级反馈队列调度程序可由下列参数来定义:

      1 队列数量

      2 每个队列的调度算法

      3 用以确定进程何时升级到较高优先权队列的方法

      4 用以确定进程何时降级到较低优先权队列的方法

      5 用以确定进程在需要服务时应进入哪个队列的方法

    多级反馈队列调度程序的定义使它成为最通用的CPU调度算法。不过,它还需要一些方法来选择参数值以定义最佳的调度程序。

 

 

 

多处理器调度:

  

 

 

实时调度:

  实时计算可分成两种类型:

  硬实时系统需要在保证的时间内完成关键任务。通常,在提交进程时,同时有一条语句高速系统用来完成或执行I/O所需要的时间。接着,调度程序或者允许进程并保证该进程能按时完成,或者因不可能而拒绝请求。这称为资源预约。但是这一保证是不可能的。所以硬实时系统由运行在专用于关键进程的硬件上的特殊目的软件组成,缺乏现代计算机和操作系统的全部功能。

  软实时计算的限制较少。它要求关键进程要比其他较弱进程拥有更高的优先权。

 

 

算法评估:

  定义用于选择算法的准则。准则通常是通过CPU使用率、响应时间或吞吐量来定义的。

  例子:1 最大化CPU使用率,同时要求最大响应时间为1s; 2 最大化吞吐量,要求周转时间平均地讲与总的执行时间线性成正比。

  确定性建模:

    采用特定预先确定的负荷,定义在给定负荷下每个算法的性能。主要用途在于描述调度算法和提供例子。

    然而确定性建模通常过分特殊且要求过多精确知识,故用处有限。

  排队模型:

  模拟:

  实现:将真实算法放进实际系统然后在真实操作条件下对它进行评估。

  

 

进程调度模型

  进程本地调度:线程调度是在应用程序内部进行的

  系统全局调度:内核决定调度哪个内核线程。

  solaris2采用基于优先级的进程调度:

    它有四类调度,按优先级分别为实时、系统、分时和交互式。每个类型有不同的优先权和调度算法。

  windows 2000采用基于优先权的、可抢占调度算法来调度程序:

    windows 2000调度程序确保最高优先级的线程总是运行。

    使用32级优先权方案来确定线程执行的顺序。优先级分为两大类型:

      可变类型:包括优先级从1到15的线程

      实时类型:包括优先级从16到31的线程

      (还有一个线程运行在优先级0,它用于内存管理)

    分配程序为每个调度优先级使用一个队列,从高到低审视队列集,直到它发现一个线程就绪可执行。如果没有找到就绪线程,那么分配程序会执行一个称为空闲线程的特别线程。

  linux提供了两种独立进程调度算法: