【问题标题】:Can I rely that OS schedules threads "optimal" (Parallelization)我可以依靠操作系统调度线程“最佳”(并行化)
【发布时间】:2014-11-21 12:46:48
【问题描述】:

Afaik:适用于并行处理的数据的最佳线程数是内核数 - 因为每个线程(理论上)都有自己的内核来运行。对于能够进行超线程处理的 CPU,它是内核数量的 2 倍。如果我错了,请纠正我。

我的问题是底层操作系统(Linux、Winodws OSX)是否会自动实现我的“意图”,例如假设我有,例如,将每个线程分配给一个核心8 个内核和相应的 8 个线程,每个线程都在执行“耗时”任务?

或者反过来:是否可以将线程分配给内核(尤其是在Java)?

【问题讨论】:

  • 最佳线程调度是在极少数情况下 np-hard 除外,因此没有操作系统会这样做。现代调度程序足够聪明,如果可能的话,不会将线程从一个核心移动到另一个核心,因为从缓存的角度来看这非常糟糕。

标签: java multithreading operating-system


【解决方案1】:

Afaik:适用于并行处理的数据的最佳线程数是内核数 - 因为每个线程(理论上)都有自己的内核可以运行。对于能够进行超线程处理的 CPU,它是内核数量的 2 倍。如果我错了,请纠正我。

远比这复杂得多。

这取决于您要优化什么。如果您正在优化可用硬件的有效(即成本效益)使用,那么它很少是最佳的。如果任何线程出于任何原因需要等待很长一段时间,那么将线程一对一分配到物理内核会导致内核利用率不足。如果这些内核可以用于其他用途(例如运行其他人的程序!),那么您的使用就不是最理想的了。

即使您仅针对应用程序速度进行优化,一对一分配也不一定是最佳策略。

  • 就线程数而言,每个应用程序 + 工作负载都有一个“最佳位置”。这取决于任何内部争用的数量和性质,以及与外部系统(文件系统、网络等)通信的数量和性质。

  • 如果您有一个严格的每核一个线程规则,那么您在 N 核系统上最多可以有 N 个线程。

  • 如果 N 明显小于“最佳位置”线程数,您可能会发现内核在很多时候处于空闲状态。

现在是超线程。

超线程可能会在每个时钟周期为您提供额外的 CPU 周期。但是,它们不会在内存系统中为您提供额外的周期。超线程“虚拟核心”的性能特征将不同于物理核心......对于现实生活中的应用程序,差异将是显着的。因此,您的 2 x 假设是没有根据的。

我的问题是底层操作系统(Linux、Winodws OSX)是否会自动实现我的“意图”,例如假设我有例如,将每个线程分配给一个核心8 个内核和相应的 8 个线程,每个线程都在执行“耗时”的任务?

不一定。

  • 操作系统必须考虑系统上发生的其他事情。其他应用程序,处理桌面的守护进程等,处理文件系统和网络协议的东西。

  • 操作系统(和 JVM)通常只会对在做出调度决策时已经发生的事情做出反应。根据过去的行为(在这个级别)预测未来的行为并不划算……现代操作系统不会尝试这样做,除非在非常粗略/启发式的级别上。完美(最优)预测是不可能的,即使你有完美的知识,调度问题也是 NP 难的。

理论上,应用程序程序员可以设计一个最佳时间表。在实践中,大多数应用程序对此都过于复杂,而且很难考虑系统上发生的其他“随机”事情。

或者反过来:是否可以将线程分配给内核(尤其是在 Java 中)?

没有实际的方法可以做到这一点。 (请参阅@ksmonkey123 的回答)当然,不可移植。

无论如何,它可能不太可能在 Java 中工作。 Java 还存在一个问题,即在应用程序背后有隐藏线程在做事(例如垃圾收集器和终结器线程),并且 Java 内存管理更难预测和调优。

【讨论】:

    【解决方案2】:

    不,您不能将线程分配给Java (Java Multithreading - Assign threads to processor cores) 中的特定核心

    通常,您可以期望操作系统或多或少以最佳方式管理线程的运行时间。这包括例如防止饥饿。

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2011-05-24
      • 2020-02-20
      相关资源
      最近更新 更多