为什么有些单线程的进程在任务管理器里实际占用双线程甚至更多线程?

ruri 5月前 81

如题,为什么有些单线程的进程在任务管理器里实际占用双线程甚至更多线程? 我现在手头两台电脑,一台 r7 [email protected] 全核,一台 i3 [email protected] 全核,都安装 LTSC,某个游戏在 1700x 上运行时,任务管理器可以看到只吃单线程( 8c16t ),其余线程基本 0%,个别在 5%以内。而这个游戏在 2120 上运行时,任务管理器却显示 4 线程( 2c4t )全都被吃了,而且每个逻辑线程占用率曲线图几乎一模一样,大约在 40-70%之间浮动的样子。 有大佬能讲讲这是什么原因吗?是 intel 在处理器设计上和 zen 架构不一样导致的吗?还是说仅仅只是 windows 的任务管理器显示有误?

最新回复 (8)
  • xyjincan 5月前
    引用 2
    各种系统,编译器,系统,CPU 帮你优化加速了
  • hcocoa 5月前
    引用 3
    程序检测到非 Intel CPU 可能会故意负优化: https://www.solidot.org/story?sid=15544
  • jim9606 5月前
    引用 4
    相比起之前的系统,win10 的进程调度会将单线程任务按时间片分散到多个核心中而不是锁定在一个核心上。
    至于这样有啥好处,我也不知道。
  • msg7086 5月前
    引用 5
    单线程占用多个 CPU 线程不是很正常的吗…
    操作系统让这个线程在多个核心里切换啊。

    比如 4 个核心线程,每个线程负责 25%的工作呗。
    分散是标准操作,可以降低单个核心的负载,凉快,不至于一小块地方特别热。
    至于 ryzen,因为有单核睿频差异,所以需要优先使用最优的核心。
  • systemcall 5月前
    引用 6
    架构不一样,牵扯到的东西很多
    而且游戏的话,有可能是显卡驱动的占用,显卡控制成一样的试试
  • CNife 5月前
    引用 7
    这个问题其实挺复杂的,我提一个点,不知道大佬们有什么看法。

    首先,程序是单线程程序,但运行程序的虚拟机/运行时不一定是。有 GC 的语言,必须在用户线程外开 GC 线程,运行时就不可能是单线程。比如下面的代码

    ```Java
    public class Main {
    public static void main(String[] args) {
    Thread.getAllStackTraces()
    .keySet()
    .stream()
    .map(Thread::getName)
    .sorted()
    .forEach(System.out::println);
    }
    }
    ```

    在 Hotspot JVM 14.0.1 中运行的结果是这样的:

    Attach Listener
    Common-Cleaner
    Finalizer
    Notification Thread
    Reference Handler
    Signal Dispatcher
    main

    在 main 线程之外有多达 6 个线程,整个 JVM 当然不是单线程程序。

    不光是像 Java,Python,JavaScript 这样在虚拟机里运行的语言,像 Go 这样虽然编译成了 native binary,但仍然有 GC 和 runtime 的语言,依然会有多个 goroutine 同时运行,同样不是单线程。

    可以说,在今天,只有那些没有 GC 的语言才可以实现真正的单线程程序,多线程程序才是最常见的程序。
  • BingoXuan 5月前
    引用 8
    @CNife
    不对吧,虚拟机和程序不应该混为一起把。应该按程序可交由系统调度线程数量分才对。
  • CNife 5月前
    引用 9
    @BingoXuan 我提这个点的意思是,虽然程序本身是单线程的,但实际上运行起来之后是多线程的,问题「单线程的进程」本身就不成立。
  • 游客
    10
返回