2

OS는 기본 프로세스의 주소 공간에서 각 스레드에 얼마나 많은 스택 공간을 할당 할 것인지 결정하는 방법은 무엇입니까?운영 체제는 각 스레드에 얼마나 많은 스택 공간을 할당해야하는지 결정합니까?

그리고 스레드가 처음 할당 된 모든 스택 공간을 사용하고 동일한 프로세스의 다른 스레드가 사용하지 않은 공간이 많이 있다면 어떻게 될까요? 같은 종류의 스택 및 힙 스택과 힙 문제는 양쪽 모두 반대 방향으로 커짐으로써 해결된다는 것을 알고 있습니다.

OS가 스레드의 다른 메모리 공간을 할당했거나 스택 오버플로가 발생합니까?

+2

스레드가 스택을 소모하면 어떻게됩니까? 대답은 당신의 질문 위에 있습니다. –

+0

하지만 프로세스의 주소 공간에있는 다른 스레드가 사용하지 않은 공간이 많으면 여전히 스택 오버플로가 발생합니까? – amiageek

+1

예. 각 스레드의 스택은 별도이며 다른 스레드 스택과 독립적입니다. 그들을 섞는 것은 일반적으로 매우 나쁜 생각입니다. –

답변

4

OS를 결정하는 것은 프로그래머의 임무가 아닙니다. 예를 들어 Windows를 예로 들면, OS가 시작하는 스레드 인 첫 번째 스레드의 스택 크기는 실행 파일 헤더에 지정됩니다. IMAGE_OPTIONAL_HEADER.SizeOfStackReserve은 크기를 설정합니다. 어떤 도구를 사용하여 링커와 같은 헤더를 생성했는지를 알려주는 경우, /STACK option을 사용하여 크기를 설정합니다.

대부분의 빌드 도구는 합리적인 기본 크기를 사용합니다. 예약 크기는 1MB가 가장 일반적이며, 초기 커밋 크기는 4096 (1 페이지)입니다. 아니면 너무 합리적인 기본값, .NET 프로그램 infamously 전체 스택 공간을 앞에서 커밋합니다.

또한 스레드를 시작할 때 CreateThread과 같은 winapi 함수를 사용하여 크기를 설정하는 인수를 지정해야합니다. 기본값을 사용할 수 있습니다. 0을 지정하면 OS는 EXE 헤더에 지정된 크기를 사용합니다. 이것은 매우 보편적인데, 대부분의 프로그램이 스택을 크게 오버 사이즈 할 것이기 때문에 실제 크기는 거의 중요하지 않습니다. 재난으로부터 멀리 떨어져있게 중요합니다. 스택 오버 사이즈는 수요 페이징 운영 체제에서는 비용이 들지 않으며, 사용하는 제품에 대해서만 지불하면됩니다.

스택 공간이 부족하면 많은 경우 복구 할 수없는 오류가 발생하므로 프로세서에서 더 이상 전화를 걸 수 없습니다. 이 웹 사이트 이름의 이유. 그 주위에 다른 스레드가 있다는 것은 전체 스택을 소비하지 않았기 때문에 무의미한 것으로, 스택을 전환하는 것은 일반적으로 작동하지 않을 수 있습니다. 프로그램은 스택 공간에 포인터를 사용합니다. 값을 업데이트하기 위해 포인터를 찾을 수 없습니다.

+0

즉, 스레드가 기본 스택 공간을 활용하여 프로그래머가 원하는 공간을 넘어서면 다음 스레드의 스택 공간이 시작되어 프로그램에서 스택 오버플로가 발생하거나이 스택을 스왑 할 수 있습니다. 가상 메모리 맵을 변경 한 후 공간이 사용 가능한 메모리의 다른 위치에 메모리의 현재 위치에서 꺼내고 저장합니까? – amiageek

+2

질문에 답했다. 당신은 "교환"이 효과가 있다고 가정 할 필요가 없습니다. 그것은 할 수 없다. C 언어를 배우는 것이 기계를 이해하는 좋은 방법입니다. –

관련 문제