多任务
多任务系统可以划分为两类:
- 非抢占式多任务
除非进程自己停止, 否则它会一直执行
- 抢占式多任务
由调度程序决定什么时候停止一个进程的运行, 以便其他进程能够得到运行的机会, 这个强制的挂起动作就叫做抢占
调度策略通常通常在两个矛盾的目标中间寻找平衡
- 进程的响应迅速
- 最大系统利用率
进程优先级
用户和系统都可以通过设置进程的优先级来影响系统的调度
Linux系统采用了两种不同的优先级范围:
- nice值
范围是-20到+19, 默认值是0, 越大的nice值意味着更低的优先级, 低nice值得进程可以过得更多的处理器时间 - 实时优先级
默认它的变化范围是0到99, 越高的实时优先级意味着进程优先级越高, 任何实时的优先级都高于普通的进程
时间片
是一个数值, 表示进程在被强占前所能持续运行的时间, 调度策略必须规定一个默认的时间片, 但是这并不是一个简单的事情,
过长: 导致系统对交互的响应表现欠佳, 让人觉得无法并发执行应用程序
过短: 明显增加进程切换带来的处理器耗时
默认时间片
IO消耗型: 不需要更多的时间片
处理器消耗型: 希望越长的时间片
所以默认的时间片很短, 10ms
Linux的CFS调度器并没有直接分配时间片到进程, 它是将处理器的使用比划分给了进程, 这样一来进程所获得的的处理器时间和系统的负载密切相关
这个比例进一步还会受进程nice值得影响, nice值作为权重将调整进程所使用的处理器时间比
是否抢占:
- 优先级
- 是否有时间片
在Linux CFS 调度器中, 抢占时机取决于新的可运行程序消耗了多少处理器使用比, 如果消耗的使用比比当前进程小, 则新进程立刻投入运行, 抢占当前进程, 否则, 推迟其运行
CFS
允许每个进程运行一段时间, 循环轮转, 选择运行最少的进程作为下一个进程
在所有可运行进程总数基础上计算出一个进程应该运行多久, 而不是依靠nice值来计算时间片,
nice值在CFS中作为进程获取得的处理器运行比的权重, 越高的nice值或者更低的处理器使用权重
每个进程都按其权重在全部可运行进程中所占比例的时间片来运行, 为了计算准确的时间片, CFS为完美多任务中的无限小调度周期的近似值设立了一个目标, 这个目标成为目标延迟
,
越小的调度周期将带来越好的交互性, 同时也跟接近完美的多任务接受更高的切换代价和更差的系统吞吐
相同nice值
我们假定 目标延迟
是20ms, 如果有两个同样优先级的程序, 每个人物被其他抢占前可以运行10ms, 如果4个 每个5ms, 如果无限大, 每个运行的时间片趋于0
由此产生了 最小粒度
默认的情况下这个值是1ms
不同nice值
我们来看看具有不同的nice值得两个可运行程序
目标延迟: 20ms
A: nice值是0, B:nice值是5
B是A的1/3 ?
A: 20 * 3 / 4 = 15
B: 20 * 1 / 4 = 5
vruntime
CFS使用vruntime变量来记录一个程序到底运行了多长时间以及它还应该再运行多久
进程选择
选择具有最小vruntime的任务
CFS采用红黑树来组织可运行队列, 并利用其迅速找到最小的vruntime值进程
所有进程最左边的那个叶子节点,
抢占
从一个可执行进程切换到另一个可执行进程, 由定义在kernel/sched.c中的context_switch函数负责处理
保存,恢复栈信息和寄存器信息
网友评论