- CVI 정보나눔(www.cvi.kr)
- 스터디
- 강좌,팁,유용한것
강좌,팁
글 수 116
본 글은 "http://www.tipssoft.com/"의 게시글을 가져왔습니다.
멀티쓰레드 작업 할 때, 유용하게 사용 될 수 있는 정보인것 같아 데리고 왔습니다!
=====================================================================================
글 제목 : [팁앤정보] 스레드(Thread)는 몇개나 만들수 있다고 생각하십니까?
글쓴이 : 대천명
안녕하세요.
사고뭉치 프로그래머의 경험담을 소개하고자 간단한 글을 작성해봤습니다. 다소
주관적인 내용이니, 편하게 읽어주시면 감사하겠습니다. ^^;;
프로젝트를 하다 Thread를 많이 만들어야 하는 경우가 발생했습니다. 별 생각없이
스레드를 1000개정도까지 만들어보고 "아~ 잘되는구나!" 하고 테스트를 마무리하고
현장에 투입했습니다.
스레드를 1000개정도까지 만들어보고 "아~ 잘되는구나!" 하고 테스트를 마무리하고
현장에 투입했습니다.
몇일이지나, 프로그램이 오류가 난다는 보고가 오기 시작했습니다. 처음에는
대수롭지않게 생각했지만 테스트 결과 스레드가 시스템의 상태에 따라 다소
차이는 있지만 1700 ~ 1850개정도 생성되면 더이상 생성하지 못하는 것이였습니다.
대수롭지않게 생각했지만 테스트 결과 스레드가 시스템의 상태에 따라 다소
차이는 있지만 1700 ~ 1850개정도 생성되면 더이상 생성하지 못하는 것이였습니다.
MSDN을 살펴보니, 스레드를 생성하면 기본적으로 1 Mbytes 가량의 스택이 스레드를
위해서 할당된다는 이야기가 있었습니다. ㅡ.ㅡ;; 계산을 해보니, 1700개의
스레드가 생성되면 약 1700 MBytes 즉, 약 1.7 GBytes가 스레드를 위해서 할당된다는
뜻이였습니다. 프로세스에 할당되는 기본 메모리 최대한도가 2 GBytes 이니, 더이상 스레드를
생성할수 없는 이유가 메모리 부족이라는것이였습니다.
위해서 할당된다는 이야기가 있었습니다. ㅡ.ㅡ;; 계산을 해보니, 1700개의
스레드가 생성되면 약 1700 MBytes 즉, 약 1.7 GBytes가 스레드를 위해서 할당된다는
뜻이였습니다. 프로세스에 할당되는 기본 메모리 최대한도가 2 GBytes 이니, 더이상 스레드를
생성할수 없는 이유가 메모리 부족이라는것이였습니다.
실제로 스레드가 하는 일이 단순하여 1 Mbytes의 메모리를 사용할 필요가 없을듯하여
도움말을 자세히 읽어보니 스레드에 할당되는 스택의 할당 크기를 수정하고 싶다면
(.DEF) file 에서 STACKSIZE를 수정하면 된다는 것이였습니다. 하지만, MFC를 사용하는
Visual C++ 프로젝트에는 DLL 형식이 아닌이상 .DEF파일이 없습니다. 당황해서 헤매다가
Project Settings 화면에서 해당 항목을 찾았습니다. +_+;;
도움말을 자세히 읽어보니 스레드에 할당되는 스택의 할당 크기를 수정하고 싶다면
(.DEF) file 에서 STACKSIZE를 수정하면 된다는 것이였습니다. 하지만, MFC를 사용하는
Visual C++ 프로젝트에는 DLL 형식이 아닌이상 .DEF파일이 없습니다. 당황해서 헤매다가
Project Settings 화면에서 해당 항목을 찾았습니다. +_+;;
아래의 그림에서 빨간색 사각형에 크기를 명시하면 그 크기로 기본 스택의 크기가
수정되는것이였습니다. 기본적으로는 저곳에 아무런 값도 명시되어 있지 않습니다.
수정되는것이였습니다. 기본적으로는 저곳에 아무런 값도 명시되어 있지 않습니다.

1 Mbytes = 1024 Kbytes = 1024*1024 bytes = 1048576 bytes입니다. 이 값을 16진법으로
바꾸어보면 0x100000 입니다. 따라서 기본 스택의 크기가 1Mbytes이기 때문에 위 그림의
빨간색 사각형에 0x100000 값이 적혀있는것과 마찬가지 입니다.
결과적으로 스레드의 수를 두배로 늘리고 싶다면 기본적으로 할당되는 스레드의 스택크기를
절반으로 줄이면 됩니다. 즉, 0x80000 이라고 명시하면 됩니다. ( 0x50000 이라고 생각하시는
분은 16진수라는것을 기억하시기 바랍니다. ㅡ.ㅡ;; ) 마찬가지로 4배더 많이 생성하고
싶다면 0x40000 이라고 명시하시면 됩니다.
절반으로 줄이면 됩니다. 즉, 0x80000 이라고 명시하면 됩니다. ( 0x50000 이라고 생각하시는
분은 16진수라는것을 기억하시기 바랍니다. ㅡ.ㅡ;; ) 마찬가지로 4배더 많이 생성하고
싶다면 0x40000 이라고 명시하시면 됩니다.
혹시, 더 좋은 방법이 있거나 다른 의견이 있다면 리플로 의견남겨주세요. ^^;;
P.S 자신이 아는것을 남에게 말한다는 것은 용기가 필요합니다. 비난도 감수해야하고 웃음거리가
될수도 있습니다. 하지만, 자신의 이야기가 다른 사람에게 희망이 될수 있다는 기대를
가지고 글을 남겨봅니다. 작은 정보라도 서로 공유했으면 좋겠습니다!!
===================================================================================
좋은 정보네요.
또 팁스소프트 사이트를 알려주셔서 감사합니다. 좋은 자료들이 많네요.
감사합니다.