질문이 어렵네요...
아는데 까지만...
1. stack size가 1M로 되어있는 경우 쓰레드를 2000개 까지 생성 가능하다고 봐도 되는겁니까?
네 그렇게 봐도 될것 같습니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=186
2. 위의 서버 프로그램 옵션의 Max Stack Size를 0.5M Byte로 줄여버린다면, 서버 프로그램 실행에는 문제가 없나요?
또, 서버 프로그램의 프로젝트 옵션에서 줄여버려도, 동적으로 생성되는 Thread 역시 0.5 M Byte로 제한되나요?
2.1)
메인쓰레드에서 사용하는 stack이 512KByte를 넘어가지 않는다면 문제될것이 없겠죠
왠만한 경우 512KByte를 넘기는 경우는 잘 없을듯 한데...
2.2)
서버프로그램의 옵션을 0.5MByte 로 줄이면 TThread 역시 0.5MByte 로 제한되네요
모든 쓰레드가 아니라 TThread를 상속받아 생성되는 쓰레드에 한해서요..
그런데 대게 VCL(C++Builder나 Delphi)의 쓰레드는 TThread를 상속받아 만들어진것이라서...
VCL소스에서 TThread의 생성자 코드를 따라가보면
CreateThread를 호출하는곳이 있습니다.
constructor TThread.Create(CreateSuspended: Boolean);
{$IFDEF LINUX}
var
ErrCode: Integer;
{$ENDIF}
begin
inherited Create;
AddThread;
FSuspended := CreateSuspended;
FCreateSuspended := CreateSuspended;
{$IFDEF MSWINDOWS}
//요기서 BeginThread호출 하는데 두번째 StackSize를 0 으로 넘기네요
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
if FHandle = 0 then
raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
{$ENDIF}
{$IFDEF LINUX}
sem_init(FCreateSuspendedSem, False, 0);
ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
if ErrCode <> 0 then
raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
{$ENDIF}
end;
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
var ThreadId: LongWord): Integer;
var
P: PThreadRec;
begin
New(P);
P.Func := ThreadFunc;
P.Parameter := Parameter;
IsMultiThread := TRUE;
//stacksize가 항상 0 로 CreateThread호출
Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
CreationFlags, ThreadID);
end;
msdn 의 CreateThread 함수를 살펴보면
스택 size에 대해 다음과 같이 설명되어있습니다.
http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx
dwStackSize [in]
The initial size of the stack, in bytes. The system rounds this value to the nearest page. If this parameter is zero, the new thread uses the default size for the executable. For more information, see Thread Stack Size.
0 으로 넘어가면 default size로 할당된다는것 같네요
결론적으로 CreateThread를 호출할때 stacksize를 0 (zero)가 아닌 다른 원하는 값을 넘기도록 만들면
훨씬더 많은 쓰레드를 생성시킬수 있을것 같습니다.
3 , 4 번은?
잘 모르겠습니다. 찾아봐야 할듯...
그럼...
carrot318 님이 쓰신 글 :
: 안녕하세요.
: 몇 가지 질문이 있어서 이렇게 글을 올리게 되었습니다.
:
: 먼저, 상황부터 설명을 드리겠습니다.
: 소켓 컴포넌트를 이용, 서버 프로그램을 만들었는데, 이 프로그램의 최대 접속자 수를 알고 싶습니다.
: 소켓 컴포넌트는 인디를 상속 받아서 만들었으므로, 멀티 스레딩 소켓이구요..
: 클라이언트가 한명 붙을 때마다 스레드가 하나씩 생성됩니다.
:
: 이제, 이 부분을 공부하다 몇 가지 질문 사항이 나와서 이렇게 질문하게 되었습니다.
:
:
: 1.
: 어플리케이션에서 (32비트 윈도우 기준으로)최대 2G까지 메모리를 사용할 수 있는 걸로 알고있습니다.
: Thread 동적 생성시, 약 2000개 생성이 가능하다는 뜻이라고 봐도 되는겁니까?
: (프로젝트 옵션의 링킹 관련에서 Max Stack Size가 Default 1M byte로 가정을 한다면..)
:
:
: 2.
: 위의 서버 프로그램 옵션의 Max Stack Size를 0.5M Byte로 줄여버린다면, 서버 프로그램 실행에는 문제가 없나요?
: 또, 서버 프로그램의 프로젝트 옵션에서 줄여버려도, 동적으로 생성되는 Thread 역시 0.5 M Byte로 제한되나요?
:
:
: 3.
: 이 질문은 조금 당황스러운 질문일 수도 있는데, 궁금해서 여쭤보는 것입니다. (좀 바보같은 질문이긴 한데..)
:
http://gilgil.co.kr/bbs/view.php?id=lecture&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=513
: 이걸 보고 생각한건데...
: 위의 증상(?)이 벌어지는 이유가 조금 자세히 궁금합니다. 접근을 해야 메모리에 올라온다는 개념인거 같은데...
:
:
: 4. (추가)
: 동적으로 생성된 스레드가 사용하는 스택의 피크 사이즈를 구할 수 있습니까? '-'
: 최적화를 위해서 적절한 스택 사이즈를 구하고 싶은데, 피크 사이즈를 알고 싶어서요..
:
:
: 스택, 메모리 관련된 부분이 조금 오래 전에 공부한 부분이라 헷갈려서..-.-;; 바보가 되었네요..-_ㅠ