2012-01-25 77 views
16

有沒有一種方法可以確定給定線程在哪個CPU上運行? 最好在C#中,但C++會做。如何確定一個線程運行在哪個CPU上?

的.NET過程和ProcessThread類似乎並沒有提供這一信息。

ETA澄清:

我們正在開發用於處理HTTP多播數據流,併產生多個視頻編碼器,服務器應用程序。這運行在具有12個物理內核的系統上,產生24個邏輯CPU(超線程)。通過TaskManager和ProcessExplorer,我們驗證了我們衍生的進程在邏輯CPU上均勻分佈。但是,我們看到很多(內核?)活動只在一個CPU上進行,這些CPU會消耗不尋常的CPU時間。我們試圖確定在這個特定的CPU上運行哪個進程/線程。 TaskManager和ProcessExplorer似乎都不提供這些信息。如果他們這樣做,請解釋如何獲得這些信息。

否則,我們正在考慮編寫我們自己的工具來獲取這些信息。這就是我們需要幫助的。

我們知道如何更改線程關聯(並且我們知道,不能保證線程將與任何CPU保持關聯,但在此特定情況下,佔用CPU的線程仍與僅有一個CPU關聯),但爲了這樣做,我們需要首先確定哪個進程/線程需要重新定位。這是這個問題的唯一目標。

我希望這有助於澄清問題。

+7

你想用這些信息解決什麼問題? –

+0

它僅被稱爲內核。所以你需要以核心模式編程。在MSDN上查找Kernal API。 – Nawaz

+2

如果某個線程在不同的時間在多個不同的CPU上運行,您希望它執行什麼操作? –

回答

2

MSDN,使用可以設置線程親和力ProcessThread.ProcessorAffinity屬性,但你不能得到它。默認情況下,線程沒有親和力(可以在任何處理器上運行)。

using System; 
using System.Diagnostics; 

namespace ProcessThreadIdealProcessor 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Make sure there is an instance of notepad running. 
      Process[] notepads = Process.GetProcessesByName("notepad"); 
      if (notepads.Length == 0) 
       Process.Start("notepad"); 
      ProcessThreadCollection threads; 
      //Process[] notepads; 
      // Retrieve the Notepad processes. 
      notepads = Process.GetProcessesByName("Notepad"); 
      // Get the ProcessThread collection for the first instance 
      threads = notepads[0].Threads; 
      // Set the properties on the first ProcessThread in the collection 
      threads[0].IdealProcessor = 0; 
      threads[0].ProcessorAffinity = (IntPtr)1; 
     } 
    } 
} 

同樣地Thread.SetProcessorAffinity也做同樣的事情。

+1

此外,線程會四處移動,所以即使您會得到答案,在您嘗試檢查某些內容時也不一定有效。 – TomTom

+0

是的,Process和ProcessThread上的ProcessorAffinity屬性是我的第一個希望,但正如你所指出的,我無法獲得它... – Harald

+0

@TomTom:是的,它們可以移動,但在我們的例子中,快照已經提供寶貴的信息。 – Harald

2

這是不可能的連續可靠的方法。 OS任務調度程序優化線程並拆分可用CPU內核之間的負載。通常情況下,一個線程可以在任何CPU上執行。此外,通過上下文切換,它也可以改變它的CPU。

如果需要針點特定主題或您只能將它的親和力,所以你可以有合理的希望這個進程/線程將特定的邏輯CPU上執行的過程。

+0

雖然技術上是正確的,但您的答案缺失很重要。瞭解您當前的CPU可以顯着**減少共享資源的爭用。是的,在極少數情況下,你會被打斷並轉移到其他核心。這意味着仍然需要同步。但是性能結果是無法比擬的。 –

+0

@KirillKobelev你可以請給我一些這方面的參考。我可以看到它在低級別上工作,但不知道如何從應用程序管理這個功能。你在說NUMA嗎? – oleksii

+0

考慮int cnt [num_cores]的性能; InterlockedIncrement(cnt [GetCurrCore()]);'vs只有一個計數器的簡單版本。 –

相關問題