GNU/Linux >> Tutoriels Linux >  >> Linux

Que fait ulimit -s unlimited ?

Lorsque vous appelez une fonction, un nouvel "espace de noms" est alloué sur la pile. C'est ainsi que les fonctions peuvent avoir des variables locales. Comme les fonctions appellent des fonctions, qui à leur tour appellent des fonctions, nous continuons à allouer de plus en plus d'espace sur la pile pour maintenir cette hiérarchie profonde d'espaces de noms.

Pour limiter les programmes utilisant des quantités massives d'espace de pile, une limite est généralement mise en place via ulimit -s . Si nous supprimons cette limite via ulimit -s unlimited , nos programmes pourront continuer à engloutir de la RAM pour leur pile sans cesse croissante jusqu'à ce que le système finisse par manquer complètement de mémoire.

int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.

Habituellement, l'utilisation d'une tonne d'espace de pile est accidentelle ou le symptôme d'une récursivité très profonde qui ne devrait probablement pas dépendre autant de la pile. Ainsi la limite de pile.

L'impact sur la performance est mineur mais existe. Utilisation du time commande, j'ai trouvé que l'élimination de la limite de pile augmentait les performances de quelques fractions de seconde (au moins sur Ubuntu 64 bits).


ulimit -s unlimited permet à la pile de croître de manière illimitée.

Cela peut empêcher votre programme de planter si vous écrivez des programmes par récursivité, en particulier si vos programmes ne sont pas récursifs (les compilateurs peuvent les "optimiser") et que la profondeur de la récursivité est importante.


la taille de la pile peut en effet être illimité. _STK_LIM est la valeur par défaut , _STK_LIM_MAX est quelque chose qui diffère selon l'architecture, comme on peut le voir à partir de include/asm-generic/resource.h :

/*
 * RLIMIT_STACK default maximum - some architectures override it:
 */
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX           RLIM_INFINITY
#endif

Comme on peut le voir dans cet exemple, la valeur générique est infinie, où RLIM_INFINITY est, encore une fois, dans le cas générique défini comme :

/*
 * 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

Donc je suppose que la vraie réponse est - la taille de la pile PEUT être limitée par une architecture, alors une trace de pile illimitée signifiera n'importe quoi _STK_LIM_MAX est défini à, et dans le cas où c'est l'infini - c'est infini. Pour plus de détails sur ce que cela signifie de le définir sur infini et quelles implications cela pourrait avoir, reportez-vous à l'autre réponse, c'est bien mieux que la mienne.


Linux
  1. Qu'est-ce que c'est ?

  2. Que fait Exec 3 ?

  3. Qu'est-ce que Echo $ ? Faire??

  4. Que fait réellement Libgl_always_indirect=1 ?

  5. Qu'est-ce que . Commande ~/.bashrc Faire ? ?

Qu'est-ce que la pile LAMP ?

Que signifie "-" (double tiret) ?

Que fait "lc_all=c" ?

Que fait Bamfdaemon ?

Que retourne malloc(0) ?

Que produit pwd ?