加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:25:56 所属栏目:Java 来源:网络整理
导读:说我运行一个简单的单线程进程,如下所示: public class SirCountALot { public static void main(String[] args) { int count = 0; while (true) { count++; } }} (这是Java,因为这是我熟悉的,但我怀疑它没有什么重要) 我有一个i7处理器(4个核心或8个计数超
说我运行一个简单的单线程进程,如下所示:
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的使用情况,正如预期的那样,我看到它正在使用大约20%的所有可用CPU.

但是当我切换选项以显示每个CPU 1个图形时,我看到,使用4“内核”中的1个,CPU的使用量遍布核心:

相反,我期望的是1个核心的最大值,但这只有当我将进程的亲和力设置为单个核心时才会发生.

为什么工作量分散在单独的内核上?不会将多个内核的工作负载分散在一起,会导致缓存或其他性能损失?

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

编辑:我知道操作系统负责安排,但是我想知道为什么它会“麻烦”.从一个天真的观点来看,将(大部分*)单线程进程粘在一个核心上是比较简单的更有效的方式去吗?

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

解决方法

操作系统负责安排.可以自动停止线程并在另一个CPU上重新启动它.即使没有其他机器在做,它也会这样做.

该过程在CPU周围移动,因为操作系统不认为每次都有理由继续在同一个CPU上运行线程.

为此,我已经写了一个锁定线程库到一个CPU,所以它不会移动,不会被其他线程中断.这样可以减少延迟并提高吞吐量,但会为该线程浪费CPU.这适用于Linux,也许您可??以适应Windows. https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/Getting-started

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读