2009-03-25 3 views
0

무한히 반복적으로 자신을 호출하는 함수가 있습니다.무한 재귀 중에 함수가 스택 공간을 벗어나는 경우 어떻게됩니까?

이 함수에는 몇 가지 인수도 있습니다.

모든 함수 호출에 대해 인수와 반환 주소가 스택에 푸시됩니다.

각 프로세스마다 동적으로 힙처럼 커질 수없는 고정 크기의 스택 공간이 있습니다. 그리고 각 스레드에는 자체 스택이 있다고 생각합니다.

이제 함수가 반복적으로 무한대로 호출되고 프로세스의 스택 공간이 부족하면 어떻게됩니까?

프로그램 충돌이 발생합니까? OS가 상황을 처리합니까? 4GB의 주소 공간이있어서 OS가 스택 크기를 늘릴 수없는 이유는 무엇입니까?

+0

잘 모르겠다. 귀엽다고 생각했다. ++ – guns

답변

6

stack overflow.

과정 UNIX에서 호환이 SIGSEGV 또는 SIGSTKFLT 신호를 던지는 종료 얻을 것이다.

Windows의 경우 프로세스가 종료되어 예외 STATUS_STACK_OVERFLOW이 종료됩니다.

+0

LOL, 제목에서, 나는이 질문이 웃기는 전통에서 농담이라고 생각했습니다. – harpo

+0

내 생각은 정확히 ;-) stackoverflow에서 스택 오버플로를 묻습니다 ;-) – vartec

+0

그리스도, 단서가 제목에 ... – annakata

-1

프로그램이 중단됩니다. 일반적으로 스택은 운영 체제에 의해 사용 가능한 모든 메모리를 사용하기 전에 이러한 버그를 잡아 내기 위해 제한됩니다. 리눅스에서 최소한 스택 크기는 쉘에서 limit 명령을 실행하여 사용자가 변경할 수 있습니다.

+0

당신이 대답을 downvoted 내게 아니었지만 (적어도 x86에서) 스택 포인터가 프로세스에 할당 된 페이지를 가리키는 한 커널이 스택 공간이 부족한 프로그램을 감지 할 수있는 방법이 없습니다. –

+0

그러나 정확하게 수행 할 수있는 방법을 지적 했으므로 스택은 메모리 페이지에 매핑되고 스택 제한에는 보호 된 (쓰기 금지) 페이지가 있습니다. –

1

적어도 C++의 경우 "정의되지 않은 동작"영역에있을 것입니다. 황혼 영역처럼 약간의 문제가 발생할 수 있습니다.

재귀가 무한하다면 스택 크기를 늘리면 어떤 이점이 있습니까? 나중에 일찍 실패하는 것이 더 좋습니다.

+0

그리고 더 미세한 점을 넣으십시오. 제한된 메모리를 가진 머신에는 무한 재귀 같은 것이 없습니다. 그 재귀의 기본 경우는 단지 스택 오버 플로우가 발생합니다. =) – JohnFx

0

일반적인 유닉스 결과는 세분화 오류입니다. Windows에 대해 잘 모름.

0

어떻게 될까요?

당신이 의지해야 할 것은 없습니다.

알고리즘이 종료되었는지 확인하십시오. 이것이 여기있는 유일한 휴대용 조각입니다.

+0

은 분명히 동의합니다. 알고리즘이 종료되지 않으면 유효한 알고리즘이 아닙니다. – SirDemon

+0

나는 이것에 downvotes를 실제로 받는다? 예, vartec의 대답은 더 멋지게 보입니다. 그러나 스택 보호 기능이없는 시스템이 있습니다. 정답은 "행동이 정의되지 않았다"입니다. 세계는 Windows 및 Linux보다 큽니다 ... – DevSolar

1

언어에 따라 예외가 발생하거나 (예 : Java) 프로그램이 중단됩니다 (C, C++).

일반적으로 스택은 상대적으로 작기 때문에 충분하기 때문에 스택 오버플로가 오류를 표시합니다. Java에서는 커맨드 라인 옵션을 사용하여 스택 공간을 늘릴 수 있습니다.

또한 함수형 언어는 일반적으로 꼬리 재귀를 루프로 컴파일하므로이 경우 스택 공간이 사용되지 않습니다.

0

예, 프로그램이 중단됩니다. 버그 코드가 다른 프로세스 (이미 수행하고있는)를 손상시키는 것을 방지하는 것 이외에 OS가 "상황을 처리"할 수있는 방법이 없습니다.운영체제는 자신이 무엇인지 알 수있는 방법이 없습니다. 정말로은 사용자가 말한 것보다는 프로그램을 수행하기를 원했습니다.

2

언어에 구애받지 않습니다. 언어/플랫폼에 따라 크게 다릅니다.

C# (또는 기타 .NET 언어)에서는 StackOverflowException이 표시되며 .NET 2.0을 사용하면 해당 프로세스가 중단됩니다.

Java (또는 JVM 언어)에서 StackOverflowError (specified here)이 표시됩니다.

나는 다른 언어와 플랫폼 :) 다루는 다른 답변에 떠날거야

0

가 무슨 일이 일어날 지 답변을 많이하지만, 나는 매우 쉬운 솔루션 언급 할 :

단지로를 튜링 머신으로 코드를 실행할 수 있습니다. 그것은 충분한 공간을 가질 것입니다.

관련 문제