我在Debian 7上使用gcc c ++ 4.7。我想为我的线程设置一些优先级。看起来我必须通过pthread来做到这一点。我对调度程序策略和pthread中的优先级感到困惑。
Q1:
我在c ++代码中使用sched_setscheduler
将线程调度程序设置为SCHED_RR
。这个过程中的所有线程都会使用这个实时调度程序吗?或者我可以在一个进程中针对不同的线程使用不同的调度程序策略?
Q2:
线程优先级是仅在进程内部还是跨多个进程生效?例如。我有两个使用SCHED_RR
的进程。一个具有优先级为99的线程,另一个具有优先级为98的线程。前一个线程的优先级高于后者吗?如果线程使用不同的调度程序,如何比较它们的优先级呢?
Q3:
我应该使用什么“默认”号码作为调度程序的优先级?例如。我使用下面的代码:
struct sched_param param;
param.sched_priority = default_priority;
sched_setscheduler(0, SCHED_RR, ¶m));
我应该为default_priority
设置什么值?我的程序中有一些高优先级线程,普通优先级线程和一些低优先级线程。在1-99中,我应该使用多少个优先级?
Q4:
进程优先级和线程优先级混合。例如,我可以使用nice来设置进程优先级。如果一个进程具有较低的进程优先级,但在我的代码中,我将其线程设置为高优先级。这会覆盖流程优先级设置吗?
答案 0 :(得分:1)
我用Google搜索并阅读各种文件。我想我可以在这里回答我自己的问题。
Pthread具有争用范围属性。它可能是PTHREAD_SCOPE_SYSTEM或PTHREAD_SCOPE_PROCESS。它不需要在它们上实现。 Linux仅支持PTHREAD_SCOPE_SYSTEM,这意味着来自所有进程的所有线程都相互竞争。此外,在Linux中,线程本质上是一个轻量级进程。进程调度程序不会在调度中对进程和线程进行不同的处理。
答案。 Q1: 同一进程中的线程可以有不同的调度策略和优先级。
Q2: 线程跨进程竞争。
Q3: 我可以使用一些任意数字。每个优先级(从1到99)将在调度中拥有自己的队列。
Q4: nice值在Linux默认SCHED_OTHER策略中使用。当SCHED_RR或SCHED_FIFO等实时策略用于线程时,nice值无效。由于SCHED_RR和SCHED_FIFO的最小优先级为1,SCHED_OTHER的优先级只能为0.因此,具有实时策略的线程始终具有调度优先级而非非实时优先级。
答案仅适用于Linux。其他操作系统如BSD,Solaris可能有不同的pthread实现。