2009-08-03 2 views
2

나는 인텔 쿼드 코어 CPU를 가지고 있습니다.코어 수와 스폰 할 수있는 스레드 수 사이의 관계

내 컴퓨터에서만 사용되는 Winforms 응용 프로그램 (C# btw 사용)을 개발할 경우 몇 개의 스레드가 스폰 될 수 있습니까?

코어와 내가 동시에 실행할 수있는 스레드의 최대 수 사이에는 어떤 종류의 상관 관계가 있습니까? 한 번에 몇 개의 스레드가 실행되고 있는지 알아야합니까? 그렇다면 가능합니까? (최소 및 최대 스레드와 같은 속성이 있다는 것을 알고 있습니까?) 이 스레드 풀에 따라 달라집니다 (이 풀의 스레드 중 최대 개수가 변경됩니까?). 이것은이 게시물/스레드의 C# 부분입니다.

+0

몇 개의 스레드를 스폰하기를 원하십니까? 어떤 종류의 한계에도 관심이 있다면 아마 너무 많을 것입니다. –

+0

나는 어떤 것도 산란하지 않았다. 이것은 가설 적이면서 미래를위한 것입니다 (저는 매우 호기심 많고 호기심이 많습니다. 그리고 제가하는 많은 질문은 제가 현재하고있는 개발과 관련이 없습니다). 나는이 이론을 알고 싶다. – dotnetdev

답변

11

모두 에 달려 있습니다. 스레드가 활성 상태이고 (IO를 기다리지 않고) 100 % 시간이면 CPU 당 1 개의 스레드가 더 많다는 점이 거의 없습니다. 그러나 복잡한 수치 계산을 수행하지 않는 경우는 드뭅니다.

.Nets 스레드가 있습니다 http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

스레드 풀을 사용할 수 프로세서 당 250 작업자 스레드, 1000 I/O 완료 스레드의 기본 크기를 갖는다.

그래서, 내가 말할 것 외에 거의 권장 누군가가 당신을 줄 수있다 :

  • 측정 측정 측정.

어떤 시점에서 더 많은 스레드를 추가 할 때 은 컨텍스트 스위칭 및 동기화로 인해 더 느리게이됩니다.

+1

+1 스레드가있는 스위트 스폿을 찾는 일은 가장 간단한 프로파일 작업 중 하나 여야합니다. 당신은 대부분의 소비자 머신에서 약 20 데이터 포인트 만 시도하면 꽤 명확한 추세를 볼 수 있습니다. 일반적으로 10이면 충분합니다. 이 숫자는 스레드가 수행하는 작업과 시스템의 모든 구성 요소의 사양에 완전히 의존하므로 실제로는 유일한 방법입니다. – ShuggyCoUk

0

스레드와 코어간에 느슨한 상관 관계가 있지만 (스레드가 실제로 동시에 실행될 수있는 유일한 방법은 별도의 코어에서 실행되지만 해당 지식은 생각할 수있는 것보다 중요하지 않습니다) 실제 작업 운영 체제 스케줄러 (이 경우 Windows의 스레드 스케줄러)에 의해 수행됩니다.

만드는 스레드 수는 시스템마다 다를 수 있습니다. ThreadPool 클래스는 자신의 스레드를 생성하는 데 어떠한 제한도 가하지 않습니다. 그것은 내부적으로 스스로를 관리하는 스레드 풀을 가지고 있습니다. 이것들은 ThreadPool 클래스의 속성을 검사 할 때 볼 수있는 값입니다. 그러나 무제한 스레드를 생성해야한다는 것은 아닙니다. 결국 운영 체제는 실제로 스레드를 실행하는 데 소비하는 것보다 스레드 간의 전환에 더 많은 시간을 할애 할 것입니다. 벤치마킹을 통해 애플리케이션에 적합한 스레드 수를 파악하십시오.

정확히 무엇을하려고합니까?

0

얼마나 많은 스레드를 스폰 할 수 있습니까?

Waaay, 최적의 처리량을 위해 생성하려는 것보다 많은 시간 (수백 또는 수천 회).제가 알고 (Windows의 경우)

쓰레드 단위의 제한은 다음과 같습니다

    사용자 공간 스택에 대한
  • 16 비트 스레드 ID
  • 4~8킬로바이트 할당 (일반적으로 훨씬 더)
  • 비 페이징 커널 공간 문맥과 스택, 16킬로바이트
  • 같은 일이

DOTNET은 아마도 자신의 물건에 대한 스레드 당 오버 헤드의 무리를 추가합니다. GC 등을들 수있다. I는 WAG 사용하고자

한 수식은 다음

threads = 2 * (cpu cores + active disk spindles) 

최적의 수는 2 배 이내이다. 그것의. 이 이론은 필요한 스레드가 CPU 코어에 대한 proprotional (명백한 이유로)이지만 일부 스레드는 디스크 I/O에서 차단된다는 이론입니다. 2를 곱하면 다른 스레드가 차단되는 동안 CPU가 수행 할 작업을 제공합니다.

어쨌든 시작하여 측정하십시오. 작업자 스레드의 수는 나중에 문제를 조정하는 가장 쉬운 부분이므로 걱정할 필요가 없습니다.

0

처음에는 많은 스레드를 시작하여 어떤 한계에 도달했는지 궁금합니다. 다음과 같은 간단한 테스트 프로그램을 작성하여 시험해 보았습니다. 이제 저는 메모리가 제한 요소라고 가정합니다. 나는 1000 스레드를 실행할 수 있었지만, Thread.Sleep()이 없으면 시스템은 "조금은 반응하지 않게"되었다. 2000 스레드의 경우 1800 개의 스레드를 시작한 후에 메모리 부족 현상이 발생합니다. (인텔 코어 2 듀오 T5800 2.0 GHz의와 노트북, 3.0 지브 RAM 및 .NET 프레임 워크 3.5 SP1과 윈도우 XP SP3에서 실행되는 "몇 가지"응용 프로그램) 메모리 예외의 밖은

UPDATE 스레드의 스택으로 인해 발생합니다. 스레드 생성자에서 스택 크기를 지정하면 (나는 64kB를 사용했지만, 지금은 알지 못하는 최소 크기를 얻었습니다) 3500 개의 스레드 (Thread.Sleep())를 시작할 수있었습니다.

using System; 
using System.Linq; 
using System.Threading; 

namespace GeneralTestApplication 
{ 
    class Program 
    { 
     private static void Main() 
     { 
      Console.WriteLine("Enter the number of threads to start."); 

      while (!Int32.TryParse(Console.ReadLine(), out Program.numberThreads)) { } 

      Program.counters = new Int64[Program.numberThreads]; 

      Console.WriteLine("Starting {0} threads.", Program.numberThreads); 

      for (Int32 threadNumber = 0; threadNumber < Program.numberThreads; threadNumber++) 
      { 
       new Thread(Program.ThreadMethod).Start(threadNumber); 
      } 

      Console.WriteLine("Press enter to perform work on all threads."); 
      Console.ReadLine(); 

      Program.manualResetEvent.Set(); 

      Console.WriteLine("Press enter to stop all threads."); 
      Console.ReadLine(); 

      Program.stop = true; 

      Console.WriteLine("At least {0} threads ran.", Program.counters.Count(c => c > 0)); 

      Console.ReadLine(); 
     } 

     private static Int32 numberThreads = 0; 
     private static Int64[] counters = null; 
     private static readonly ManualResetEvent manualResetEvent = new ManualResetEvent(false); 
     private static volatile Boolean stop = false; 

     public static void ThreadMethod(Object argument) 
     { 
      Int32 threadNumber = (Int32)argument; 

      Program.manualResetEvent.WaitOne(); 

      while (!Program.stop) 
      { 
       Program.counters[threadNumber]++; 

       // Uncomment to simulate heavy work. 
       Thread.Sleep(10); 
      } 
     } 
    } 
} 
1

당신 을 측정해야한다. 즉, N 코어를 사용하면 보통 N + 12N 스레드 사이에서 산란하여 최상의 결과를 얻습니다. 그러나 당신은 측정해야합니다.