进程和线程的优先级

优先级管理工具处理进程的优先级。

AIX® V 4 中,进程优先级是线程优先级的前兆。 当调用 fork() 子例程时,会创建一个进程和一个要在其中运行的线程。 线程的优先级归结于进程。

内核为每个线程维护一个优先级值(有时称为调度优先级)。 优先级值 是一个正整数且与关联线程的重要性的变化方向相反。 也就是说,较小的优先级值表示一个相对重要的线程。 当调度程序寻找线程进行分派时,它选择具有较小优先级值的可分派线程。

线程可以有固定的优先级或不固定的优先级。 优先级固定的线程的优先级值是一个常量,而优先级不固定的线程的优先级值 根据用户线程最小优先级级别(常量 40)、线程的 nice 值(缺省值是 20,可随意由 nicerenice 命令进行设置)和其处理器使用的损失而变化。

线程的优先级可以固定成某个值,如果用 setpri() 子例程设置(固定)它们的优先级的话,它们可以具有小于 40 的优先级值。 这些线程不会受到调度程序重算算法的影响。 如果它们的优先级值固定且小于 40,这些线程将在可以运行所有用户线程之前运行和完成。 例如,一个具有固定值 10 的线程将在具有固定值 15 的线程之前运行。

用户可以应用 nice 命令使线程的不固定优先级变低。 系统管理员可将一个负的 nice 值应用给线程,这样就给了它较好的优先级。

下图显示了一些可以更改优先级值的方法。

图 1。 如何确定优先级值。 插图显示了如何能在执行过程中或应用了 nice 命令之后更改线程调度优先级值。 优先级值越小,线程优先级越高。 开始时,nice 值缺省为 20 而基本优先级缺省为 40。 执行中发生了处理器损失后,nice 的值仍然保持 20,基本优先级仍然保持 40。 在运行 renice —5 命令后及使用和以前相同的处理器 (CPU) 的情况下,nice 值现在是 15 而基本优先级仍然是 40。 在以 50 的值发出子例程 setpri() 之后,固定优先级现在是 50 而 nice 值和处理器 (CPU) 的使用不相关。
如何确定优先级值

线程的 nice 值在创建线程时设置并且在线程的整个生命期中都是常量,除非用户通过 renice 命令或 setpri() setpriority()thread_setsched()nice() 系统调用明确更改了它的值。

处理器损失是一个整数,它通过线程最近的处理器使用来计算。 如果每次在一个 10 ms 的时钟滴答结束时线程受处理器控制,那么最近的处理器使用值近似加 1,直到达到最大值 120。 每个滴答的实际优先级损失随着 nice 的值增加。 所有线程的最近处理器使用值每秒重算一次。

结果如下:

  • 不固定优先级的线程的优先级随着其最近处理器使用的增加而变低,反之亦然。 这暗示一般来讲,某线程最近被分配的时间片越多,那么它被分配下一个时间片的可能性越小。
  • 不固定优先级的线程的优先级随着其 nice 值的增加而变低,反之亦然。
注: 通过使用多个处理器运行队列及其负载均衡机制, nicerenice 值可能不会对线程优先级产生预期的影响,因为较少的优先优先级可能具有等于或大于优先优先级的运行时间。 需要 nicerenice 的预期影响的线程应该放在全局运行队列上。

可以使用命令 ps 显示进程的优先级值、nice 值和短期的处理器使用值。

请参阅 控制微处理器争用 ,以获取有关使用 nicerenice 命令的更详细讨论。

请参阅 Thread-Priority-Value 计算,以获取处理器损失计算和最近处理器使用率值衰减的详细信息。

AIX 工作负载管理器 也使用优先级机制来实施处理器资源管理。 由于在 工作负载管理器 下分类的线程具有由 工作负载管理器管理的优先级,因此它们的优先级行为可能与未在 工作负载管理器下分类的线程不同。