pthread优先级和pthread策略有啥关系?

Posted

技术标签:

【中文标题】pthread优先级和pthread策略有啥关系?【英文标题】:What is the relationship between pthread priority and pthread policy?pthread优先级和pthread策略有什么关系? 【发布时间】:2019-11-11 19:52:44 【问题描述】:

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

线程优先级是一个整数,表示优先级。这个数字越高,线程被操作系统处理的优先级就越高。

线程策略决定了线程如何在具有共享优先级的进程中执行。 SCHED_RR 和 SCHED_FIFO 是持续执行的实时策略,除非发出明确的“睡眠”命令。因此,程序员在使用这些策略时必须非常小心地编写代码。 SCHED_OTHER 是一种非实时执行的循环策略。

但是,假设我有以下场景(假设每个线程不使用“睡眠”命令)。

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

【问题讨论】:

您说的是“优先级”,但您是在询问通过 linux setpriority() 系统调用设置的值吗?或者您是在询问通过sched_setattr() 系统调用设置的静态优先级SCHED_RR 是使用线程静态优先级的“实时”策略,而SCHED_OTHER 是使用setpriority() 值的“分时”策略,并且要求线程的静态优先级为零。 我在询问 pthread_setschedparam() 函数调用man7.org/linux/man-pages/man3/pthread_setschedparam.3.html SCHED_OTHER 的文档说该策略只能在线程的静态优先级为零时应用。所以如果“优先级”表示“静态优先级”,那么priority=1, policy=SCHED_OTHER就是一个无效的情况。 【参考方案1】:

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

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

线程 1 是否会运行 [在 SCHED_RR 案例中]?

这取决于。线程 0 在做什么?系统有多少个 CPU?如果在只有一个 CPU 的系统上只有这两个线程,那么只要线程 0 不想运行,就会允许线程 1 运行。

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

线程 1 是否会运行 [在 SCHED_OTHER 情况下]?

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

【讨论】:

以上是关于pthread优先级和pthread策略有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

pthread_join 和 pthread_mutex_lock 有啥区别?

使用 pthread 调度策略和优先级没有任何区别

NSOperationQueue 与 pthread 优先级

在强化学习中,最优策略和分段最优策略有啥区别?

不应该使用查询参数的 IT 策略有啥理由吗?

POSIX 线程 pthread_setschedparam