스레드 스택 크기

각 새 스레드 또는 파이버는 예약된 메모리와 처음 커밋된 메모리로 구성된 자체 스택 공간을 받습니다. 예약된 메모리 크기는 가상 메모리의 총 스택 할당을 나타냅니다. 따라서 예약된 크기는 가상 주소 범위로 제한됩니다. 처음에 커밋된 페이지는 참조될 때까지 실제 메모리를 활용하지 않습니다. 그러나 시스템 총 커밋 제한(페이지 파일의 크기와 실제 메모리 크기)에서 페이지를 제거합니다. 시스템은 스택이 예약된 크기에서 한 페이지(스택 오버플로를 방지하기 위해 가드 페이지로 사용됨)를 뺀 값에 도달하거나 시스템이 메모리가 너무 부족하여 작업이 실패할 때까지 필요에 따라 예약 스택 메모리에서 추가 페이지를 커밋합니다.

가능한 한 작은 스택 크기를 선택하고 스레드 또는 파이버가 안정적으로 실행되는 데 필요한 스택을 커밋하는 것이 가장 좋습니다. 스택용으로 예약된 모든 페이지는 다른 용도로 사용할 수 없습니다.

스레드가 종료되면 스택이 해제됩니다. 스레드가 다른 스레드에 의해 종료되는 경우 해제되지 않습니다.

예약된 스택 메모리와 처음 커밋된 스택 메모리의 기본 크기는 실행 파일 헤더에 지정됩니다. 요청된 바이트 수를 예약하거나 커밋할 메모리가 충분하지 않으면 스레드 또는 파이버 만들기가 실패합니다. 링커에서 사용하는 기본 스택 예약 크기는 1MB입니다. 모든 스레드 및 파이버에 대해 다른 기본 스택 예약 크기를 지정하려면 모듈 정의(.def) 파일에서 STACKSIZE 문을 사용합니다. 운영 체제는 지정된 크기를 시스템 할당 세분성(일반적으로 64KB)의 가장 가까운 배수로 반올림합니다. 현재 시스템의 할당 세분성을 검색하려면 GetSystemInfo 함수를 사용합니다.

처음에 커밋된 스택 공간을 변경하려면 CreateThread, CreateRemoteThread 또는 CreateFiber 함수의 dwStackSize 매개 변수를 사용합니다. 이 값은 가장 가까운 페이지로 반올림됩니다. 일반적으로 예약 크기는 실행 파일 헤더에 지정된 기본 예약 크기입니다. 그러나 dwStackSize 에서 지정한 처음 커밋된 크기가 기본 예약 크기보다 크거나 같은 경우 이 새 커밋 크기는 1MB의 가장 가까운 배수로 반올림됩니다.

예약된 스택 크기를 변경하려면 CreateThread 또는 CreateRemoteThreaddwCreationFlags 매개 변수를 STACK_SIZE_PARAM_IS_A_RESERVATION dwStackSize 매개 변수를 사용합니다. 이 경우 처음에 커밋된 크기는 실행 파일 헤더에 지정된 기본 크기입니다. 파이버의 경우 CreateFiberExdwStackReserveSize 매개 변수를 사용합니다. 커밋된 크기는 dwStackCommitSize 매개 변수에 지정됩니다.

SetThreadStackGuarantee 함수는 스택 오버플로 예외 중에 사용할 수 있는 호출 스레드 또는 파이버와 연결된 스택의 최소 크기를 설정합니다.