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
【问题讨论】:
您说的是“优先级”,但您是在询问通过 linuxsetpriority()
系统调用设置的值吗?或者您是在询问通过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 有啥区别?