chapter02_进程与线程_4_调度

  • 许多适用于进程调度的算法也适用于线程调度,因此一并来讨论

  • 进程切换的代价比较高,需要__从用户态切换到内核态__,并且要__保存当前进程的状态__

  • 进程的分类

    计算密集型: 绝大多数时间花费在计算上

    IO密集型: 绝大多数时间花费在等待IO上

    随着CPU速度的提高,越来越多的进程由计算密集型转化为IO密集型

  • 需要进行调度的时机

    1° 创建一个新的进程后

    2° 一个进程退出后

    3° 一个进程阻塞在IO或信号量或其他原因时

    4° IO中断发生时

  • 调度算法的大致分类

    非抢占式调度算法: 每个进程(线程)一直运行,直至它被阻塞或主动让出

    抢占式调度算法: 每个进程要么运行到进程结束,要么运行到分配的时段的最大值,时钟中断到来时进行重新分配

  • 采用哪种调度算法,考虑的是不同环境下的需求

  • 调度算法运行环境的大致分类

    (1) 批处理系统

    1° 特点: 运行周期性的作业,不会出现用户的短请求

    2° 尽可能使用__非抢占式调度算法__ 或 长周期的抢占式调度算法,避免进程频繁切换

    (2) 交互式用户环境(服务器也属于此类)

    1° 特点: 有多个用户的请求

    2° 尽可能使用 抢占式调度算法

    (3) 实时系统

    1° 特点: 相比交互式用户环境,实时系统只会运行那些用来推进现有应用的程序

    2° 不是很需要进行抢占式

  • 调度算法的目标

    (1) 目标

    1° 公平性。 保证相似优先级的进程得到相似的服务,不同类型的进程采用不同方式处理

    2° 保持系统的所有部分尽可能忙碌

    (2) 评价指标

    批处理系统

    I. 吞吐量: 每小时完成的作业数量

    II. 周转时间: 从一个批处理作业提交到它彻底完成所用的__平均时间__

    III. CPU利用率: 一段时间内CPU工作的平均时间与总时间的比值

    三个指标未必能同时达到最优,它们常常是矛盾的

    交互式系统

    I. 最小响应时间: 从发出命令到命令得到响应所需的时间

    均衡性问题:对于不同的活动,用户期望的响应时间是不一样的。所以对于用户认为应该快速执行的活动,应该尽可能保证短的响应时间

    实时系统

    满足绝大多数的__截止时间__要求(例如一个实时播放音频的系统,如果总是不能满足截止时间要求,那么音质会严重下降)

    为了达到实时系统的截止时间要求,需要有高度的可预测性

  • 批处理系统的调度算法

    (1) 先来先服务

    1° 操作

    每个进程只要被调度,就运行到它结束或阻塞;

    先来的进程先被调度;

    如果进程被阻塞后又恢复,那么它将成为最后到来的进程重新排队

    2° 非抢占式

    (2) 最短作业优先

    1° 操作

    每个进程只要被调度,就运行到它结束或阻塞;

    同时有一批进程需要调度时,按照作业的时间长短进行排序,作业时间短的进程排序在前优先被调度

    2° 非抢占式

    只有在所有的作业都可同时运行的情况下,最短作业优先算法才是最优解。实际情况很难达到

    (3) 最短剩余时间优先

    1° 操作

    每个进程只要被调度,就运行到它结束或阻塞;

    每次需要调度时,都统计它们的剩余运行时间(因为有的进程是阻塞后恢复的,剩余运行时间≠总运行时间),剩余时间短的进程排序在前优先被调度

    2° 非抢占式

  • 交互式系统的调度算法

    适用于个人PC、服务器等

    (1) 轮转调度

    1° 操作

    每个进程被分配一个__时间片__;

    如果进程在时间片到来之前结束或阻塞,则CPU进行切换;

    如果时间片到来时进程未结束, 则剥夺该进程的CPU进行再分配

    时间片长度的选取

    若时间片长度太短 --> 进程频繁切换,而切换进程需要代价,造成CPU效率降低;

    若时间片长度太长 --> 短请求的响应时间过长

    经验规律是时间片长度为20-50ms

    3° 抢占式

    (2) 优先级调度

    1° 操作

    和__轮转调度__相同,但是引入了优先级系统,优先级高的进程先被调度

    解决低优先级进程"饥饿"问题的办法

    I. 每个时钟中断发生时,降低当前进程的优先级,使得低优先级进程有机会被调度

    II. 设置每个进程连续允许运行的最大时间片

    动态设定进程优先级的办法

    对于某个进程A,若在上一个时间片中它占据CPU的时间比例为f,则将它的优先级置为 1/f

    这样做的结果是: IO密集型的进程会被优先调度(这是我们希望看到的结果,因为IO密集型的进程只需要占用一点点的CPU时间,接下来它就去等待IO了,CPU空出来可以交给其他计算密集型的进程使用)

    4° 轮转调度和优先级调度的结合

    首先通过种种方式(静态、动态),确定所有进程的优先级级别;

    对于不同级别的进程,采用优先级调度;

    对于相同级别, 采用轮转调度。

    (但是要注意"饥饿"问题)

    5° 抢占式

    (3) 多级队列

    1° 操作

    和__轮转调度__相同,但是不同进程分配的时间片数量不同;

    首先将进程分为 终端响应, IO操作, 短时间片型, 长时间片型几种类型(只是一种分类方式),它们的优先级依次降低;

    优先级高的进程优先被执行,但是运行的时间片数量少;优先级低的进程后被执行,但是运行的时间片数量多

    2° 目标

    优先级高的进程是IO密集型进程,它们应该优先被执行,但是由于它们占有CPU的时间短,因此需要经常切换,所以要分配少的时间片;

    优先级低的进程是计算密集型进程,不应该被频繁切换,所以要分配数量多的连续时间片

    (4) 最短进程优先

    1° 让运行时间短的作业先被调度

    2° 确定运行时间的方法

    根据已经发生的命令的执行时间t来预测

      Tn = aTn-2 + (1-a)Tn-1
    

    (5) 保证调度

    1° 如果有n个进程,保证调度的目标是保证每个进程获得 1/n的CPU时间

    2° 操作

    统计每个进程自创立以来用了多少CPU时间,再计算应该获得的CPU时间,两者相除作为优先级

    (6) 彩票调度

    1° 类似于俄罗斯轮盘赌,给重要的进程分配更多的彩票,让它们有更大的概率被调度

  • 实时系统中的调度

    (1) 可调度条件

    设有m个周期事件, 每个时间以Pi的周期发生,处理一个时间需要的CPU时间是Ci, 若满足

       m
       Σ  Ci/Pi ≤ 1
      i=1
    

    则可以进行调度

    (2) 调度算法: 在后面某章的内容中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值