현대 리눅스에서 기본 스택 크기가 8MB (일부 배포판에서는 10 개)로 너무 큰 이유


10

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

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


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

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


32 비트 CPU를 사용하고 있습니까? X86_64 CPU는 최대 128 테라 바이트 (사용자 공간)의 가상 주소 공간을 제공하며, 이는 8MB의 스택에 충분합니다.
Johan Myréen

@ JohanMyréen-아니요, x64입니다. 큰 문제는 아닙니다. 궁금한 점이 있었지만 그럴만 한 이유가 없습니다 (현재).
Kiril Kirov

2019 및 8 MiB는 많은 메모리입니까? 나는 그렇게 생각하지 않습니다. 기본 스택 크기가 크면 재귀가있는 프로그램을 매우 쉽게 작성할 수 있습니다. Windows의 기본 스택 크기가 1MiB에 불과하다는 사실에 매우 놀랐습니다!
oldherl

답변:


15

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

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

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

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

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


1
와우, 흥미 롭군 나는 그것이 최근에 소개되었다고 생각했다. 약 200 개의 스레드가 있습니다 (또 다른 긴 주제이므로 잠시 무시하십시오) top. 무서운 VIRT 결과가 표시됩니다. 조금 더 깊이 파고 들더라도이 가상 주소 공간의 대부분은 스택 크기가 아닌 스레드 당 (메모리) 영역에서 가져 오므로 스택 크기를 줄이면 가상 메모리가 크게 줄어들지 않습니다. 8MiB가 왜 그렇게 많은지 궁금했습니다.
Kiril Kirov

"8MB" 는 스레드가 사용하기로 결정한 경우 각 스레드의 스택 8MB로 증가 할 있음을 의미 합니다. 그러나 실제 메모리는 실제로 메모리가 사용될 때까지 할당되지 않습니다. 200 개의 스레드가 각각 512KB를 사용하는 경우 1.6GB가 아닌 100MB 실제 램을 사용합니다.
Guntram Blohm은

스왑하지 않는 경우 RES 열은 topVIRT보다 "이 프로세스가 실제로 사용하는 메모리"에 대한 더 나은 대답을 제공합니다.
kbolino

1
@Guntram OP는 잘 알고 있습니다. 질문의 링크를 참조하십시오.
Stephen Kitt

1

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

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

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


1
내 질문 에이 답변을 이미 연결했습니다. 나는 또한 이것을 알고 있다고 썼지 만 실제로 이것이 질문에 대답하지는 않습니다. 어쨌든 감사합니다
Kiril Kirov

나는 당신이 질문의 전제를 다시 방문해야한다고 생각하며,이 (비) 대답은 이유를 지적합니다. 가상 메모리는 실제 메모리가 아닙니다. 스택 크기는 800MB가 될 수 있으며 응용 프로그램이 8MB 이상의 스택 프레임을 만들지 않는 한 실제 메모리 사용량에 영향을 미치지 않습니다.
kbolino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.