【发布时间】:2020-04-07 17:54:38
【问题描述】:
这张图片显示了 Java 程序如何使用内核线程。 我的疑惑是图片中的“CPU”是不是代表“核心”,也就是说,如果我的cpu有4个核心并且支持4个线程,那么我在程序中创建的java线程最终可以匹配到这4个核心,并且每次在每个核心中只有 1 个正在运行的线程。更何况cpu有4个核心,支持8个线程,是不是每个核心每次都会有2个运行线程呢?
【问题讨论】:
标签: java multithreading cpu
这张图片显示了 Java 程序如何使用内核线程。 我的疑惑是图片中的“CPU”是不是代表“核心”,也就是说,如果我的cpu有4个核心并且支持4个线程,那么我在程序中创建的java线程最终可以匹配到这4个核心,并且每次在每个核心中只有 1 个正在运行的线程。更何况cpu有4个核心,支持8个线程,是不是每个核心每次都会有2个运行线程呢?
【问题讨论】:
标签: java multithreading cpu
在这张特定的图片中,“CPU”确实意味着“核心”。但是,这张图片被简化了。
普通 CPU 支持每个内核一次运行 1 个线程。
所有现代 CPU 都有Hyperthreading,这意味着每个内核一次“支持”2 个线程。在这个特定的意义上,4 个核心可以支持 8 个线程。我将“支持”放在引号中,因为实现并没有真正同时运行 2 个东西 - 那只是 2 个内核。它的作用是交错 2 个线程,但有 2 组寄存器,因此在 2 个线程之间切换时不必从内存中加载寄存器。
您的图片根本没有考虑超线程,并且有充分的理由 - 它试图教您线程,而不是 CPU 实现。
请注意,如果您有 1、4 或 60,000 个线程,这并不意味着它们会在内核之间平均分配。一个线程可以在不同的时间在不同的核上运行,运行时(Java)可以为某些线程设置affinity。
这意味着您的所有线程都可能在 1 个核心上运行,或者每个线程在不同的核心上运行,或者任何其他组合。
【讨论】: