Quando chiami una funzione, un nuovo "spazio dei nomi" viene allocato nello stack. Ecco come le funzioni possono avere variabili locali. Man mano che le funzioni chiamano funzioni, che a loro volta chiamano funzioni, continuiamo ad allocare sempre più spazio nello stack per mantenere questa profonda gerarchia di spazi dei nomi.
Per frenare i programmi che utilizzano enormi quantità di spazio nello stack, di solito viene posto un limite tramite ulimit -s
. Se rimuoviamo tale limite tramite ulimit -s unlimited
, i nostri programmi saranno in grado di continuare a consumare RAM per il loro stack in continua crescita fino a quando il sistema non esaurirà completamente la memoria.
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.
Di solito, l'utilizzo di una tonnellata di spazio nello stack è accidentale o un sintomo di una ricorsione molto profonda che probabilmente non dovrebbe fare così tanto affidamento sullo stack. Quindi il limite dello stack.
L'impatto sulle prestazioni è minore ma esiste. Usando il time
comando, ho scoperto che l'eliminazione del limite dello stack ha aumentato le prestazioni di alcune frazioni di secondo (almeno su Ubuntu a 64 bit).
ulimit -s unlimited
fa crescere lo stack senza limiti.
Questo potrebbe impedire al tuo programma di andare in crash se scrivi programmi per ricorsione, specialmente se i tuoi programmi non sono ricorsivi in coda (i compilatori possono "ottimizzarli") e la profondità della ricorsione è grande.
la dimensione dello stack può essere davvero illimitato. _STK_LIM
è il predefinito , _STK_LIM_MAX
è qualcosa che differisce per architettura, come si può vedere da include/asm-generic/resource.h
:
/*
* RLIMIT_STACK default maximum - some architectures override it:
*/
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX RLIM_INFINITY
#endif
Come si può vedere da questo esempio, il valore generico è infinito, dove RLIM_INFINITY
è, ancora una volta, nel caso generico definito come:
/*
* SuS says limits have to be unsigned.
* Which makes a ton more sense anyway.
*
* Some architectures override this (for compatibility reasons):
*/
#ifndef RLIM_INFINITY
# define RLIM_INFINITY (~0UL)
#endif
Quindi immagino che la vera risposta sia:la dimensione dello stack PUÒ essere limitata da un'architettura, quindi la traccia dello stack illimitata significherà qualunque cosa _STK_LIM_MAX
è definito a, e nel caso sia infinito - è infinito. Per i dettagli su cosa significa impostarlo su infinito e quali implicazioni potrebbe avere, fai riferimento all'altra risposta, è decisamente migliore della mia.