关于pthread调度程序和优先级的问题
Questions about pthread scheduler and priority
我在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, ¶m));
我应该为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实现。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在C++中打印对的优先级队列的所有值时出现问题
- 运算符优先级 括号问题
- 关于使用我自己创建的类使用优先级队列的问题
- 使用自定义比较器声明C++优先级队列的问题
- visual C++:简单的运算符优先级问题或其他问题
- ActiveMQ 3.8.3 (CPP) 优先级备份的问题不起作用
- C++迭代器运算符优先级问题 *it.method() vs (*it).method() vs it->method()
- 在c++中使用用户定义对象的优先级时遇到问题
- C++ 我在设置我创建的类的优先级队列时遇到问题
- 优先级队列 - 关于声明的这个 C++ 代码有什么问题?
- 关于pthread调度程序和优先级的问题