a市最牛的网站,深圳做网站案例,thinkphp做的网站源码,wordpress广告弹窗插件假如你是设计者#xff0c;你会设计怎样的调度机制呢#xff1f;
时间片
最简单的#xff0c;小学生都能想出来的一种#xff0c;每个 ready task#xff0c;按照一个固定的时间片轮流执行。 大家不要抢#xff0c;挨个儿排队执行。执行完时间片#xff0c;就排在后面…假如你是设计者你会设计怎样的调度机制呢
时间片
最简单的小学生都能想出来的一种每个 ready task按照一个固定的时间片轮流执行。 大家不要抢挨个儿排队执行。执行完时间片就排在后面。
这个方案的问题很明显就是实时性不佳。
就是一些高优先级的任务得不到及时处理。
很显然得加入 优先级。
时间片轮转的可抢占优先级
加入优先级。
分为可抢占、不可抢占
不可抢占就是当前的任务必须运行结束才能调度下一个最高优先级的执行。显然实时性有问题。可抢占一旦有新的高优先级任务出现就可以抢占当前任务实时性比较好。
到目前位置都没啥新奇的。
下面就开始放大招了。2.4内核
实时进程、普通进程
2.4 内核采用一个 叫 goodness 的函数来评估每个进程可运行的 “权重” wight 大小选取权重最大的执行即可。
这里 linux 又将进程分为两类实时进程、普通进程。 实时进程优先级理应很高所以他的优先级直接 权重 1000 的base, 然后加上实时进程内部的优先级。 普通进程的权重数量级为 几十 而已但是它的权重计算比较复杂涉及到动态优先级和静态优先级。
动态优先级、静态优先级
所谓的动态优先级就是 当前进程 时间片还剩多少个单位counter,很好理解就是还没开始运行的任务优先级肯定比 已经运行了一段时间的任务优先级高。毕竟出于公平的原则大家都得得到运行的时间才对。
这个counter 值没消耗完一个时间片就会被 减1.
所谓的静态优先级就是一个 叫 nice 的整数表示一个程序的谦让程度-20 ~ 19这玩意比较微妙数值越大表示约“谦让”也就是优先级越低这个是 nice 值是创建任务的时候就定下来的所以叫 “静态”优先级。
goodness
基于上面的综合因素考量2.4内核的 goodness 函数如下计算出来的 weight是评判调度顺序的唯一标准 伪代码逻辑很清晰 就是先判断进程的类型如果是 实时的优先级非常非常高。直接 weight 1000 开外了然后再加上实时进程各自的优先级。
接下来才是 普通的进程先看动态优先级如果 count 值为0 也就是时间片用完了那也直接退出优先级设置为最低的 -1. 否则呢先做个微调 if (p-mm this_mm || !p-mm) 这句话的意思是说p-mm 如果为NULL说明该进程无需用户空间比如内核线程则无需切换到用户空间如果 p-mm this_mm说明该进程的用户空间就是当前进程的用户空间。该进程完全有可能得到运行。对于上述两种情况需要适当给一些奖励因为他们的进程切换开销比较小。比较适合得到调度。
最后我们通过 weight 20 - p-nice加入静态优先级 nice越 “谦让”这个 weight 就越小。
至此我们就能根据 goodness 计算出每个 进程的 weight 值从大到小运行即可。
2.6内核的优化
上面 2.4内核 的调度策略有个最大的问题就是只有一个 就绪队列。对于时间片已经为 0 的依然存在于就绪队列中显然这是不合理的时间片耗尽的就应该滚出去先如果这个队列很长光遍历一遍就会耗费很多时间对于一些硬实时场景不太适合。
于是 2.6 内核采用了一种优化设计了两个队列一个 active 队列一个 expired 队列 看上面的解释很容易理解了。
这样就解决了单就绪队列导致的遍历时间过长的问题。
后来
等 2.6.23 之后就采用了 CFS 调度器去调度普通进程了实时进程还是用之前的办法。
待续。。。