如何增加 pthreads 中的线程优先级?

2024-10-17 08:47:00
admin
原创
67
摘要:问题描述:我在 Linux 中使用 pthread。我想通过设置参数来提高线程优先级sched_param.priority。但是,我在网上找不到太多关于我可以设置的线程优先级范围或线程优先级描述的信息。另外,我想知道相对线程优先级,因为我不想将线程优先级设置得太高,导致操作系统停止运行。有人能帮我吗?解决方...

问题描述:

我在 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%(就我而言)。

编辑:引入niceSCHED_BATCHSCHED_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.htmlhttp://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 周期,否则不要指望它能做任何事情。如果查询告诉您没有比默认值更高的优先级,请不要感到惊讶。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用