5.进程调度

betball贝博app 进程 277 次浏览 没有评论

非抢占都任务模式下除非进程自己主动停止运行否则将一直运行。主动挂起自己的操作被称为“让步”

理想情况下进程做出让步,但是某些进程独占处理器的时间可以超出用户的预料。
一个坚决不做出让步的进程就可能导致系统崩溃。
出了Mac和Windows意外,绝大多数的操作系统都是抢占式的多任务系统。
  • 公平调度
  • 基本理念:进程调度的效果应如同系统具备一个理想的完美多任务处理器。
  • 调度策略:

    进程分为
  • IO消耗型:多数图形界面程序,网络IO程序
  • 处理器消耗型:时间大多用在执行代码上,除非被抢占则一直运行。调度器不应该经常让他们运行,策略往往是降低调度策略,延长运行时间。如MATLAB
  • XWindow服务既是IO消耗又是处理器消耗。
    调度策略需要在进程响应迅速和最大系统利用率(高吞吐)之间寻找平衡。需要采用非常复杂的算法。
    进程优先级的设置,Linux有两种不同的优先级限制
  • nice值:-20到+19 默认值为0 越大的nice意味着更低的优先级

  • MacOS中,nice值代表分配给进程时间片的绝对值

  • Linux中,nice值代表时间片的比例。  ps-el命令中NI一列就是进程对应的nice值

  • 实时优先级:可配置,范围为0-99

  • 数值越高的意味着优先级越高,任何实时进程的优先级都高于普通的进程。

  • 调度算法

    调度器类

    linux的调度器是以模块方式提供的,目的是允许不同类型的进程可以有针对性的选择调度算法。

    每个调度器都有一个优先级,按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级调度器类胜出去选择下一个要执行的程序。

    传统Unix系统的调度过程

    Unix系统中优先级以nice的形式输出给用户空间,但是在实际过程中会有很多问题产生。

    问题1.导致进程切换无法最优化进行。

    nice映射到时间片,必须把nice值对应到处理器的绝对时间,将导致进程切换无法最优化进行。
    举例说明

    nice值 时间片
    0
    100ms
    +20
    5ms

    若有两个同等低优先级(+20)的进程,虽然各自获得一半的处理器时间,但是每5ms就要进行一次上下文切换。

    若有两个同等普通优先级(0)的进程,虽然各自获得一半的处理器时间,但是每100ms就要进行一次上下文切换。

    一般来说高nice值(低优先级)的进程往往是计算密集型的后台进程,而低nice值(高优先级)的进程多是前台用户任务,由此后台任务频繁的切换,和初衷背道相驰。

    问题2.相对nice值和时间的关系

    nice值 时间片
    0
    100ms
    +1
    95ms
    +19
    10ms
    +20
    5ms

    如上表所示,nice值从0->1变化了5ms,+19->+20也是5ms,但是一个是后者是两倍的差异,也就是说把进程的nice值减一所带来的效果极大的取决于nice初始值。

    解决办法:nice成集合增加而非算数增加。

    问题3.时间片必须是整数倍

    上述的测试过程中时间片必须是定时器节拍的整数倍,限制了两个时间片的差异,且时间片还会随着定时器节拍改变。

    解决办法:采用新的度量机制将nice值到时间片的映射与定时器节拍分离开。

    问题4.为了优化交互任务而唤醒相关进程

    为了进程能更快的投入运行,对新唤醒的进程要提高优先级,即便时间片已经用尽了。上述办法可以提高交互性能的同时也给某些特殊的睡眠/唤醒用例一个玩弄调度器的后门,使得给定进程打破公平原则,获得处理器时间,损害系统中其他进程的利益。

    上述问题的实质问题为分配的绝对时间片导致了固定的切换频率,给公平性造成了很大变数。需要采用CFS对时间片分配方式进行根本性的重新设计;最好的方式分配给进程一个处理器使用比重,保证了进程调度中能够恒定的公平性,将切换频率置于不断变动中。

    公平调度

    基本理念:进程调度的效果应如同系统具备一个理想的完美多任务处理器。

    n个进程每个都能获得1/n的处理器时间,同时可以调度给无限小的时间周期,所以在任何可测量周期内,n个进程都有同样多的运行时间。近乎实现在每一段时间内同时运行两个进程,各自使用处理器一半的能力。

    但是上述的模型并非现实无法实现,而且每个进程运行无限小的时间周期也会因为进程调度损失一部分效率。

    CFS的做法是允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,则不再使用分配时间片的方法,而是在所有可运行进程总数基础上计算出一个进程应该运行多久而不是通过nice值来计算时间片。即为按比例进行分配时间片。nice值越高(低优先级)获得更低的处理器使用权中。

    每个进程都按权重在全部可运行进程中所占比例的“时间片”来运行,为了准确计算时间片,CFS为完美多任务中的无限小调度周期的近似值设立了一个目标,并称作“目标延迟”,越小的调度周期将带来越好的交互性,同时也接近完美的多任务。

    必须承受更高的切换代价和更差的系统总吞吐能力,如假定目标延迟为20ms:

  • 有2个相同优先级的可运行任务,每个任务在被其他任务抢占前运行10ms
  • 有4个相同优先级的可运行任务,每个任务在被其他任务抢占前运行5ms
  • 有20个相同优先级的可运行任务,每个任务在被其他任务抢占前运行1ms
  • 当任务数量趋于无限,那么每一个时间片获得的时间片都将趋近于0,造成了不可接受的内存消耗。所以CFS引入了每个进程获得时间片的底线——最小粒度

    系统中通常最多只有几百个进程,所以一般情况下该最小粒度可以接受。

    发表评论

    邮箱地址不会被公开。

    Go