2010-01-05 64 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。但是,你還需要定義「線程」是什麼意思,

相關問題