调度程序运行队列

调度程序维护一个所有就绪等待分派的线程的运行队列。

下图象征性描述了运行队列。

图 1。 运行队列。 该插图简单地显示了低优先级值的线程如何在高优先级值的线程之前通过运行队列。 可能的优先级值范围从 0 到 127,这与运行队列的总数为 128 直接相关。
运行队列

具有优先级的所有可分派线程在运行队列中占有一定的位置。

调度程序的基本可分派实体是线程。 AIX® 维护 256 个运行队列。 运行队列与每个线程优先级字段可能值的范围(从 0 到 255)直接相关。 这个方法使调度程序更容易确定哪个线程最先运行。 调度程序无需搜索一个完整的运行队列,只需要考虑一个掩码,该掩码的某一位启用后可表示在相应的运行队列中存在就绪等待运行的线程。

线程的优先级值快速而频繁地变更。 持续的变动归因于调度程序重算优先级的方法。 然而,这并不适用于固定优先级的线程。

AIX V 6.1开始,每个处理器都有一个每个节点的运行队列。 性能工具中报告的运行队列值将是每个运行队列中所有线程的总和。 让每个处理器都有自己的运行队列可节省分派锁的开销并改善总体的处理器相似性。 线程通常会更加趋向于留在同一处理器中。 如果因为另一处理器(不同于当前运行执行线程的处理器)上的事件使某线程变得可执行,那么该线程就会立即被分派(只要有空闲的处理器即可)。 在可以检查处理器状态(例如在该线程的处理器上的中断)之前不会出现抢占。

在具有多个运行队列的多处理器系统中,可能出现瞬间的优先级倒置。 在任何一个时间点都可能出现这种情况:某个运行队列能使若干线程具有的优先级比另一运行队列更有利。 AIX 具有随时间推移进行优先级均衡的机制,但如果需要严格优先级 (例如,对于实时应用程序) ,那么存在名为 RT_GRQ 的环境变量。 将环境变量 RT_GRQ 设置为 ON 会导致该线程位于全局运行队列中 在该情况下,将搜索全局运行队列以查看哪个线程具有最高优先级。 这可以改善中断驱动线程的性能。 如果 schedo 命令的 fixed_pri_global 参数设置为 1 ,那么以固定优先级运行的线程将放在全局运行队列上。

运行队列中的线程平均数可在命令 vmstat 输出的第一列中看到。 如果用处理器数去除这个数,结果是每个处理器上运行线程的平均数。 如果这个值大于 1,那么这些线程必须等待轮到它们使用处理器(这个数越大,性能延迟可能越明显)。

当某线程移到运行队列的末端时(例如,当线程在时间片的末尾拥有控制权时),它会移动到具有相同优先级值的队列中最后一个线程之后的位置上。