如何增加 pthreads 中的线程优先级?
- 2024-10-17 08:47:00
- admin 原创
- 67
问题描述:
我在 Linux 中使用 pthread。我想通过设置参数来提高线程优先级sched_param.priority
。但是,我在网上找不到太多关于我可以设置的线程优先级范围或线程优先级描述的信息。
另外,我想知道相对线程优先级,因为我不想将线程优先级设置得太高,导致操作系统停止运行。有人能帮我吗?
解决方案 1:
默认的 Linux 调度策略是SCHED_OTHER
,它没有优先级选择,但是nice
可以在策略内部调整级别。
您必须使用函数更改为另一个调度策略pthread_setschedparam
(另请参阅man sched_setscheduler
)
“正常”调度策略:(来自sched_setscheduler(2)
)
SCHED_OTHER the standard round-robin time-sharing policy;
SCHED_BATCH for "batch" style execution of processes; and
SCHED_IDLE for running very low priority background jobs.
实时调度策略:
SCHED_FIFO a first-in, first-out policy; and
SCHED_RR a round-robin policy.
就您而言,也许您可以使用SCHED_BATCH
,因为这不需要 root 权限。
警告:错误使用实时调度策略可能会挂起您的系统。这就是为什么您需要 root 权限才能执行此类操作。
为了确定您的机器能够执行哪些操作,您可以使用包装chrt
中的工具util-linux
。
例如:
$ chrt -m
SCHED_OTHER min/max priority : 0/0
SCHED_FIFO min/max priority : 1/99
SCHED_RR min/max priority : 1/99
SCHED_BATCH min/max priority : 0/0
SCHED_IDLE min/max priority : 0/0
减少浪费时间的一种方法(我经常使用):
alias batchmake='time chrt --batch 0 make --silent'
在保留用户权限的同时,这将其提高make
了 15%(就我而言)。
编辑:引入nice
、SCHED_BATCH
和SCHED_IDLE
工具chrt
。为了准确起见!:)
解决方案 2:
levif 的当前答案(推荐 SCHED_BATCH)对于 Linux 上当前的 NPTL 线程实现不正确(您可以通过运行“getconf GNU_LIBPTHREAD_VERSION”来检查您的内核具有哪种实现)。
在当今的内核中,只有实时调度策略允许设置 sched_priority - 对于非实时策略(SCHED_OTHER、SCHED_BATCH 和 SCHED_IDLE),它始终为 0。对于非实时策略,您唯一的选择是设置“nice”值,例如通过 setpriority()。但是,设置“nice”后预期的确切行为并没有很好的规范,并且过去该行为因内核版本而异(尽管它已经稳定了一段时间)。对于当前的 Linux 内核,“nice”具有与优先级非常相似的强大效果,因此您可以几乎互换使用它。为了增加线程的调度频率,您需要降低“nice”值。这需要 CAP_SYS_NICE 功能(通常是 root,但不一定,请参阅http://man7.org/linux/man-pages/man7/capabilities.7.html和http://man7.org/linux/man-pages/man3/cap_set_proc.3.html)。
事实上,SCHED_BATCH 的设计目的与提问者所要求的情况相反:它设计用于 CPU 密集型、长时间运行的作业,这些作业可以以较低的优先级运行。它告诉调度程序稍微惩罚线程的唤醒优先级。
另外回答之前的一个评论。是的,坏消息是 POSIX.1 规范说“nice”会影响进程,而不是单个线程。好消息是 Linux 线程实现(NPTL 和原始 Linux 线程)违反了规范并允许它影响单个线程。我发现这经常在手册页的“BUGS”部分中被指出,这很有趣。我想说这个错误是在 POSIX.1 规范中,它应该允许这种行为,而不是在那些尽管有规范却被迫提供它并且故意这样做的实现中。换句话说 - 不是一个错误。
其中大部分内容在 sched(7) 手册页中有详细说明(由于某种原因,该手册页未在我的 Fedora 20 系统上提供):
http ://man7.org/linux/man-pages/man7/sched.7.html
如果您真的想影响 sched_priority,您可以查看实时策略,例如 SCHED_RR)。
解决方案 3:
POSIX 定义了一个查询,因此您可以向 OS 询问优先级的有效范围。
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
不要指望提高优先级会使机器阻塞。事实上,除非您已经使用了 100% 的 CPU 周期,否则不要指望它能做任何事情。如果查询告诉您没有比默认值更高的优先级,请不要感到惊讶。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件