SCHED_OTHER / SCHED_FIFO的pthread sched_get_priority_min / max实现

我正在为我正在编写的一个项目编写一个半可移植的线程类,并且在设置线程的优先级时,遇到了pthread世界中的一个难题。

给出以下代码:

#include <stdio.h> #include <unistd.h> #include <sched.h> main() { printf("Valid priority range for SCHED_OTHER: %d - %d\n", sched_get_priority_min(SCHED_OTHER), sched_get_priority_max(SCHED_OTHER)); printf("Valid priority range for SCHED_FIFO: %d - %d\n", sched_get_priority_min(SCHED_FIFO), sched_get_priority_max(SCHED_FIFO)); printf("Valid priority range for SCHED_RR: %d - %d\n", sched_get_priority_min(SCHED_RR), sched_get_priority_max(SCHED_RR)); } 

在OpenBSD中,这将打印下面的内容:

 Valid priority range for SCHED_OTHER: 0 - 31 Valid priority range for SCHED_FIFO: 0 - 31 Valid priority range for SCHED_RR: 0 - 31 

在Ubuntu中它产生这样的:

 Valid priority range for SCHED_OTHER: 0 - 0 Valid priority range for SCHED_FIFO: 1 - 99 Valid priority range for SCHED_RR: 1 - 99 

我的问题更多的是关于SCHED_OTHER优先。 根据我所能得到的所有文档(sched.h,google,SO,SE),我的理解是应该尝试检索当前进程的进程优先级,并根据该进程分配优先级。 这很好,除了检索SCHED_OTHER的最小/最大值。 由于调度是依赖于系统的,所以如果我将当前进程的优先级设置为SCHED_OTHER并尝试获取Ubuntu(或其他我遇到的Linux系统)上的最小/最大值,那么我的值将是0-0,将不会尝试设置有效的优先级范围。 但是,在其他类Unix系统(OpenBSD等)上,我确实获得了有效的SCHED_OTHER值。

由于我主要关心的只是试图获得一个有效的优先级值范围(为了确保用户不会input太高或太低的值),我是否应该甚至不打扰当前进程的优先级,只能得到最小/最大值SCHED_FFSCHED_FF值,因为这些值似乎给我所遇到的各种linux / unix系统的有效范围,或者我完全错过了这一点?

如果我不清楚或错误的东西,请提前致谢。

编辑1 :请注意,我主要关心的是“便携式”的方式获得有效范围比过程的优先级本身..谢谢!

Solutions Collecting From Web of "SCHED_OTHER / SCHED_FIFO的pthread sched_get_priority_min / max实现"

Ubuntu(以及任何其他基于Linux的操作系统)的SCHED_OTHER的优先级范围是[0,0],这一个有效的范围。 这意味着所有这些非实时进程都具有相同的“优先级”,唯一的区别在于它们的“好”值。

查看更好的系统调用了解更多信息。 我不确定OpenBSD的调度程序是如何工作的,但是nice()系统调用在POSIX中,它应该在UNIX系统中支持。