2010-01-05 102 views
6

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

有没有可能是操作系统或内核本身尽量平衡所有4个内核的一些代码或执行,即使它不是一个多线程程序?你有没有任何文件记录这种技术的链接?

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

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

这个问题是语言无关的,不依赖于Qt的/ C++,我只是想知道,如果Windows或英特尔做的也来平衡所有核心单线程代码。如果他们这样做,这种技术如何工作?

所有我能想到的是,那个内核例程像从磁盘读取等计划上的所有核心,但是这不会显著提高性能,因为该代码仍然运行同步到内核API调用。

编辑

你知道任何工具做比穷人Windows任务管理器单和/或多线程程序的更好的分析?

回答

10

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

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

+1

当然,除非你使用量子处理器,否则你只能有一个处理器在给定的时间点运行某个线程。但是,在一段时间内,单个线程可以迁移到其他CPU! – ennuikiller 2010-01-05 19:35:00

+0

较旧版本的Windows(XP及更早版本)不要试图在同一个内核上保留一个进程,它们默认情况下完全相反。 – 2010-01-05 19:50:37

+0

操作系统调度程序可能会将一个进程(更精确地说,一个线程)从一个核心迁移到另一个核心,但这是不太可能的。我不知道Qt,但在我看来,更可能的解释是Qt背后还有其他线程,在其他内核上进行调度。该活动以及内核和其他进程的活动显示在其他内核上。 – Cheeso 2010-01-05 19:54:37

0

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

1

的Windows,XP的什么版本和之前有一个可怕的线程调度,实际上会跳单线程任务,从核心网到核心。在Windows下(与其他操作系统一样),无论您认为自己运行的是哪一项活动,都会有数十个非用户程序在运行。

+0

当我的程序没有运行时,所有核心都没有重要的活动。我确定所有可见的活动都是直接或间接来自我的程序。 – WolfgangA 2010-01-05 19:31:44

+0

@沃尔夫冈 - 你的过程可能导致其他线程中的活动。例如,如果您正在屏幕上绘图,则会导致DWM过程中的工作。 – Michael 2010-01-05 19:36:39

+0

这就是我所说的“间接”,就像API调用或调用各种系统例程一样。 – WolfgangA 2010-01-05 19:45:18

0

尽管您可能会感觉到,但CPU中的内容还远不止您的应用程序。操作系统及其所有进程和线程也在运行。你看到的是你的进程被安排在不同的核心在不同的时间。你的应用程序没有被并行化 - 它只是当前正在执行的许多任务中的一个。请放心,您的应用顺序运行。

+0

关于*你看到的是你的进程被安排在不同的核心在不同的时间*不太可能。可以将线程从一个核心迁移到另一个核心,但它不应该正常发生。我同意“还有更多的东西只是你的应用程序。” – Cheeso 2010-01-05 19:49:29

+0

我不同意。我保证在某些时候应用程序会切换上下文 - 无论是由于IO等待还是4+进程需要CPU时间,或者调度程序执行上下文切换的其他各种原因 - 以及何时切换回它将进入操作系统认为最合适的核心。 – cyberconte 2010-01-05 20:04:00

2

,你想要做更深入的分析,而任务管理器可以被称为性能监视器(Perfmon.exe)中的工具 - 这是捕捉和制图性能计数器这仪器窗口的UI。您可以使用它来监视系统和每个进程级别的各种信息;学会去爱它 - 这是开发者最好的朋友之一。

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

0

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

在Windows任务管理器(或工具有Sysinternals)在你的进程名,单击鼠标右键,并设置(选择)的亲和力核心,你现在应该只有一个核心主动看......

哪些Windows你使用? XP?七 ?

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

0

我使用Windows 7 x64 Home Premium和英特尔i7 920 CPU和单线程程序从核心跳转到核心,所以我没有看到它是如何改进XP的。 7确实可以识别HT(超线程),并且不会将多任务安排到一个CPU内核,这可能是7对XP的唯一好处。我没有多核处理器与XP的很长时间,所以不知道XP是否考虑到了HT。

1

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

有像OpenMP这样的语言被设计用于向编译器提供此提示。目前,OpenMP的大多数实现都在后台使用线程库。但将来他们不会。

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

简而言之,不是今天,而是最有可能通过未来的OpenMP。但是,你还需要定义“线程”是什么意思,

相关问题