pthread SCHED_OTHER / SCHED_FIFO的sched_get_priority_min / max实现

时间:2012-05-18 18:34:00

标签: c++ linux cross-platform pthreads

我正在尝试为我正在处理的项目编写一个半可移植的线程类,在尝试设置线程的优先级时,我在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的有效值。

由于我主要关注的是只尝试获得有效的优先级值范围(以确保用户输入的值不是太高或太低),我是否应该不关心当前进程的优先级并且只得到SCHED_FFSCHED_RR的最小值/最大值,因为这些值似乎给出了我遇到的各种linux / unix系统的有效范围,或者我是否完全忽略了这一点?

提前致谢,如果我不清楚或误报,请告诉我。

编辑1 :请注意我的主要关注点是“便携式”获取有效范围的方式超过了流程的优先级......谢谢!

1 个答案:

答案 0 :(得分:4)

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

有关详细信息,请参阅nice系统调用。 我不确定OpenBSD的调度程序是如何工作的,但是nice()系统调用是在POSIX中,它应该在UNIX系统中受支持。