현대 리눅스에서 기본 스택 크기가 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.