- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试为我正在进行的项目编写一个半可移植的线程类,在尝试设置线程的优先级时,我遇到了 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:请注意,我主要关心的是通过“可移植”方式获取有效范围,而不是进程优先级本身。谢谢!
最佳答案
您在 Ubuntu(以及任何其他基于 Linux 的操作系统)中为 SCHED_OTHER 获得的优先级范围是 [0,0],这是一个有效范围。这意味着所有这些非实时进程都具有相同的“优先级”,它们唯一的区别在于它们的“nice”值。
参见 nice系统调用以获取更多信息。我不确定 OpenBSD 的调度程序是如何工作的,但 nice() 系统调用在 POSIX 中,它应该在 UNIX 系统中得到支持。
关于c++ - SCHED_OTHER/SCHED_FIFO 的 pthread sched_get_priority_min/max 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657970/
我正在尝试为我正在进行的项目编写一个半可移植的线程类,在尝试设置线程的优先级时,我遇到了 pthread 世界中的一个难题。 给定以下代码: #include #include #include
我是一名优秀的程序员,十分优秀!