簡體   English   中英

如何確定線程運行的CPU?

[英]How to determine which CPU a thread runs on?

有沒有辦法確定給定線程在哪個CPU上運行? 最好是在C#中,但C ++會這樣做。

.NET Process和ProcessThread類似乎不提供此信息。

ETA澄清:

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

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

我們知道如何更改線程親緣關系(我們知道無法保證線程將與任何CPU保持關聯,盡管在這種特殊情況下,占用CPU的線程仍然只與一個CPU相關聯),但是為了做到這一點,我們需要首先確定需要重新定位WHICH進程/線程。 這是這個問題的唯一目標。

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

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做同樣的事情。

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

如果您需要精確定位一個線程或一個進程,您只能分配它的親和性,那么您可以合理地希望進程/線程將在特定的邏輯CPU上執行。

從Vista / Server2003開始,您可以PInvoke GetCurrentProcessorNumber() Windows API方法( https://docs.microsoft.com/en-gb/windows/desktop/api/processthreadsapi/nf-processthreadsapigetcurrentprocessornumber )。

顯然只有Windows,如果你計划支持其他平台,那就不理想了。

我不確定OP的用例是否理想,但在嘗試創建一個在系統中保證唯一的時間戳時,它可能是合理的/有用的,即使所有處理器都在同一時間計算一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM