单核线程在哪些情况下打败跨核线程
What situations do single core threading beat threads across cores
我正在尝试寻找现实世界中的示例,在这些示例中,运行单核上的线程与跨越多核相比可能具有更多优势。
是否有 cost 生成线程 across 内核与在同一内核中生成线程。
java(或 os)如何确定何时在特定核心上分配工作。
最后,有没有一种方法可以明确指定线程应该 运行 在特定的内核上,或者这个 os 级别是否已确定?
如果逻辑是 CPU 绑定的,您只需要每个核心一个线程,因为同一核心上的多个 CPU 绑定线程会由于上下文切换、冷缓存等而导致浪费。如果线程不受 CPU 限制,但受 I/O 限制,每个内核使用多个线程可能是有益的。但这取决于架构,例如在像 Seastar/Scylla 这样的每核线程架构中,您仍然需要每核一个线程。
Java 不做任何事情来确定线程如何映射到内核。这是 OS 的任务,因为 Java 线程绑定到本机线程。
在 Java 中,没有将线程固定到内核的现成解决方案。但是您可以为此使用任务集或使用 Peter Lawrey 的库之一:
How does java (or the os) determine when to allocate work on specific cores.
目前在基于 OpenJDK 的 Java 实现中,Java 线程与主机 OS 线程一对一映射。因此每个平台(macOS、Linux、BSD、Windows、AIX 等)上的主机 OS 调度每个 Java 线程在其上执行认为合适的核心。
我们作为 Java 程序员无法直接控制我们的 Java 线程何时安排执行时间。我们也不控制哪个核心执行执行。
is there a way to specify explicitly that threads should run on a specific core
不,不在Java。
Is there a cost to spawning threads across cores vs spawning in the same core.
我们不能将我们的 Java 线程限制到特定的核心。所以你的问题的第二部分没有意义。
至于生成线程的成本,是的,在当前 Java 中成本很高。线程当前使用相当多的内存(堆栈分配)和 CPU 时间(CPU 核心可以闲置,而 Java 代码块)。
Loom 项目旨在大大降低此成本。他们努力的主旨是 virtual threads,也称为纤维。
基于抢先体验,Project Loom 技术的实验版本现已推出 Java18。要了解更多信息,请观看 Loom 团队成员(如 Ron Pressler 和 Alan Bateman)近期的演讲和采访视频。
要在 Java 中了解有关线程的更多信息,请阅读 Brian Goetz 等人撰写的这本优秀书籍:Java Concurrency In Practice。
What situations do single core threading beat threads across cores
即使有也极少。简短的回答是你应该相信 JVM 和操作系统在线程调度方面做正确的事情。
Is there a cost to spawning threads across cores vs spawning in the same core.
这是有代价的,因为当一个作业从一个处理器中换出而另一个处理器取代它时,它的缓存内存 [应该] 失效。在处理器之间来回切换会影响内存缓存速率和内存操作的性能,从而导致初始内存访问花费更长的时间。
How does java (or the os) determine when to allocate work on specific cores.
没有。它是操作系统上的本机线程库。
Finally, is there a way to specify explicitly that threads should run on a specific core or is this os level determined?
有一些本机调用可以控制对特定内核的锁定作业。
我不确定是否有限制本机线程库。也就是说,我真的怀疑它是否值得。现在是 2021 年,现代操作系统在核心之间交换作业和有效管理方面非常高效。您可以进行一大堆只能在特定操作系统(可能是特定操作系统版本)上运行的本机调用,并且很容易使系统性能变差并占用更多资源。
我正在尝试寻找现实世界中的示例,在这些示例中,运行单核上的线程与跨越多核相比可能具有更多优势。
是否有 cost 生成线程 across 内核与在同一内核中生成线程。
java(或 os)如何确定何时在特定核心上分配工作。
最后,有没有一种方法可以明确指定线程应该 运行 在特定的内核上,或者这个 os 级别是否已确定?
如果逻辑是 CPU 绑定的,您只需要每个核心一个线程,因为同一核心上的多个 CPU 绑定线程会由于上下文切换、冷缓存等而导致浪费。如果线程不受 CPU 限制,但受 I/O 限制,每个内核使用多个线程可能是有益的。但这取决于架构,例如在像 Seastar/Scylla 这样的每核线程架构中,您仍然需要每核一个线程。
Java 不做任何事情来确定线程如何映射到内核。这是 OS 的任务,因为 Java 线程绑定到本机线程。
在 Java 中,没有将线程固定到内核的现成解决方案。但是您可以为此使用任务集或使用 Peter Lawrey 的库之一:
How does java (or the os) determine when to allocate work on specific cores.
目前在基于 OpenJDK 的 Java 实现中,Java 线程与主机 OS 线程一对一映射。因此每个平台(macOS、Linux、BSD、Windows、AIX 等)上的主机 OS 调度每个 Java 线程在其上执行认为合适的核心。
我们作为 Java 程序员无法直接控制我们的 Java 线程何时安排执行时间。我们也不控制哪个核心执行执行。
is there a way to specify explicitly that threads should run on a specific core
不,不在Java。
Is there a cost to spawning threads across cores vs spawning in the same core.
我们不能将我们的 Java 线程限制到特定的核心。所以你的问题的第二部分没有意义。
至于生成线程的成本,是的,在当前 Java 中成本很高。线程当前使用相当多的内存(堆栈分配)和 CPU 时间(CPU 核心可以闲置,而 Java 代码块)。
Loom 项目旨在大大降低此成本。他们努力的主旨是 virtual threads,也称为纤维。 基于抢先体验,Project Loom 技术的实验版本现已推出 Java18。要了解更多信息,请观看 Loom 团队成员(如 Ron Pressler 和 Alan Bateman)近期的演讲和采访视频。
要在 Java 中了解有关线程的更多信息,请阅读 Brian Goetz 等人撰写的这本优秀书籍:Java Concurrency In Practice。
What situations do single core threading beat threads across cores
即使有也极少。简短的回答是你应该相信 JVM 和操作系统在线程调度方面做正确的事情。
Is there a cost to spawning threads across cores vs spawning in the same core.
这是有代价的,因为当一个作业从一个处理器中换出而另一个处理器取代它时,它的缓存内存 [应该] 失效。在处理器之间来回切换会影响内存缓存速率和内存操作的性能,从而导致初始内存访问花费更长的时间。
How does java (or the os) determine when to allocate work on specific cores.
没有。它是操作系统上的本机线程库。
Finally, is there a way to specify explicitly that threads should run on a specific core or is this os level determined?
有一些本机调用可以控制对特定内核的锁定作业。 我不确定是否有限制本机线程库。也就是说,我真的怀疑它是否值得。现在是 2021 年,现代操作系统在核心之间交换作业和有效管理方面非常高效。您可以进行一大堆只能在特定操作系统(可能是特定操作系统版本)上运行的本机调用,并且很容易使系统性能变差并占用更多资源。