C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[186] [팁] Win32에서의 프로세스당 쓰레드 갯수 제한
박지훈.임프 [cbuilder] 21603 읽음    2001-08-31 19:58
임프랍니다.

암만 생각해도 쓸 만한 재밌는 것이 생각나지 않아서..
오늘은, Win32에서 한 프로세스당 생성할 수 있는 쓰레드의 갯수에 대한 이야기를 해보겠습니다.

제가 보아왔던 Win32 시스템에 대한 책들 어디에도 Win32 프로세스의 쓰레드 갯수에 한계가 있다는 말은
보지 못했기 때문에, 몇년 전까지 거의 무한정이거나.. 적어도 웬만한 작업을 하기에는 충분한 갯수만큼의
한계를 가질 것이라고 무작정(?) 간주를 하고 작업을 하고 있었습니다. (혹 제가 보지 못한 다른 책에는
언급이 되었는지 모르겠습니다만.)

그런데 재작년 말이었던가.. 무슨 간단한 소켓 서버를 만들려고 하다가, 쓰레드가 2000개 수준 이상으로는
더이상 생성되지 않는다는 것을 발견했습니다. 간편하게 쓸 수 있고 성능상 문제도 없고 해서 TThread를
써서 쓰레드를 생성하고 있었는데, 첫번째 Resume에서 에러가 발생했던가 해서 쓰레드가 더 생성이 안되더군요.

그래서 발끈(?)한 저는, 별도의 데모 프로젝트를 만들고, Win32 API 코딩으로 쓰레드를 계속 생성하는
간단한 테스트용 프로젝트를 만들어서 테스트를 해봤습니다. 역시 2천 몇개 정도밖에 생성이 안되더군요.
아뉘! 왜 이런 듣도 보도 못한 문제가 발생하는겨!

다음날 출근하다가였던가 문득 머리를 스치고 지나간 생각.. 그 전에 본 책 한권에서 그런 문맥이 있었던
걸 문득 떠올렸습니다. CreateThread의 두번째 인자인 쓰레드의 스택 사이즈에 대한 내용이었는데요,
머라고 되어있냐 하면...
"Specifies the stack size, and the stack consumes space within the process's virtual address space.
Also, Win32 will dynamically expand the stack if necessary up to a limit of 1MB.""
  - "Win32 System Programming 1st edition", Johnson M. Hart, Addison-Wesley

새로 생성하는 쓰레드의 스택 크기를 지정해주더라도, 필요한 경우 쓰레드의 스택은 1MB까지는 자동으로
늘어난다는 말이지요. 그렇다면, 다시 말해 쓰레드가 생성될 때마다 쓰레드당 1MB씩의 메모리가 미리 할당
되어서, 다른 쓰레드가 침범할 수 없게 된다는 말이 됩니다.

처음 이 문장을 읽을 때는 그냥 무심코 넘겼었는데, 다시 계산해보니.. 1MB X 2000이면 대략 2GB 정도가
되지 않습니까. 2GB... Win32에서 프로세스의 메모리 공간 4GB 중, dll 매핑을 위해 예약된 상위 2GB를
제외하면 실제로 어플리케이션이 쓸 수 있는 메모리 공간이 바로 2GB이지요.

그러면 앞뒤가 맞지요? 정리하면, Win32에서는 쓰레드를 하나 생성할 때마다 스택을 1MB씩 할당하므로,
2000개 정도의 쓰레드밖에 못만든다는 얘기가 됩니다. 이론적으로는 2048개까지 되어야 하지만, 프로세스의
디폴트 쓰레드 1개를 카운트하지 않았고, 또 스택 외에도 힙 영역과 코드 영역이 메모리를 사용하므로
2000개를 몇개 정도 넘어서는 정도가 됩니다.

하지만.. 정말 쓰레드를 2000개 이상 만들어야 하는 경우에는 어이 하나요. 그 이후에 오랜 시간이 흐른
후에, 방법을 찾아냈습니다. 1MB로 고정되어 있다는 것은 말이 안된다... 이걸 바꾸는 방법이 있을 것이다..
그렇게 생각하고 찾아봤었는데.. 쩝~ 당시에는 못찾았구요. 오늘에야 해답을 찾았습니다.

결론부터 말하자면, 책의 표현이 좀 잘못되어 있었습니다. Win32에서의 쓰레드 스택의 최대 크기는 1MB가
아니라, 단지 프로세스의 최대 스택 크기와 같이 설정되는 거였습니다. 별다른 설정을 하지않으면 프로세스의
최대 스택 크기는 1MB로 설정됩니다. 이 프로세스의 최대 스택 크기를 작게 줄이면 쓰레드가 사용하는 스택의
최대 크기도 함께 줄어들고, 결과적으로 쓰레드를 더 많이 만들 수 있다는 이론이 성립되지요.

실제로 아까 테스트해본 결과, 1MB로 설정된 기본 최대 스택 크기를 512kB로 줄여보니 4000개 정도까지
쓰레드가 생성되더군요. ^^ C++Builder에서 최대/최소 스택 크기 설정은 Project Option -> Linker 탭 ->
Max stack size 에서 설정합니다. (16진수로 되어 있으므로, 512kB로 줄이고자 할 경우 0x00080000으로
설정해야 합니다.)

물론, 프로세스의 최대 스택 크기를 더 줄이면 그만큼 더 많은 쓰레드를 생성할 수 있습니다.
하지만, 지나치게 줄이는 경우, 그만큼 무시무시한 Stack overflow 에러가 나기 쉽습니다. (도스시절에
프로그래밍을 해보신 분은 이 에러에 익숙하시겠지만 윈도우즈에서는 재귀호출을 하지 않는 한 보기 힘들죠.)

그럼 이만...

+ -

관련 글 리스트
186 [팁] Win32에서의 프로세스당 쓰레드 갯수 제한 박지훈.임프 21603 2001/08/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.