Java 在JVM中,线程对象是直接绑定到CPU内核,还是在两者之间有映射器?

Java 在JVM中,线程对象是直接绑定到CPU内核,还是在两者之间有映射器?,java,multithreading,Java,Multithreading,我想知道的是(我发现什么文档对理解它不是很有帮助),当CPU核心上执行的线程将控制权转移到硬件设备上(磁盘控制器、网络I/O等),以执行CPU/核心无法帮助的操作时,CPU核心会发生什么情况。该内核是否可用于执行其他线程,或者它只是暂停并等待(即使有其他具有CPU工作的线程可用于调度) 经常给出的“尽可能多的线程和内核”的建议似乎是后者。这对Java来说是无法控制的。调度由操作系统完成,因此超出了JVM的范围 当操作系统在等待IO完成时,很可能会回收内核 简单的建议“每个核心/处理器一个线程”适

我想知道的是(我发现什么文档对理解它不是很有帮助),当CPU核心上执行的线程将控制权转移到硬件设备上(磁盘控制器、网络I/O等),以执行CPU/核心无法帮助的操作时,CPU核心会发生什么情况。该内核是否可用于执行其他线程,或者它只是暂停并等待(即使有其他具有CPU工作的线程可用于调度)


经常给出的“尽可能多的线程和内核”的建议似乎是后者。

这对Java来说是无法控制的。调度由操作系统完成,因此超出了JVM的范围

当操作系统在等待IO完成时,很可能会回收内核

简单的建议“每个核心/处理器一个线程”适用于CPU密集型操作。如果您知道大部分时间都在等待IO,那么您可以创建比内核更多的线程


还请注意,已启用的超线程将计入可用处理器的数量,因此已启用超线程的四核处理器将被报告为具有8个可用处理器(另请参见)。

Java使用本机操作系统线程。因此,线程调度是操作系统的工作。Java运行时只是创建线程。当任务是CPU限制的时,“线程数与内核数相同”的建议就足够了。如果他们正在进行网络IO,则可以使用更多线程。当然,如果一个线程不需要CPU,OS调度程序会让另一个线程使用它。答案是可以接受的。实际上,在使用超线程的现代系统中,它可能是
2倍的内核数。对线程的内部处理取决于许多因素。。例如,处理器亲缘关系可能会允许某些内核闲置一段时间,而某些内核会连续工作,因为切换处理器会非常慢。。因此,CPU的行为在不同的实现中是不同的。。正如JB Nizet所说,这条规则是与CPU绑定的线程一起使用的。而且操作系统很可能会安排线程,以便不让任何内核空闲。。