반응형


함수 호출(CALL)과 재귀 호출 그리고 스택 메모리


글. 알치 오상문 (sualchi@daum.net)

모바일 환경에는 재귀 호출(recursive call)을 금하는데 그 이유에 대해 잠시
살펴보겠습니다. 재귀 호출을 그냥 안 쓰면 그만이지만 참고 삼아 적어봅니다.
 
재귀 호출(recursive call)은 함수 내부에서 자신을 다시 호출하는 것입니다. 
재귀 호출은 특별한 경우에 코드를 간결하게 만들 수 있는 아주 유용한 방법입니다.
그러나 그 내면에는 시스템에 치명적인 메모리 에러를 유발할 잠재성이 있기에
재귀 호출이 허용되는 경우에도 주의해서 사용해야 합니다.
 
프로그램에서 함수를 호출하면(CALL) 다시 복귀할 주소나 상태(CPU 레지스터 값)
등을 스택 메모리에 저장한 다음에 호출할 함수가 있는 주소로 점프하게 됩니다.
또한 불려진 함수를 사용하기 위하여 일부 스택 메모리를 소모합니다. 결국 함수를
호출하는만큼 스택 메모리 사용량이 계속 증가하게 됩니다. 

[그림] 함수 재귀 호출을 할수록 스택 사용량이 증가된다

스택은 메모리 영역의 한 부분에 설정되고 실행 프로그램에는 PC 시스템에서도
수 KB 정도의 제한된 공간만 제공됩니다. 그러므로 계속 재귀호출이 이루어진다면
스택 메모리 영역을 다 소모해버리고 어느 순간에는 다른 메모리 공간을 불법으로
침범하는 경우가 발생하게 됩니다. 이것이 스택 오버플로우인데 치명적인 에러 중의
하나입니다.
 
만약 시스템이 스택오버플로우는 감시하는 경우라면 에러 메시지와 함께 프로그램이
종료 되겠지만 그렇지 않은 경우에는 시스템 충돌이 일어날 가능성이 있습니다.
(함수가 재귀 호출할 때 그 횟수를 제한하는 방법도 가능합니다만 스택 오버플로우를
막는 근본적인 방지책은 못 됩니다.)

 

반응형

+ Recent posts