调度原理
最大限度地利用处理器时间,只要有可以执行的进程,那么就总会有进程正在执行。
多任务系统
- 抢占式多任务
- 非抢占式多任务
进程分类
- IO消耗型:进程的大部分时间用来提交I/O请求或是等待I/O请求。
- 处理器消耗型:进程的大部分时间在执行代码
进程优先级
根据进程的价值和其对处理器的时间需求对进程进行分级。
Linux采用了两种优先级范围:
- nice值,范围[-20,19],nice值越大,优先级越低。nice值代表的是时间片的比例。在Mac OS X中,进程的nice值代表分配给进程的时间片
- 实时优先级,范围[0,99],数值越大,优先级越高。任何实时优先级都大于普通进程。
时间片
分配给每个可运行进程的处理器时间段。
注意:现在操作系统对程序运行都采用了动态时间片计算的方式,并且引入了可配置的计算策略。Linux的“公平”调度算法本身并没有采取时间片来达到公平调度。
Linux调度算法
Linux调度算法中,Linux调度器是以模块的方式提供的,这种模块化结构叫做调度器类。
每个调度器都有一个优先级,基础调度器(<kernel/sched/core.c>)会按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出。
- 完全公平调度(CFS):一个针对普通进程的调度类。(SCHED_NORMAL)<kernel/sched/fair.c>Linux的CFS调度器没有规定时间片的大小,
通过nice值作为权重调整处理器的使用比,nice值越小的进程被赋予高权重,高优先级,抢得更多的处理器时间使用比。
最后通过计算(线程的处理器使用比*总处理器时间)获取每个进程的处理器时间。抢占时机是当新进程消耗的处理器使用比小于当前的进程,则新进程立刻投入运行,抢占当前进程。还设置了每个进程获得的时间片底线(最小粒度),默认值是1ms,为了避免可运行任务数量趋于无限,他们各自获取的处理器使用比和时间片都将趋于0,进程切换开销将是不可接受的。
本文同步分享在 博客“世至其美”(other)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/InnoPointer/blog/4953791