我正在尝试为我正在从事的项目编写一个半可移植线程类,在尝试设置线程的优先级时,我遇到了 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_FF
or SCHED_RR
因为这些值似乎为我遇到的各种 linux/unix 系统提供了有效范围,或者我完全错过了这一点?
提前致谢,如果我不清楚或有误述,请告诉我。
EDIT 1:请注意,我主要关心的是一种“便携式”方式来获取比进程优先级本身更多的有效范围。谢谢!