GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa fa ulimit -s illimitato?

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.


Linux
  1. Cosa fa "lc_all=c"?

  2. Cosa fa ?

  3. Cosa fa Exec 3?

  4. Cosa fa Bamfdaemon?

  5. Cosa fa poll() con un timeout pari a 0?

Cos'è lo stack LAMP?

Cosa fa effettivamente Libgl_always_indirect=1?

Cosa fa . ~/.bashrc Comando Fare??

Cosa significa 'cd-'?

Cosa fa 'bash -c'?

Cosa fa esattamente init?