【问题标题】:Guide for working with Linux thread priorities and scheduling policies? [closed]使用 Linux 线程优先级和调度策略的指南? [关闭]
【发布时间】:2015-01-27 23:10:22
【问题描述】:

我在掌握 Linux 上的线程(/进程)优先级、调度策略选择、何时选择什么以及如何选择以及确切的效果是什么方面遇到了麻烦。

是否有任何文档(如指南),最好有具体的示例和时间表,我可以查阅?

【问题讨论】:

  • @Gray:嗯,你基本上是告诉我不要打扰......而且我会喜欢一些不打扰细节的东西。不过,我现在已经对你投了赞成票,我可能应该早点这样做。
  • @Gray:根据那个文件,我不应该接受你的回答。但可能需要将问题作为题外话来关闭以寻求场外资源:-(

标签: linux multithreading documentation conventions thread-priority


【解决方案1】:

我无法掌握 Linux 上的线程(/进程)优先级、调度策略选择

优先级通过利用底层操作系统的线程和进程优先级起作用,从文档的角度很难概括它的细节,这可能是您没有在线找到指南的原因。

我的建议是(坦率地说)不要打扰线程优先级。我已经完成了大量的线程编程,除了默认优先级之外,我从来没有发现需要做任何事情。线程优先级唯一会产生影响的情况是,如果所有线程都完全受 CPU 限制,并且您希望一项任务或另一项任务获得更多周期。

此外,我很确定至少在 Linux 下,这不是关于抢占,而是更多关于运行频率。许多线程实现使用优先级调度队列,因此较高频率的线程优先使用其中的逻辑,以避免使较低频率的线程挨饿。这意味着任何 IO 或其他阻塞操作都会导致较低优先级的线程运行并获得其时间片。

此页面是该问题的good example of the complexities。引用:

可以看出,线程优先级 1-8 最终获得了几乎相等的 CPU 份额,而优先级 9 和 10 获得了更大的份额(尽管 9 和 10 之间基本上没有区别)。测试的版本是 Java 6 Update 10。为了它的价值,我在运行 Vista 的双核机器上重复了实验,结果图的形状是相同的。我对优先级 9 和 10 的特殊行为的最佳猜测是,前台窗口中的 THREAD_PRIORITY_HIGHEST 具有足够的优先级,以便调度程序执行某些其他特殊处理(例如,内部优先级 14 及以上的线程已全部补充等待后,而较低的优先级将它们减少 1)。

如果您必须使用线程优先级,那么您可能需要编写一些测试程序来了解您的架构如何利用它们。

【讨论】:

  • 我正是你提到的唯一一个例外......没有什么是 I/O 绑定的,但有些线程需要在准备好后很快安排,而其他线程则不需要。
  • 我在回答中添加了一些细节@einpoklum,以向您展示对该主题所做的一些测试。这真是一个难题。
  • 所以,如果我理解正确的话:我可以得到在“高优先级”和“低优先级”线程之间进行二进制区分的效果,这样前者基本上总是抢占后者,但除此之外粗略的区分它很棘手/不一致/不值得探索?
  • 即使这取决于您的架构@einpoklum。当然值得一试。如果您需要确定,您可以考虑编写一些测试软件并在循环中计算长增量或其他内容,直到某个计时器到期或其他内容,然后将优先级与滴答数进行比较。
  • 要考虑@einpoklum 的一件事是不要分叉尽可能多的低优先级线程。使用线程池并减少并发运行的任务数量以匹配您的 CPU 架构。也许先提交高优先级的,以便他们先完成,然后再提交低优先级的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多