2012-02-22 52 views
0

我有與進程相關的processID。我已經使用CreateProcess()函數創建了這個過程。在運行期間,我想跟蹤它運行的處理器數量以及此可執行文件在多核機器上使用的時間。獲取一個特定進程正在運行的處理器的數量

我想爲C++編寫相同的代碼;誰可以幫我這個事?

我正在使用Win XP多核計算機。

+0

請問你能展示你的代碼嗎? – gideon 2012-02-22 06:13:58

回答

1
GetProcessAffinityMask

檢索指定過程和系統中的系統親和力掩模過程親和力掩碼。

GetProcessTimes

檢索定時爲指定的進程的信息。

+1

這給了處理器*可以運行的進程,但據我所知,沒有關於它實際上被調度的那些信息。 – 2012-02-22 08:17:15

0

您可以使用Windows事件跟蹤(ETW)和CSwitch事件(在每個上下文切換時發出)在Vista或更高版本上捕獲此級別的詳細信息。

各種工具(例如Windows Performance Toolkit)捕捉並可視化這些數據。

但是,這在Windows XP上不受支持。

如果您只想知道您的典型併發性(即在給定時間有多少線程正在運行),您可以定期對perfmon線程數據(來自HKEY_PERFORMANCE_DATA)進行採樣。 「線程狀態」計數器將爲您提供進程中每個線程的即時狀態(即每個線程是否正在運行)。很明顯,這個採樣過程會將最大併發數限制爲(處理器數量爲1)。

但是你真的需要這麼多細節嗎? GetProcessTimes通常就足夠了。

更新

您可以在測試機器上運行你的應用程序,只需測量使用性能監視器每個CPU的利用率。您還應該測量每個進程的CPU利用率,以確保沒有其他事情意外運行。

要捕獲報告數據,請以管理員身份運行perfmon。

  • 導航到右側的「性能監視器」以顯示實時性能圖表。選擇要監視的對象/計數器(即所有處理器和進程的「處理器時間百分比」)。 Perfmon應該開始實時捕獲數據。
  • 右鍵單擊圖形並選擇捕獲頻率(例如,如果您的應用程序運行數小時,則可能不需要每秒鐘都有數據)。
  • 右鍵單擊右側樹中的「性能監視器」節點,然後選擇「新建|數據收集器集」。爲它輸入一個名稱並點擊其他默認值。
  • 導航到右側的Data Collector Set(位於「Data Collector Sets | User Defined」下)。您可以使用工具欄按鈕(或通過右鍵單擊)來啓動和停止數據收集。
  • 現在,您已將一些數據返回到性能監視器圖表,並選擇「查看日誌數據」(第二個工具欄按鈕)。從「源」選項卡中選擇您的日誌文件。這會顯示您捕獲的數據的圖形。
  • 右鍵單擊圖形並選擇「將數據另存爲...」您可以選擇CSV或TSV。

就是這樣。

+0

我需要一個程序來確保我的多線程應用程序能夠利用機器的所有內核,而不管它正在運行的操作系統以及處理器\內核利用率的百分比,以便分析應用程序性能,對此有何建議? – psp 2012-02-23 04:55:46

+0

如果這只是爲了測試(即它在受控環境中),那麼在機器閒置時,請使用閒置機器並使用perfmon來測量每個CPU的性能。它應該是微不足道的。然後運行您的應用程序並測量每個CPU的性能。您還需要測量每個進程的CPU利用率,以確保沒有任何後臺進程(如索引服務或病毒檢查程序)被踢入。如果出現問題,請禁用它們。 – arx 2012-02-23 14:44:36

+0

好的,但是有沒有辦法在文件中以某種方式獲取數據,以便我可以生成報告? – psp 2012-02-24 04:31:53

相關問題