2010-02-13 9 views
5

Was ist "Stack Thrash"? Oder "ein Stapel Thrash"? (Da ich die Definition nicht kenne, bin ich mir nicht sicher, ob es ein zählbarer oder unzählbarer Begriff ist.)Was ist "Stapel Thrash"?

+0

Das ist kein Satz, den ich jemals gehört habe - was ist der Zusammenhang? Ich habe Leute sagen hören, sie hätten den Stack "zerstört", was bedeutet, dass sie auf einen schlechten Pointer zugegriffen und einen Teil des Stacks überschrieben haben, was dazu führte, dass das Programm auf seltsame und aufregende (und schwer zu debuggende) Wege abstürzte. –

+0

Ich habe normalerweise gehört, dass genannt "den Stapel zerschlagen". –

+0

Müll oder Thrash .. IMO kann es etwas wie Stapel smashing.nt sicher sein – sud03r

Antwort

4

Stack Thrashing ist wie Heap Thrashing, aber auf dem Stapel.

Dort, jetzt wird das erklärt.

Oh, willst du mehr Details huh?

Wenn Sie einen Stack-basierten Prozessor auf einem Prozessor emulieren, ist das nicht der Hammer.

Wenn Ihr C-Code mallocs und free jede andere Zeile Code ist, schlagen Sie den Haufen.

Der Punkt der Stack Thrashing als ein Problem ist, dass, wenn Sie Ihren Code profiliert, die CPU so ziemlich alles, was es ist Zeit, knallen und schieben.

Für Heap Thrashing das ist malloc() & kostenlos() wird Ihre # 1 & # 2 am häufigsten verwendeten Funktionen.

Jetzt einige CPUs (Rockwell machen einige) sind tatsächlich optimiert, um eine Stack-basierte Sprache in Hardware zu betreiben.

  • internen RAM, der die Top-N kilobtyes des Stapels innerhalb der CPU
  • Nur wenige Register
  • Alle Anweisungen

Seltsamer, die Java Virtual Machine ist ein Stapel basiertes Modell stapeln relativ Caches.

Das Ausführen einer wirklich dummen FORTH-Implementierung auf x86-Hardware wird den Stack durcheinander bringen. Die Art von Dingen, die Sie nach dem Lesen der Forth-Spezifikation schreiben könnten, also geben Sie x86-Maschinencode für vierte Anweisungen aus und optimieren ihn nicht. Forth Leute, ich entschuldige mich, ich weiß, dass deine Implementationen viel besser sind.

Postscript ist auch stapelbasiert, was frühe Postscript-Drucker aufregend macht: Sie hatten einen begrenzten RAM und langsame CPUs: und haben eine Stack-Thrashing-Sprache ausgeführt. Ich bin mir sicher, dass viel Aufwand in Sachen wie der originale Apple Laserwriter steckt, damit es besser läuft. Es hatte eine Motorola 68000 CPU mit (10ish) Megahertz und 1 MB RAM IIRC.

Wieder, Stapel Thrasher.

Hat das geholfen?

+0

Wenn ich die ursprüngliche Referenz wieder finde, werde ich diese Definition ausprobieren und sehen, ob sie passt.Aber es macht sicherlich Sinn, akzeptiert, dass ich "Thrash" geschrieben habe und adressiert die Frage und das Schlüsselwort, wie es ist, und stimmt mit der englischen Definition des Wortes überein. Vielen Dank, Tim. – talkaboutquality

1

Ich habe den Begriff nie gefunden, und die führenden Google-und Wikipedia-Hits beschreiben es nicht.

Es scheint jedoch analog Platte thrash, die schwer ineffiziente Verwendung einer Festplatte ist. Das trifft nicht direkt auf einen Stack zu, der keinem mechanischen entspricht. Vielleicht hängt es mit Seitenfehlern zusammen, die zu einer mechanisch ineffizienten Beziehung führen würden. Oder Stapelüberlauf korrigiert durch ein teures Executiv-/Kernel-Mittel.

Einige Kontext für den Begriff würde helfen.

+0

+1 ich bin großzügig ..: P – sud03r

2

Ich habe diesen Begriff im Zusammenhang mit Forth gesehen, wo der Mangel an Stack-Frame-Zugriff manchmal übermäßige Verwendung von Stack-Manipulationen ("thrashing the stack") erfordert, um bestimmte Wörter an die Spitze des Stapels zu bekommen.

Außerdem definiert This glossary es als "Häufige Stapel Expansion (Überlauf) und Kontraktion (Unterlauf)". Offensichtlich eine Definition, die weiterer Erklärung bedarf. Vielleicht kann jemand, der mit dem Cray X1 vertrauter ist, das erklären.

1

Ich hörte den Begriff "Stack Thrashing" im Zusammenhang mit Stack-Wachen, aber ich denke, es wird häufiger "Stack Smashing" genannt. Stack-Smashing bedeutet jede Art von Stack-Schwachstellen ausnutzen (wie buffer overflows). Aus diesem Grund wird der GCC-Stack-Schutz als SSP (Stack-Smashing Protector) bezeichnet.

+1

"thrash" <> "smash" – talkaboutquality

0

Ich hörte einmal "den Stapel" (ohne den ersten h) im Sinne von "korrumpieren den Stapel", z. wenn eine Funktion mehr Bytes von/auf den Stapel holt/legt, als dies der Fall sein sollte, verwirren sie den Stapelzeiger und machen es unmöglich, dass die andere Funktion danach korrekt arbeitet.

Es kann passieren, wenn Sie eine externe Funktion mit der falschen Aufrufkonvention aufrufen (zB wenn eine Funktion in einer DLL stdcall ist, aber Sie deklarieren als cdecl), oder wenn Sie eine Variadic-Funktion wie printf oder scanf eine falsche übergeben format string, so dass es mehr/weniger Bytes knallt als es könnte.

+0

"thrash" <> "trash" – talkaboutquality

+0

Ich weiß, aber da ich noch nie gehört habe, dachte ich, dass er es vielleicht falsch verstanden hat . –

1

Ich bin sicher, dass der Begriff ist umgangssprachlich und hat keine genaue Bedeutung. Haben Sie ein spezifisches Zitat oder einen Link zu dem Ort, an dem Sie es gesehen haben?

Ohne eine genaue technische Definition, ich schlage vor, dass es bedeutet, was auch immer der Benutzer des Begriffs meint es bedeutet. Es könnte angenommen werden, dass es auf jede Art von Missbrauch oder ineffizienter Verwendung eines Stapels angewendet wird, aber da bei einer Stapelmanipulation typischerweise nur der Stapelzeiger bewegt wird, wäre es schwer zu definieren, was "Abfall" bedeuten würde einfach normales und wünschenswertes Verhalten. In einer Multithreaded-Anwendung, in der jeder Thread seinen eigenen Stack hat, würde das Kontextwechsel auch ein schnelles Umschalten der Stacks beinhalten, aber dieses Ereignis wird vollständig und weniger eindeutig durch den Begriff "Task-Thrashing" beschrieben.