SCHED_OTHER/SCHED_FIFO 的 pthread sched_get_priority_min/max 实现
Posted
技术标签:
【中文标题】SCHED_OTHER/SCHED_FIFO 的 pthread sched_get_priority_min/max 实现【英文标题】:pthread sched_get_priority_min/max implementation for SCHED_OTHER/SCHED_FIFO 【发布时间】:2012-05-18 18:33:59 【问题描述】:我正在尝试为我正在处理的项目编写一个半便携式线程类,并且在尝试设置线程的优先级时,我在 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_FF
或 SCHED_RR
的最小/最大值,因为这些值似乎为我遇到的各种 linux/unix 系统提供了有效范围,还是我完全错过了这一点?
提前致谢,如果我不清楚或有什么错误,请告诉我。
编辑 1:请注意,我主要关心的是通过“便携式”方式获得比进程优先级本身更多的有效范围。谢谢!
【问题讨论】:
【参考方案1】:在 Ubuntu(以及任何其他基于 Linux 的操作系统)中,SCHED_OTHER 的优先级范围是 [0,0],是有效范围。 这意味着所有这些非实时进程都具有相同的“优先级”,它们唯一的区别在于它们的“好”值。
有关更多信息,请参阅nice 系统调用。 我不确定 OpenBSD 的调度程序是如何工作的,但是 nice() 系统调用在 POSIX 中,它应该在 UNIX 系统中得到支持。
【讨论】:
感谢您的帮助!在查看了我的实际问题以及您提供的信息后,我意识到我需要重写我的问题,但您确实为我手头的问题提供了一个很好的方向!以上是关于SCHED_OTHER/SCHED_FIFO 的 pthread sched_get_priority_min/max 实现的主要内容,如果未能解决你的问题,请参考以下文章