关于pthread调度程序和优先级的问题

Questions about pthread scheduler and priority

本文关键字:问题 优先级 pthread 调度程序 关于      更新时间:2023-10-16

我在Debian 7上使用gcc c++ 4.7。我想为我的线程设置一些优先级。看来我得通过pthread来做了。我对pthread中的调度策略和优先级感到困惑。

Q1:

我在c++代码中使用sched_setscheduler将线程调度器设置为SCHED_RR。这个进程中的所有线程都使用这个实时调度器吗?或者我可以在一个进程中为不同的线程使用不同的调度器策略?

Q2:

线程优先级只在进程内生效还是跨多个进程生效?例:我有两个进程都使用SCHED_RR。一个线程的优先级为99,另一个线程的优先级为98。前一个线程是否比后者具有更高的优先级?如果线程使用不同的调度器,如何比较它们的优先级?

第三季:

我应该为调度程序的优先级使用什么"默认"数字?例:我使用下面的代码:

struct sched_param param;
param.sched_priority = default_priority;
sched_setscheduler(0, SCHED_RR, &param));

我应该为default_priority设置什么值?我的程序中有高优先级线程,普通优先级线程和低优先级线程。在1-99中,我应该用哪个数字来表示优先级?

第四季度:

进程优先级和线程优先级混合。例如,我可以使用nice来设置进程优先级。如果一个进程具有较低的进程优先级,但在我的代码中,我将其线程设置为高优先级。这是否覆盖进程优先级设置?

我用谷歌搜索并阅读了各种文档。我想我可以在这里回答我自己的问题了。

Pthread有一个争用范围属性。它可以是PTHREAD_SCOPE_SYSTEM或PTHREAD_SCOPE_PROCESS。它不需要在两者上都实现。Linux只支持PTHREAD_SCOPE_SYSTEM,这意味着来自所有进程的所有线程都相互竞争。此外,在Linux中,线程本质上是一个轻量级进程。进程调度程序对进程和线程的调度没有区别。

答案。Q1:同一进程中的线程可以有不同的调度策略和优先级。

第二季:线程在进程间竞争。

第三季度:我可以用任意的数。在调度中,从1到99的每个优先级都有自己的队列。

第四季度:nice值用于Linux默认SCHED_OTHER策略。当对线程使用SCHED_RR或SCHED_FIFO之类的实时策略时,nice值没有影响。因为SCHED_RR和SCHED_FIFO的最小优先级是1,而SCHED_OTHER的优先级只能是0。因此,具有实时策略的线程总是比非实时策略的线程具有调度首选项。

答案仅适用于Linux。其他操作系统如BSD、Solaris可能有不同的pthread实现。