2009-03-25 2 views
0

Es gibt eine Funktion, die sich rekursiv unendlich aufruft.Was passiert, wenn die Funktion während der unendlichen Rekursion den Stapelspeicher verlässt?

Diese Funktion hat auch einige Argumente.

Für jeden Funktionsaufruf werden die Argumente und die Rücksprungadresse auf den Stapel geschoben.

Für jeden Prozess gibt es eine feste Größe des Stapelspeichers, die nicht dynamisch wie Heap wachsen kann. Und ich denke, jeder Thread hat auch einen eigenen Stapel.

Wenn nun eine Funktion rekursiv unendlich aufgerufen wird und der Prozess nicht mehr im Stack-Bereich läuft, was passiert dann?

Wird Programmabsturz? Wird OS die Situation behandeln? Da es 4 GB Adressraum gibt, warum kann das OS nichts tun, um die Stackgröße zu erhöhen.

+0

Ich weiß nicht, ich dachte, es war süß. ++ – guns

Antwort

6

stack overflow.

In UNIX und kompatibel Prozess wird SIGSEGV oder SIGSTKFLT Signal werfen erhalten beendet.

In Windows wird der Prozess beendet, indem die Ausnahme STATUS_STACK_OVERFLOW ausgelöst wird.

+0

LOL, aus dem Titel, ich dachte diese Frage war ein Witz, in der navelgazing Tradition. – harpo

+0

meine obwohl genau ;-) frage nach stack overflow auf stackoverflow ;-) – vartec

+0

christ, titel im titel ... – annakata

-1

Das Programm wird abstürzen. Normalerweise wird der Stack von den Betriebssystemen begrenzt, um Fehler wie diese aufzufangen, bevor sie den gesamten verfügbaren Speicher verbrauchen. Unter Linux kann zumindest die Stapelgröße vom Benutzer geändert werden, indem der Befehl limit in der Shell ausgegeben wird.

+0

Es war nicht ich, wer Ihre Antwort downvoted hat, aber (zumindest auf x86) gibt es keine Möglichkeit, dass der Kernel ein Programm ohne Stapelspeicherplatz erkennen kann, solange der Stapelzeiger auf eine Seite verweist, die dem Prozess zugewiesen ist. –

+0

Aber Sie haben genau darauf hingewiesen, wie es gemacht werden kann: Der Stack wird auf Speicherseiten abgebildet, und am Stack-Limit gibt es eine geschützte (no-write) Seite. –

1

Für C++ zumindest, werden Sie in den Bereichen "undefined Verhalten" sein - ein bisschen wie die Twilight Zone könnte alles passieren.

Und wenn die Rekursion unendlich ist, was wird die Stapelgröße erhöhen? Besser früh als später.

+0

Und um einen feineren Punkt darauf zu setzen. Es gibt keine unendliche Rekursion auf einer Maschine mit begrenztem Speicher. Der Grundfall dieser Rekursion ist zufällig ein Stapelüberlauf. =) – JohnFx

0

Ein typisches Unix-Ergebnis ist ein Segmentierungsfehler. Ich weiß nichts über Windows.

0

Was wird passieren?

Nichts, auf das Sie jemals verlassen sollten.

Stellen Sie sicher, dass Ihre Algorithmen beendet werden. Das ist der einzig tragbare Ratschlag hier.

+0

definitiv einverstanden. Wenn der Algorithmus nicht beendet wird, ist es kein gültiger Algorithmus. – SirDemon

+0

Ich bekomme tatsächlich Downvotes zu diesem Thema? Ja, die Antwort von vartec sieht schöner aus. Aber da draußen gibt es Maschinen * ohne * Stackschutz. Die richtige Antwort ist also "Verhalten ist undefiniert". Die Welt ist größer als Windows und Linux ... – DevSolar

1

Abhängig von der Sprache erhalten Sie entweder eine Ausnahme (z. B. in Java) oder das Programm stürzt ab (in C, C++).

Normalerweise ist der Stapel relativ klein, weil das ausreicht, und ein Stapelüberlauf signalisiert einen Fehler. In Java können Sie den Stack-Bereich mit einer Befehlszeilenoption erhöhen, wenn Sie müssen.

Beachten Sie auch, dass funktionale Sprachen die Tail-Rekursion in der Regel in eine Schleife kompilieren, und in diesem Fall wird kein Stapelspeicherplatz verwendet.

0

Ja, Ihr Programm wird abstürzen. Es gibt keine Möglichkeit für das Betriebssystem, "mit der Situation umzugehen", außer zu verhindern, dass Ihr fehlerhafter Code andere Prozesse schädigt (was er bereits tut).Das Betriebssystem hat keine Möglichkeit zu wissen, was es war wirklich wollte Ihr Programm zu tun, anstatt, was Sie ihm gesagt haben, zu tun.

2

Dies ist nicht sprachunabhängig - es hängt sehr von der Sprache/Plattform ab.

In C# (oder einer beliebigen .NET-Sprache) erhalten Sie eine StackOverflowException, die ab .NET 2.0 nicht gefangen werden kann und den Prozess herunterfahren wird.

In Java (oder einer anderen JVM-Sprache) erhalten Sie eine StackOverflowError (als specified here).

Ich werde es auf andere Antworten lassen mit anderen Sprachen und Plattformen beschäftigen :)

0

Es gibt viele Antworten, was passieren wird, aber ich möchte die extrem einfache Lösung erwähnen:

Nur durch eine Turing-Maschine und lass deinen Code darauf laufen. Es wird viel Platz haben.

Verwandte Themen