2014-08-31 4 views

답변

1

짧은 대답은 성장을 위해 스택과 힙을 모니터링해야하지만 메모리는 유한하다는 것을 기억해야합니다. 당신은 항상 방에서 실행할 수 있습니다.

우선, 잘못된 가정을 수정해야합니다. 스택은 프로그래밍 언어의 구성 요소가 아닙니다. 이것은 하드웨어의 구현입니다. 따라서 오버런으로부터 보호하기위한 솔루션은 환경에 특화 될 것입니다.

또한 스택 구현은 하드웨어마다 다를 수 있습니다. x86 세계에서는 스택이 커집니다. 페이징은 자주 오버런이 발생하면 페이지 폴트가 발생하는 방식으로 스택을 분리하는 데 사용됩니다. 이렇게하면 운영 체제가 문제의 프로세스를 처리하거나 중지 할 수 있습니다. ref : What is the direction of stack growth in most modern systems?

이론적으로 스택 오버런은 오류를 일으킬 필요가 없습니다. 모니터 나 다른 메커니즘이 오류를 발견하면 스택에 메모리를 추가하고 더 많은 공간을 허용하여 처리 할 수 ​​있습니다. 이것은 연속적인 메모리 공간이 있거나 연속적인 메모리 공간을 가상으로 적용 할 수있는 방법이라고 가정합니다. 그러나 이것은 실제로 문제를 해결하지 못합니다. 그것은 단지 충돌을 지연시킨다 (재귀가 계속된다고 가정 할 때). 결국 메모리가 부족하거나 힙과 충돌합니다.

직접 질문에 대답하려면 :

재귀 스택을 사용하여 사용하는 모든 프로그램을합니까? - CALL 및 RET (또는 동급)에 스택을 사용하는 하드웨어에서 실행되는 모든 progarm은 재귀를 사용하지 않고도 스택을 사용합니다.

스택이 어떻게 커질까요? - 하드웨어에 따라 다릅니다. 프로세서에 대한 백서를 찾으십시오.

스택 공간이 부족하면 오류가 발생합니까? - 반드시 그런 것은 아닙니다. 하드웨어 또는 OS가 오류를 일으키지 않으면 프로그램이 계속 실행됩니다. 이 경우 메모리 손상이 가장 많이 발생합니다. 그것은 모든 종류의 이상한 행동과 아마도 세그 폴트를 일으킬 것입니다.

어떻게 이런 일이 발생하지 않도록 할 수 있습니까? - 하드웨어 및 상황에 따라 다릅니다. 일반적으로 작업 전환에 대한 각 프로세스의 스택 무결성을 검사합니다. 또한 작은 오버런을 안전하게 허용하도록 스택을 패딩하십시오. 오버런이 발생하면 더 많은 연속 메모리를 할당하거나 스택을 재배치해야합니다.

가상 메모리 모델이없는 경우 연속 메모리를 할당하는 것이 쉽지 않습니다. 그것 없이는 성장을 위해 공간을 명확하게 유지해야하며,이 경우 스택을 스택에 할당하여 시작할 수도 있습니다.

희망이 도움이됩니다.