【问题标题】:Is it possible that a single-threaded program is executed simultaneously on more than one CPU core?单线程程序是否有可能在多个 CPU 内核上同时执行?
【发布时间】:2010-01-05 19:25:54
【问题描述】:

当我运行我在四核 Intel 上编写的单线程程序时,我可以在 Windows 任务管理器中看到实际上我的 CPU 的所有四个内核都或多或少处于活动状态。一个核心比其他三个更活跃,但在这些核心上也有活动。没有其他程序(当然除了操作系统内核)正在运行,这对于该活动来说是合理的。当我关闭我的程序所有活动时,所有内核都会下降到几乎为零。剩下的只是核心上的一点“噪音”,所以我很确定所有可见的活动都直接或间接地(如调用系统例程)来自我的程序。

操作系统或内核本身是否有可能尝试在所有四个内核上平衡某些代码或执行,即使它不是多线程程序?您是否有任何链接记录了这种技术?

程序的一些信息:这是一个用 Qt 编写的控制台应用程序,任务管理器指出只有一个线程正在运行。也许 Qt 使用线程,但我不使用信号或插槽,也没有任何 GUI。

任务管理器截图链接:http://img97.imageshack.us/img97/6403/taskmanager.png

这个问题与语言无关,与 Qt/C++ 无关,我只想知道 Windows 或 Intel 是否也在所有内核上平衡单线程代码。如果有,这种技术是如何工作的?

我能想到的是,内核例程(如从磁盘读取等)安排在所有内核上,但这不会显着提高性能,因为代码仍然必须与内核 api 调用同步运行。

编辑

你知道有什么工具可以比糟糕的 Windows 任务管理器更好地分析单线程和/或多线程程序吗?

【问题讨论】:

    标签: multithreading cpu


    【解决方案1】:

    单线程进程在任何给定时刻只能在单个内核上运行。

    但操作系统可以将线程从一个内核迁移到另一个内核。虽然操作系统会尝试将线程保持在同一个内核上,但如果运行该线程的最后一个内核繁忙而另一个内核空闲,则操作系统可以迁移该线程。

    【讨论】:

    • 是的,当然,除非您使用量子处理器,否则您只能让 1 个处理器在给定时间点运行某个线程。但是,在某个时间间隔内,单个线程可以迁移到其他 cpu!
    • 旧版本的 Windows(XP 和更早版本)不要尝试将进程保持在同一个内核上,默认情况下它们会完全相反。
    • 操作系统调度程序可能将一个 proc(更准确地说,一个线程)从一个内核迁移到另一个内核,但这种可能性极小。我不知道 Qt,但在我看来,更可能的解释是 Qt 的幕后还有其他线程,被安排在其他内核上。该活动以及内核和其他进程的活动会显示在其他内核上。
    • 看看libevent等
    【解决方案2】:

    您想要比任务管理器进行更深入分析的工具称为 perfmon (perfmon.exe) - 它是一个用于捕获和绘制用于检测 Windows 的性能计数器的 UI。您可以使用它来监控系统和每个进程级别的各种信息;学会爱上它——它是开发者最好的朋友之一。

    http://technet.microsoft.com/en-us/library/bb490957.aspx

    【讨论】:

      【解决方案3】:

      什么版本的 Windows、XP 和以前的版本有一个糟糕的线程调度程序,它实际上会将单线程任务从一个核心跳转到另一个核心。在 Windows 下(与其他所有操作系统一样),有几十个甚至数百个非用户程序同时运行,无论您认为自己正在运行什么可以解释所有这些活动。

      【讨论】:

      • 当我的程序没有运行时,所有内核上都没有明显的活动。我确信所有可见的活动都直接或间接地来自我的程序。
      • @Wolfgang - 您的进程可能会导致其他线程中的活动。例如,如果您在屏幕上绘图,则会导致 DWM 进程工作。
      • 这就是我所说的“间接”,例如 API 调用或调用各种系统例程。
      【解决方案4】:

      这是目前的研究课题。并行编译器应该在您的程序中找到并发机会并并行执行它们。但这是一项非常艰巨的任务。

      有些语言(如 OpenMP)旨在向编译器提供此提示。目前大多数 OpenMP 实现在后台使用线程库。但将来他们不会。

      您可能需要非常不同的硬件。

      简短的回答是,不是今天,但很可能在未来通过 OpenMP。但是,您还需要定义“线程”的含义,

      【讨论】:

        【解决方案5】:

        是的,除非您使用“处理器关联”线程(一个或多个),否则将在内核线程管理代码分配的任何处理器上调度。不能保证从一条指令到下一条指令都是同一个处理器

        【讨论】:

          【解决方案6】:

          尽管您可能察觉到,CPU 中的工作远不止您的应用程序。操作系统及其所有进程和线程也在运行。您所看到的是您的进程在不同时间安排在不同的核心上。您的应用程序没有被并行化 - 它只是当前正在执行的众多任务之一。请确保您的应用按顺序运行。

          【讨论】:

          • 关于您所看到的是您的进程在不同时间安排在不同的核心上。不太可能。可以将线程从一个内核迁移到另一个内核,但它不应该正常发生。我同意“除了你的应用之外还有很多事情要做。”
          • 我不同意。我保证在某些时候应用程序将切换上下文 - 由于 IO 等待或 4 个以上的进程同时需要 CPU 时间,或者调度程序执行上下文切换的任何其他无数原因 - 以及当它被切换回来时在,它将进入操作系统认为最合适的核心。
          【解决方案7】:

          更好的 Windows 任务管理器是sysinternals process explorer

          在 Windows 任务管理器(或 sysinternals 进程资源管理器)中,右键单击您的进程名称,然后设置(选择)关联核心,您现在应该会看到只有一个核心处于活动状态...

          您使用哪种 Windows?经验丰富?七?

          如果您使用 XP,请尝试七,内核管理得更好。

          【讨论】:

            【解决方案8】:

            我使用 Windows 7 x64 Home Premium 和 Intel i7 920 CPU,单线程程序在内核之间跳转,所以我看不出它比 XP 有什么改进。

            7 确实识别 HT(超线程)并且不会将多个任务调度到一个 CPU 核心,这可能是 7 相对于 XP 的唯一好处。我很久没有使用 XP 的多核处理器了,所以不确定 XP 是否考虑了 HT。

            【讨论】:

              猜你喜欢
              • 2023-04-02
              • 1970-01-01
              • 2021-07-03
              • 2016-05-08
              • 1970-01-01
              • 2023-02-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多