当我运行我在四核Intel上编写的单线程程序时,我可以在Windows任务管理器中看到,我CPU的所有四个内核实际上都或多或少都处于活动状态。一个核心比其他核心更活跃,但也有活动。没有其他程序(当然除了OS内核)运行,这对于该活动来说是合理的。当我关闭我的程序所有活动时,所有核心都下降到接近零。剩下的就是核心上的一点“噪音”,所以我很确定所有可见的活动直接或间接地来自我的程序(如调用系统例程)。
操作系统或内核本身是否可能尝试在所有四个内核上平衡某些代码或执行,即使它不是多线程程序?你有任何记录这种技术的链接吗?
该程序的一些信息:它是一个用Qt编写的控制台应用程序,任务管理器声明只有一个线程正在运行。也许Qt使用线程,但我不使用信号或插槽,也不使用任何GUI。
链接到任务管理器屏幕截图:http://img97.imageshack.us/img97/6403/taskmanager.png
这个问题与语言无关并且与Qt / C ++无关,我只想知道Windows或Intel是否还要在所有内核上平衡单线程代码。如果他们这样做,这项技术如何运作?
我能想到的是,在所有内核上都安排了从磁盘读取等内核例程,但这不会显着提高性能,因为代码仍然必须与内核api调用同步运行。
修改
除了糟糕的Windows任务管理器之外,您是否了解更好地分析单线程和/或多线程程序的工具?
答案 0 :(得分:10)
单线程进程只能在任何给定时刻在单个核心上运行。
但是操作系统可以将一个线程从一个核心迁移到另一个核心。虽然操作系统会尝试将线程保留在同一个内核上,但如果线程运行的最后一个内核忙,而另一个内核是空闲的,则操作系统可以迁移该线程。
答案 1 :(得分:2)
您希望进行比任务管理器更深入分析的工具称为perfmon(perfmon.exe) - 它是用于捕获和绘制仪器Windows的性能计数器的UI。您可以使用它来监视系统和每个进程级别的各种信息;学会喜欢它 - 它是开发者最好的朋友之一。
答案 2 :(得分:1)
什么版本的Windows,XP和之前有一个糟糕的线程调度程序实际上会将单个线程任务从核心跳转到核心。在Windows下(与所有其他操作系统一样),无论您认为自己运行的是什么,都可以解决所有这些活动,因此有几十个(如果不是数百个)非用户程序同时运行。
答案 3 :(得分:1)
目前这是一个研究课题。并行编译器应该在程序中找到并发机会并并行执行它们。但这是一项非常艰巨的任务。
有一些像OpenMP这样的语言,旨在为编译器提供此提示。目前,OpenMP的大多数实现都在后台使用线程库。但是将来他们不会。
您可能需要非常不同的硬件。
简短的回答是,不是今天,但很可能在将来通过OpenMP。但是你还需要通过“线程”定义你的意思,
答案 4 :(得分:0)
是,除非您使用“处理器关联”线程(一个或多个)将在内核线程管理代码分配的任何处理器上进行调度。无法保证这将是从一条指令到下一条指令的相同处理器
答案 5 :(得分:0)
尽管您可能会感觉到,但CPU中的内容远不止您的应用程序。操作系统及其所有进程和线程也在运行。您所看到的是您的进程在不同时间安排在不同的核心上。您的应用程序未被并行化 - 它只是当前正在执行的许多任务之一。请确保您的应用按顺序运行。
答案 6 :(得分:0)
更好的Windows任务管理器是sysinternals process explorer。
在Windows任务管理器中(或在sysinternals进程资源管理器中),右键单击您的进程名称,并设置(选择)亲和核心,您现在应该看到只有一个核心活动...
您使用哪种Windows? XP?七?
如果使用XP,请尝试使用Seven,可以更好地管理内核。
答案 7 :(得分:0)
我使用Windows 7 x64家庭高级版和英特尔i7 920 CPU,单线程程序从核心跳到核心,所以我看不出它是如何改进XP的。
7确实识别HT(超线程)并且没有为一个CPU核心安排多个任务,这可能是7比XP更好的好处。我没有使用XP的多核处理器,所以不确定XP是否考虑了HT。