2012-01-25 3 views
16

주어진 스레드가 실행되는 CPU를 결정하는 방법이 있습니까? C#에서는 가능하지만 C++에서는 가능합니다.스레드가 실행되는 CPU를 결정하는 방법은 무엇입니까?

.NET 프로세스 및 ProcessThread 클래스는이 정보를 제공하지 않는 것 같습니다.

ETA 해명 :

우리는 HTTP 멀티 캐스트 스트림을 처리하고 여러 비디오 인코더를 생성합니다 서버 응용 프로그램을 개발하고 있습니다. 이것은 12 개의 물리적 코어가있는 시스템에서 실행되므로 24 개의 논리적 CPU (하이퍼 스레딩)가 발생합니다. TaskManager와 ProcessExplorer를 통해 생성 된 프로세스가 논리적 CPU를 통해 균등하게 분산되어 있음을 확인했습니다. 그러나 우리는 CPU 시간을 비정상적으로 먹는 것을 방해하는 하나의 CPU에서만 많은 (커널?) 활동을보고 있습니다. 이 특정 CPU에서 실행중인 프로세스 (들)/스레드를 식별하려고합니다. TaskManager 나 ProcessExplorer 모두 해당 정보를 제공하지 않습니다. 그러한 정보가 어떻게 얻을 수 있는지 설명하십시오.

그렇지 않으면이 정보를 얻기 위해 자체 도구를 작성하려고합니다. 그리고 그것이 우리가 도움이 필요한 것입니다.

우리는 스레드 유사성을 변경하는 방법을 알고 있습니다.이 특별한 경우 CPU를 먹는 스레드는 하나의 CPU와 연관되어 있지만 스레드가 모든 CPU와 연결되어 있다는 보장은 없습니다.), 그렇게하기 위해서 우리는 먼저 재배치되어야 할 프로세스/스레드를 결정해야합니다. 이것이이 질문의 유일한 목적입니다.

문제를 명확히하는 데 도움이되기를 바랍니다.

+7

이 정보로 어떤 문제를 해결하려고합니까? –

+0

그것은 단지 kernal로 알려져 있습니다. 따라서 커널 모드로 프로그램해야합니다. 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를 알면 ** 공유 리소스를 버켓으로하여 경쟁을 크게 줄일 수 있습니다 **. 예, 드물게 중단되어 다른 코어로 이동합니다. 이것은 동기화가 여전히 필요하다는 것을 의미합니다. 그러나 perf 결과는 비교할 수 없습니다. –

+0

@KirillKobelev 당신이 나에게 이것에 대한 몇 가지 심판을 좀주세요. 낮은 수준에서 작동하는 것을 볼 수는 있지만 응용 프로그램에서이를 관리 할 수있는 방법이 확실하지 않습니다. NUMA 얘기하고있어? – oleksii

+0

'int cnt [num_cores];의 성능을 고려하십시오. InterlockedIncrement (cnt [GetCurrCore()]);'대 카운터가 하나있는 간단한 버전. –

관련 문제