2010-02-13 13 views
5

Che cos'è lo "stack thrash"? O "uno stack thrash"? (Poiché non conosco la definizione, non sono sicuro che si tratti di un termine numerabile o non numerabile.)Che cos'è lo "stack thrash"?

+0

Questa non è una frase che abbia mai sentito: qual è il contesto? Ho sentito dire che hanno "distrutto lo stack", nel senso che hanno accesso a un puntatore non valido e hanno sovrascritto parte dello stack, causando il crash del programma in modi strani ed eccitanti (e difficili da debug). –

+0

Ho sentito di solito quello chiamato "distruggere lo stack". –

+0

trash o thrash .. IMO può essere qualcosa di simile allo smashing.nt sicuro – sud03r

risposta

4

Lo stack thrashing è come un ammasso di heap, ma in pila.

Lì, ora è spiegato.

Oh, vuoi più dettagli eh?

Se si emula un processore basato su stack su un processore che non si sta battendo lo stack.

Se il vostro codice C è malloc e libera ogni altra riga di codice, state distruggendo il mucchio.

Il punto di stack thrashing come un problema è che se si profila il codice, la CPU spende praticamente tutto il tempo che scoppia e spinge.

Per heap thrashing che è malloc() & gratuito() essendo le funzioni più utilizzate # 1 & # 2.

Ora alcune CPU (alcune di esse sono in realtà rockwell) sono effettivamente ottimizzate per eseguire un linguaggio basato su stack nell'hardware.

  • RAM interna che memorizza nella cache le prime N kilobtyes della pila all'interno della CPU
  • alcuni registri
  • Tutte le istruzioni pila relativa

Stranamente, la Java Virtual Machine è un modello basato stack.

L'esecuzione di un'implementazione FORTH davvero stupida sull'hardware x86 può danneggiare lo stack. Il tipo di cosa che si potrebbe scrivere dopo aver letto la specifica Forth, quindi si emette il codice macchina x86 per le istruzioni successive e NON lo si ottimizza. Avanti ragazzi, mi scuso, so che le vostre protesi sono molto meglio.

Anche Postscript è basato sullo stack, il che rende entusiasmanti le prime stampanti postscript: avevano RAM limitata e CPU lente: e gestivano un linguaggio che accelerava lo stack. Sono sicuro che sono stati fatti molti sforzi come l'originale Apple Laserwriter per farlo funzionare meglio. Aveva una CPU Motorola 68000 in esecuzione a (10ish) megahertz e 1Mb di ram IIRC.

Anche in questo caso, stack thrashers.

È stato di aiuto?

+0

Se trovo di nuovo il riferimento originale, darò una prova a questa definizione per vedere se è adatta.Ma ha certamente senso, accetta di aver scritto "thrash" e affronta la domanda e la parola chiave as-is, ed è coerente con la definizione inglese della parola. Grazie mille, Tim. – talkaboutquality

1

Non ho mai incontrato il termine, e gli hit di Google e Wikipedia non lo descrivono.

Tuttavia, sembra essere analogo al disco thrash che è un uso pesante e inefficiente di un disco. Questo non è direttamente applicabile a una pila, che non corrisponde a nulla di meccanico. Forse è legato al fault della pagina che risulterebbe in una relazione meccanicamente inefficiente. O stack overflow corretto da qualche costoso rimedio executive/kernel.

Un po 'di contesto potrebbe essere d'aiuto.

+0

+1 io sono generoso ..: P – sud03r

2

Ho visto questo termine usato nel contesto di Forth, dove la mancanza di accesso allo stack frame richiede talvolta un uso eccessivo delle manipolazioni dello stack ("thrashing the stack") per arrivare a certe parole in cima allo stack.

Inoltre, This glossary lo definisce come "Frequenza di espansione dello stack (overflow) e contrazione (underflow)". Chiaramente una definizione che necessita di ulteriori spiegazioni. Forse qualcuno che abbia più familiarità con Cray X1 può spiegare.

1

Ho sentito il termine "stack thrashing" nel contesto di stack guard, ma penso che sia più spesso chiamato "stack frantumazione". Stacking smashing significa qualsiasi tipo di vulnerabilità dello stack exploiting (come buffer overflows). Ecco perché la protezione dello stack GCC si chiama SSP (Stack-Smashing Protector).

+1

"thrash" <> "smash" – talkaboutquality

0

Ho sentito una volta "cestinare lo stack" (senza la prima h) nel senso di "corrompere lo stack", ad es. quando una funzione ottiene/mette più byte da/sullo stack di quanto dovrebbe, rovinando il puntatore dello stack e rendendo impossibile che l'altra funzioni funzioni correttamente in seguito.

Può accadere quando si chiama una funzione esterna con la convenzione di chiamata errata (ad esempio quando una funzione in una DLL è stdcall ma la si dichiara come cdecl), o quando si chiama una funzione variadica come printf o scanf che passa una errata formatta la stringa, quindi fa apparire più/meno byte di quanto potrebbe.

+0

"thrash" <> "trash" – talkaboutquality

+0

Lo so, ma poiché non l'ho mai sentito ho pensato che forse poteva averlo manomesso . –

1

Sono sicuro che il termine è interamente colloquiale e non ha un significato preciso. Hai una citazione o un link specifico a dove l'hai visto?

Senza alcuna definizione tecnica precisa, suggerisco che ciò significa che qualsiasi cosa l'utente del termine pensa che significhi. Potrei essere applicato a qualsiasi tipo di abuso o uso inefficiente di uno stack, ma dal momento che tutto ciò che di solito accade in una manipolazione dello stack è che il puntatore dello stack viene spostato sarebbe difficile definire cosa significherebbe "cestinare" che non era comportamento semplicemente normale e desiderabile.

In un'applicazione multi-thread in cui ogni thread ha il proprio stack, il cambio di contesto implicherebbe anche il cambio rapido di stack, ma quell'evento è interamente e meno ambiguamente descritto dal termine "task-thrashing".