我目前正在学习pthread,并且正在努力理解线程优先级和策略之间的关系。到目前为止我所知道的:
线程优先级是指示优先级的整数。此数字越高,操作系统对线程的优先级越高。
线程策略确定如何在具有共享优先级号的进程之间执行线程。 SCHED_RR和SCHED_FIFO是实时策略,除非发出明确的“睡眠”命令,否则它们将连续执行。因此,程序员在使用这些策略时必须非常仔细地编写代码。 SCHED_OTHER是一种循环策略,无法实时执行。
但是,假设我有以下情况(假设每个线程不使用“ sleep”命令)。
Thread 1: priority = 0, policy = SCHED_OTHER
Thread 2: priority = 1, policy = SCHED_OTHER
// would thread 1 run at all?
Thread 1: priority = 0, policy = SCHED_RR
Thread 2: priority = 1, policy = SCHED_RR
// would thread 1 run at all?
对于线程策略是否会影响线程优先级,或者线程优先级是否始终胜过策略,我感到困惑。
编辑:找到一个网页,消除了我的大部分困惑:https://computing.llnl.gov/tutorials/pthreads/man/sched_setscheduler.txt
答案 0 :(得分:1)
SCHED_RR
的文档说它与SCHED_FIFO
相同,除了在某些情况下两个或多个线程具有相同的静态优先级。
SCHED_FIFO
的文档清楚地表明,如果具有较高静态优先级的线程已准备好运行但未运行,并且如果一个或多个具有较低静态优先级的线程正在运行,则较低优先级之一线程将被优先使用优先级更高的线程。
在SCHED_RR情况下,线程1是否会全部运行?
这取决于。线程0在做什么?系统有多少个CPU?如果这些是系统中只有一个CPU的仅有两个线程,那么只要线程0不想运行,线程1就可以运行。
通常来说,当您使用静态优先级时,您希望优先级最高的线程完成最少的工作。高优先级的线程应将其大部分时间都花在等待某个事件上。然后,当事件发生时,线程应立即对其进行确认,如果需要某种后续计算,则可能会发出信号通知优先级较低的线程。
在SCHED_OTHER情况下,线程1是否会全部运行?
正如我的评论中所提到的,如果您谈论的是静态优先级(即,由sched_setattr()
系统调用设置的话),那么这个问题就没有意义了,因为在SCHED_OTHER策略都必须具有相同的静态优先级-零。