gpt4 book ai didi

java - 为什么单线程进程在多个处理器/内核上执行?

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:53 25 4
gpt4 key购买 nike

假设我运行一个简单的单线程进程,如下所示:

public class SirCountALot {
public static void main(String[] args) {
int count = 0;
while (true) {
count++;
}
}
}

(这是 Java,因为这是我熟悉的,但我怀疑它并不重要)

我有一个 i7 处理器(4 核,或 8 个超线程计数),我运行的是 Windows 7 64 位,所以我启动了 Sysinternals Process Explorer 来查看 CPU 使用情况,正如预期的那样,我看到它正在使用所有可用 CPU 的大约 20%。

Graph showing 20% CPU usage across all cores

但是当我切换选项为每个 CPU 显示 1 个图表时,我看到 CPU 使用率分布在所有核心上,而不是 4 个“核心”中的 1 个被使用:

Graph showing erratic CPU usage on each core totaling around 20% usage

相反,我期望的是 1 个核心达到极限,但只有当我将进程的亲和性设置为单个核心时才会发生这种情况。

Graph showing most of recent CPU usage to be confined to first core

为什么将工作负载分配到不同的核心上?将工作负载分散到多个内核上不会扰乱缓存或招致其他性能损失吗?

是为了防止一个核心过热的简单原因吗?还是有更深层次的原因?

编辑:我知道操作系统负责调度,但我想知道它为什么“麻烦”。从天真的角度来看,将(主要是*)单线程进程坚持到 1 个核心肯定是更简单、更有效的方法吗?

*我说主要是单线程是因为这里有多个线程,但其中只有 2 个在做任何事情:

Screenshot showing number of threads from Eclipse Screenshot showing number of threads in Process Explorer process properties

最佳答案

操作系统负责调度。可以自由地停止线程并在另一个 CPU 上再次启动它。即使机器没有做任何其他事情,它也会执行此操作。

进程在 CPU 周围移动,因为操作系统不认为有任何理由每次都在同一 CPU 上继续运行线程。

出于这个原因,我编写了一个用于将线程锁定到 CPU 的库,这样它就不会四处移动,也不会被其他线程中断。这减少了延迟并提高了吞吐量,但确实会耗尽该线程的 CPU。这适用于 Linux,也许您可​​以将其改编为适用于 Windows。 https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/Getting-started

关于java - 为什么单线程进程在多个处理器/内核上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8485947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com