在上一篇博文中进行了原理性分析之后,本文举出一个实例进行分析(假设所有的cpu处于同一个cpuset中)。

当前系统中cpu的情况如下如所示:

wKioL1OBvt-RtTbiAAFQFC_mGps047.jpg

说明:0~99代表的是进程的实时优先级,cpu的状态与该cpu上最高实时进程的优先级+2.

在linux系统中用一个2维map表示各个cpu的状态,其中1个维度代表了-1~99这几个状态,另一个维度代表了处于该状态下的cpu。那么我们不难计算出当前系统中所有cpu的状态为:

wKioL1OBw0Xyp_V5AACg_sd2plQ041.jpg

假设发生如下事件:

1、cpu0上有一个高优先级的任务被唤醒(T3)

2、cpu3的T7执行完毕

发生事件1,触发一个push操作,因为T3任务的优先级高于当前进程T2,那么T2必然被换出,那么换出的T2应该放置到哪个cpu上呢?

经分析发现,最低优先级的是C1<T2,所以,可以执行push操作。完成push操作之后,cpu0的rq还是处于超载状态,如下图所示:

wKioL1OBxCKxyBgRAAFOTeuw8Oo278.jpg

虽然此时c1仍旧处于超载状态,但是没有满足条件的cpu可以让其执行push操作。此时cpu的状态为:

wKioL1OBxLGyUhmZAAChQQYS5gU330.jpg

此时发生事件2,会发生push操作,因为cpu0和cpu1处于超载状态所以push操作会在cpu0和cpu1上发生生。

对于rq0而言,T1>T6,则满足push的条件,

wKioL1OBxnOQdWttAAFIoLITPaw837.jpg

虽然此时T6被换出,但是因为T6不满足push条件(其他cpu的状态都高于T6),因此此时T6只能呆在cpu3上。接下来,C1仍然满足push条件,继续执行push操作。

wKiom1OBx5bgsa0wAAFGIilKW3A895.jpg

从这里我们发现,经过push/pull操作,使得cpu3的负载更加严重了。不过随着其他cpu上的rq逐渐变为空,cpu3的超载将很快得到缓解。