pthread SCHED_OTHER/SCHED_FIFO的sched_get_priority_min/max实现

txt*_*elp 5 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));
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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

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

在此先感谢,如果我不清楚或错误的话,请告诉我.

编辑1:请注意我的主要关注点是以"便携式"方式获得有效范围而不是流程优先级本身......谢谢!

Sha*_*oya 4

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

请参阅漂亮的系统调用以获取更多信息。我不确定 OpenBSD 的调度程序是如何工作的,但是 Nice() 系统调用是在 POSIX 中的,并且它应该在 UNIX 系统中受支持。