【发布时间】:2016-09-19 12:25:49
【问题描述】:
我想知道我写的是否正确,并获得任何进一步的细节或说明(特别是上下文切换的描述):
在 我的 机器上(使用 Intel Core i7),我有四个内核,每个内核提供两个 硬件线程(例如处理器,使用称为 超线程)。尽管这是“最近”机器上的常见配置 (在撰写本文时),您可能会看到不同的结果——以及 并行
Stream程序的等效默认线程数。事实证明,“通用”的最佳线程数是 可用的处理器(这可能不适用于特定问题)。这来了 来自线程间上下文切换的代价:存储当前状态 被挂起的线程并检索另一个线程的当前状态 从它进入暂停的地方开始执行。如果您有八个处理器 和八个线程,JVM 在运行八个线程时永远不必切换上下文 任务。如果您的任务少于处理器的数量,那么它不会 帮助分配更多线程。
注意:我将此与并行流和Executors.newWorkStealingPool() 产生(在我的机器上)8 个线程的原因联系起来。
注意2:当你调用Runtime.getRuntime().availableProcessors()时,它在我的机器上返回8。所以我在描述“Java 认为的处理器”。
【问题讨论】:
-
这通常是不正确的。特别是,如果其中一些线程在任何给定时间什么都不做,那么有更多线程来使用空闲时间是有利的。
-
如果您要说“最佳线程数”,那么您可能应该说for what。您所描述的可能是 CPU 密集型计算的最佳线程数,具有无限的并行机会,作为机器上的唯一进程运行,但这并不意味着它是其他应用程序的最佳线程数。
-
“硬件线程”不是“处理器”。 “核心”是“处理器”。超线程内核创建了两个虚拟处理器的错觉,因为它有两套完整的上下文寄存器,并且它可以在基本上零时间内在两个上下文之间来回切换。根据复杂程度,它可能有限同时处理两者的能力(最常见的是,通过代表一个线程执行算术运算,而另一个线程正在等待从记忆。)
-
我重写了有问题的两段。
-
我认为你应该看看en.wikipedia.org/wiki/Amdahl%27s_law 这是对你问题的一种理论化。只是,文章中所说的,请理解为“并行计算单元的数量”,例如逻辑核。事实上,由于现代 CPU 的体系结构非常复杂,因此您始终可以拥有加速的上限。例如,一些指令可以并行完成,而另一些则不能。无论如何,阿姆达尔定律可以成为一个很好的经验法则:)
标签: java multithreading concurrency