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

2024-10-17 08:47:00
admin
原创
359
摘要:问题描述:我在 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 周期,否则不要指望它能做任何事情。如果查询告诉您没有比默认值更高的优先级,请不要感到惊讶。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2325  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1500  
  PLM(产品生命周期管理)项目管理旨在确保产品从概念到退役的整个生命周期内的有效规划、执行和控制。然而,在项目推进过程中,黑天鹅事件的出现往往会打乱原有的计划和节奏。黑天鹅事件具有意外性、重大影响和事后可解释性的特点,给PLM项目管理带来巨大挑战。如何有效应对这些难以预测的事件,制定合理的应急计划,成为项目管理者必须面...
plm研发管理系统   13  
  产品生命周期管理(PLM)项目对于企业提升产品创新能力、优化流程以及增强市场竞争力至关重要。然而,如同任何复杂项目一样,PLM 项目面临着诸多风险,若处理不当,可能导致项目延误、成本超支甚至失败。有效的风险管理是确保 PLM 项目成功实施的关键因素之一。风险登记册作为风险管理的重要工具,能够系统地记录、跟踪和管理项目中...
plm流程是什么   10  
  产品生命周期管理(PLM)是一种战略性的业务方法,旨在管理产品从概念构思到退役的整个生命周期。通过整合人员、流程和技术,PLM帮助企业提高产品质量、缩短上市时间、降低成本并增强创新能力。以下将从六个维度解析PLM产品生命周期管理包含的阶段。规划阶段规划阶段是PLM的起点,它为整个产品生命周期奠定了基础。在这个阶段,企业...
plm系统   10  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用