在上一篇博文中进行了原理性分析之后,本文举出一个实例进行分析(假设所有的cpu处于同一个cpuset中)。
当前系统中cpu的情况如下如所示:
说明:0~99代表的是进程的实时优先级,cpu的状态与该cpu上最高实时进程的优先级+2.
在linux系统中用一个2维map表示各个cpu的状态,其中1个维度代表了-1~99这几个状态,另一个维度代表了处于该状态下的cpu。那么我们不难计算出当前系统中所有cpu的状态为:
假设发生如下事件:
1、cpu0上有一个高优先级的任务被唤醒(T3)
2、cpu3的T7执行完毕
发生事件1,触发一个push操作,因为T3任务的优先级高于当前进程T2,那么T2必然被换出,那么换出的T2应该放置到哪个cpu上呢?
经分析发现,最低优先级的是C1<T2,所以,可以执行push操作。完成push操作之后,cpu0的rq还是处于超载状态,如下图所示:
虽然此时c1仍旧处于超载状态,但是没有满足条件的cpu可以让其执行push操作。此时cpu的状态为:
此时发生事件2,会发生push操作,因为cpu0和cpu1处于超载状态所以push操作会在cpu0和cpu1上发生生。
对于rq0而言,T1>T6,则满足push的条件,
虽然此时T6被换出,但是因为T6不满足push条件(其他cpu的状态都高于T6),因此此时T6只能呆在cpu3上。接下来,C1仍然满足push条件,继续执行push操作。
从这里我们发现,经过push/pull操作,使得cpu3的负载更加严重了。不过随着其他cpu上的rq逐渐变为空,cpu3的超载将很快得到缓解。
转载于:https://blog.51cto.com/4989715/1416902