我可以依赖OS调度线程“最优”(并行化)

时间:2014-11-21 12:46:49

标签: java multithreading operating-system

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

我的问题是底层操作系统(Linux,Winodws OSX)是否会自动实现我的“意图”,例如将每个线程分配给单个核心,假设我有例如8个核心,因此有8个线程,每个线程都在“耗时的”任务上工作?

或者反过来说:是否可以将线程分配给核心(特别是在Java中)?

2 个答案:

答案 0 :(得分:2)

不,您无法在JavaJava Multithreading - Assign threads to processor cores

中为特定核心分配线程

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

答案 1 :(得分:2)

  

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

远比这复杂得多。

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

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

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

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

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

现在进行超线程。

超线程可能会为每个时钟周期提供额外的CPU周期。但是,他们不会在内存系统中给你额外的周期。超线程虚拟核心的性能特征"将与物理核心不同......对于现实生活中的应用,差异将是巨大的。因此,你的2 x假设没有基础。

  

我的问题是底层操作系统(Linux,Winodws OSX)是否会自动实现我的意图"例如将每个线程分配给单个核心,假设我有例如8个核心,因此有8个线程,每个线程都耗时耗时#34;任务?

不一定。

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

  • OS(和JVM)通常只会对制定调度决策时已经发生的事情作出反应。根据过去的行为(在这个级别)预测未来行为是不符合成本效益的......现代操作系统除非在非常粗略/启发式的水平上,否则不会尝试这样做。完美(最佳)预测是不可能的,即使你有完美的知识,调度问题也是NP难的。

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

  

或者反过来说:是否可以将线程分配给核心(特别是在Java中)?

没有切实可行的方法。 (参见@ ksmonkey123'答案)当然,不是便携式。

无论如何,它可能不太适用于Java。 Java还有一个问题,即应用程序背后隐藏着线程(例如垃圾收集器和终结器线程),Java内存管理难以预测,难以调整。