pthread优先级和pthread policy有什么关系?

What is the relationship between pthread priority and pthread policy?

我目前正在学习 pthreads 并且正在努力理解线程优先级和策略之间的关系。目前我所知道的:

线程优先级是一个表示优先级的整数。这个数字越大,线程被 OS 处理的优先级就越高。

线程策略决定线程如何在具有共享优先级数的进程中执行。 SCHED_RR 和 SCHED_FIFO 是持续执行的实时策略,除非发出明确的 "sleep" 命令。因此,程序员在使用这些策略时必须非常小心地编写代码。 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

SCHED_RR 的文档说它与 SCHED_FIFO 相同,除非在某些情况下两个或多个线程具有相同的静态优先级。

SCHED_FIFO 的文档清楚地表明,如果具有较高静态优先级的线程已准备好 运行 但未 运行ning,并且如果一个或多个具有较低静态优先级的线程静态优先级为 运行ning,则优先级较低的线程之一将被优先级较高的线程抢占。

would thread 1 run at all [in the SCHED_RR case]?

这取决于。线程 0 在做什么?系统有多少个CPU?如果那些是只有一个 CPU 的系统上仅有的两个线程,那么只要线程 0 不想 运行.

,线程 1 将被允许 运行

一般来说,当您使用静态优先级时,您希望最高优先级的线程做最少的工作。高优先级线程应该花费大部分时间 等待 某个事件。然后当事件发生时,线程应该立即确认它,然后如果需要某种后续计算,可能会向优先级较低的线程发出信号。

would thread 1 run at all [in the SCHED_OTHER case]?

如我的评论所述,如果您谈论的是 静态优先级 (即,由 sched_setattr() 系统调用设置,那么这个问题毫无意义,因为根据 SCHED_OTHER 策略调度的线程都需要具有相同的静态优先级——零。