5

我正在尝试为我正在处理的项目编写一个半便携式线程类,并且在尝试设置线程的优先级时,我在 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,它赢了不适用于尝试设置有效的优先级范围。SCHED_OTHER但是,我确实在其他类 unix 系统(OpenBSD 等)上获得了有效值。

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

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

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

4

1 回答 1

4

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

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

于 2012-05-19T09:19:53.340 回答