소프트웨어/C# & ASP.NET

ThreadPool에서 사용 가능한 Thread의 개수는?

falconer 2008. 9. 21. 08:18

ThreadPool에서 사용 가능한 Thread의 개수는?

 

이번에는 이전에 소개한 ThreadPool에 관한 번외 글(?) 이라고 할 수 있는데요. 혹시 ThreadPool에서 사용 가능한 Thread의 최대 개수가 얼마인지 아시나요?

아마 이 글을 읽는 분들 중에는 ! 그거 모르는데~” 또는 뭐야! 그거 대략 몇 개인데, 사용 환경에 따라 설정할 수 있잖~!”라고 말씀하시는 분들도 계실 것입니다.

 

! 벌써 질문에 대한 답이 거의 나왔네요… -_-; 네 맞습니다. ThreadPool에서 사용가능한 Thread의 최대 개수는 사실 개발 환경에 따라 설정이 가능합니다.

하지만 ThreadPool은 기본적으로 25개의 Thread를 생성 할 수 있습니다. 음 그런데, 25란 숫자에 대해서 어떻게 신뢰할까요? 저 숫자는 어느 문서에서도 명시되어 있지 않습니다. 다만 MS에서 근무하시는 분들의 블로그 또는 그 외 ThreadPool에 대해 자세히 설명된 사이트를 통해서 얻은 정보입니다. 하지만 이 25란 내용은 아마 많은 분들께서 이미 알고 계신 내용일 꺼라고 예상이 되네요. 

참고로 이와 관련된 것 중에 ArrayList에 관한 것도 있습니다. ArrayList는 배열을 동적으로 처리하는 객체입니다. 원래 배열이라는 것이 항상 범위가 정해져 있어야 하는데, ArrayList는 동적으로 관리해주니, 개발자에게는 참으로 편리한 객체가 아닐 수 없죠.

그런데, ArrayList는 무슨 수를 써서 항상 지정된 범위를 가져야 하는 배열을 동적으로 처리 할 까요? 이것은 ArrayList는 내부적으로 처음에는 16개의 지정된 배열 범위를 갖기 때문입니다. 그리고 배열의 크기가 16개를 초과하게 되면 그 두 배의 크기로 배열 범위를 확장합니다.

 

다시 본론으로 돌아와서, ThreadPool은 위에서 말씀 드린 바와 같이 처음에는 25개의 최대치를 갖습니다. 그리고 이 최대치는 언제든지 수정 할 수가 있습니다.

 

int maxsync;

int maxAsync;

 

System.Threading.ThreadPool.GetMaxThreads(out maxsync, out maxAsync);

 

Console.WriteLine("{0},  {1}", maxsync, maxAsync);

 

Console.Read();

 

이 코드는 현재 ThreadPool에 설정되어 있는 최대 Thread의 개수를 가져오는 코드입니다. 그리고 이 코드에 이어진 아래 코드를 한번 보겠습니다.

 

maxsync = 100;

 

System.Threading.ThreadPool.SetMaxThreads(maxsync, maxAsync);

 

System.Threading.ThreadPool.GetMaxThreads(out maxsync, out maxAsync);

 

Console.WriteLine("{0},  {1}", maxsync, maxAsync);

 

Console.Read();

 

이 코드는 현재 ThreadPool의 최대 Thread 개수를 임의로 100라고 지정하는 코드입니다. 이 코드를 실행한 후 결과를 확인해 보면 분명 “100” 이라는 숫자가 나타납니다.

 

그런데, 이번 글을 통해서 제가 이야기하려고 하는 것은 이 내용이 아닙니다. 조금 다른 생각을 가지고 테스트를 해 본 게 있는데, 이 테스트는 위에서 언급 한 25라는 숫자는 .Net Framework의 버전에 따라 항상 동일할까? 하는 궁금증에서 출발한 것이었습니다.

여러분은 어떻게 생각하세요? 버전에 상관없이 동일 할까요? 아니면 버전 별로 다를까요?

그럼 이제 저의 테스트 결과를 보여 드리도록 하겠습니다.

 

CPU

Memory

.Net Framework v1.1

(VisualStudil.Net 2003)

.Net Framework v2.0

(VisualStudil.Net 2005)

.Net Framework v3.5

(VisualStudil.Net 2008)

Pantium 4

1G

25

50

500

2G

50

-

500

Dual Core

1G

50

500

-

2G

-

500

500

 

짜잔! 한눈에 보이시나요? 표의 본문에 보이는 숫자는 ThreadPoolThread의 최대 생성 수치입니다. 중간 중간에 “-”(하이픈)으로 표시된 부분은 마져 테스트를 해보지 못한 것입니다.

 

결과를 보면, 25라는 숫자는 P4 CPU로 구성된 장비의 .Net Framework v1.1. 그리고 메모리 1G에서만 적용되는 내용이었습니다. 어헛~ 이런

처음에는 메모리 크기의 영향만 받을 줄 알았는데, 테스트 하는 과정에서 CPU의 영향을 받는 다는 것도 새롭게 알게 되었습니다.

개발 환경의 Spec를 확인해서, 초기치 값을 스스로 늘리는 것 같습니다. 이건 CLR이 똑똑한게 아니라, 설계자들이 매우 꼼꼼한 것이라는 생각이 드네요.


출처 : http://zmeun.tistory.com/103