현대 리눅스에서 기본 스택 크기가 8MB (일부 배포판에서는 10 개)로 너무 큰 이유 사용하지 않고 많은 스택

예를 들어 OSX의 경우 512k 미만입니다.

앱이 재귀를 사용하지 않고 많은 스택 변수를 할당하지 않는다는 점을 염두에두고 권장되는 크기 있습니까?
나는 질문이 너무 광범위하고 사용법에 따라 크게 다르다는 것을 알고 있지만 이 거대한 숫자 뒤에 숨겨진 / 내부 / 시스템 이유 가 있는지 궁금해하고 있기 때문에 여전히 묻고 싶었습니다 .


내 앱에서 스택 크기를 512 KiB로 변경하려고 시도하면서 궁금합니다. 이것은 여전히 ​​큰 숫자처럼 들리지만 8MiB보다 훨씬 작습니다. 프로세스의 가상 메모리가 크게 줄어 듭니다. 많은 스레드 (I / O)가 있습니다.

나는이 알고 잘 여기에서 설명하는, 정말 다치게하지 않습니다 : 의 pthreads의 기본 스택 크기



답변

다른 사람들이 말했듯이 귀하의 질문에 제공하는 링크에서 언급했듯이 8MiB 스택을 가져도 주소 공간을 소비하는 것 외에는 64 비트 시스템에서 문제가되지 않습니다.

리눅스는 매우 오랫동안 8MiB 스택을 사용했다. 이 변경 사항은 1995 년 7 월 커널 1.3.7 버전 에서 도입되었습니다 . 이전에는 제한이 없었습니다. 이전에는 하나도 없었습니다.

스택을 정상적인 기본값으로 제한하십시오. root는 필요할 경우 항상이 제한을 늘릴 수 있습니다. 8MB가 합리적입니다.

Linux에서 스택 제한은 프로그램 인수 및 환경의 크기에도 영향을 미치며 스택 제한의 1/4로 제한됩니다 . 커널은 인수와 환경에 대해 최소 32 페이지를 시행합니다.

스레드의 경우 스택 제한 ( RLIMIT_STACK)이 무제한 인 pthread_create경우 자체 스레드 제한을 새 스레드 스택에 적용하며 대부분의 아키텍처에서 8MiB 미만입니다.


답변

8MB는 스택 의 가상 크기입니다. 응용 프로그램이 현재 물리적으로 할당 된 것보다 더 많은 스택을 사용하려고하면 페이지 오류가 발생합니다. 그런 다음 커널의 페이지 결함 핸들러가 실제 페이지 를 할당 한 후 응용 프로그램이 계속됩니다.

자세한 설명 은 https://unix.stackexchange.com/a/280865/21212 를 참조 하십시오 .

당신의 스택 크기를 줄이는 그래서 해야 응용 프로그램의 실제 메모리 사용량 감소에 영향을주지 않습니다.


답변