Que fait "ulimit-s unlimit"?

il y a naturellement beaucoup de questions connexes sur l'attribution des cheminées

où sont de la pile et le tas?

Pourquoi y a-t-il une limite à la taille de la cheminée?

Taille de la pile et mémoire de tas

cependant sur diverses machines nix je peux émettre la commande bash

ulimit -s unlimited

ou la csh commande

set stacksize unlimited

comment cela change-t-il la façon dont les programmes sont exécutés? Y a-t-il des répercussions sur le rendement du programme ou du système (p. ex. pourquoi ne s'agirait-il pas de la valeur par défaut)?

dans le cas où plus de détails du système sont pertinents, je suis surtout concerné par les programmes compilés avec GCC sur Linux tournant sur le matériel x86_64.

39
demandé sur Community 2013-01-23 06:39:57

3 réponses

ce sera un peu pédant et vous en connaissez probablement déjà une partie, alors soyez indulgents. Lorsque vous déclarez des variables dans les programmes le noyau alloue de l'espace pour leurs données dans la pile. Vous pouvez dire au noyau de limiter l'espace dans la pile (ou le tas, d'ailleurs) qu'un programme donné peut utiliser, de cette façon un programme ne peut pas simplement prendre toute la pile. S'il n'y avait pas de limite sur la quantité de la pile qu'un programme pourrait utiliser, les bogues qui causeraient normalement un programme à crash détruirait le système entier. Le noyau qui plante un programme qui va au-dessus de l'espace alloué à la pile est appelé un "débordement de la pile".

L'un des bugs les plus courants avec la pile est la récursion excessive ou infinie. Étant donné que chaque nouvel appel à une fonction provoque la mise en place de toutes ses variables sur la pile, les programmes récursifs Non-tail optimisés peuvent rapidement épuiser l'espace de pile alloué à un processus par le noyau. Par exemple, cette fonction infiniment récursive résulterait en un crash du noyau une fois qu'il a dépassé l'espace alloué à la pile:

int smash_the_stack(int number) {
    smash_the_stack(number + 1);

    return 0;
}

L'épuisement de l'espace de la pile est traditionnellement une chose très effrayante, car il peut être utilisé dans quelque chose appelé" stack smashing", ou débordement de tampon de la pile. Cela se produit quand un utilisateur malveillant provoque intentionnellement un débordement de pile pour changer le pointeur de pile pour exécuter des instructions arbitraires de leur propre, au lieu des instructions dans votre propre code.

pour autant que performance, il ne devrait y avoir aucun impact. Si vous atteignez votre limite de pile par récursion en augmentant la taille de la pile n'est probablement pas la meilleure solution, mais sinon ce n'est pas quelque chose dont vous devriez vous inquiéter. Si un programme doit absolument stocker des quantités massives de données, il peut utiliser le tas à la place.

22
répondu Maxwell Hansen 2013-01-25 00:34:44

Mea culpa, la taille de la pile peut en effet être illimité. _STK_LIM est le par défaut , _STK_LIM_MAX est quelque chose qui diffère par architecture, Comme peut être vu 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 peut être vu de 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é par une architecture, alors trace de pile illimitée signifiera tout ce à quoi _STK_LIM_MAX est défini, et dans le cas où il est infini - il est infini. Pour plus de détails sur ce que cela signifie de le mettre à l'infini et quelles implications il pourrait avoir, se référer à l'autre réponse, il est beaucoup mieux que le mien.

1
répondu favoretti 2013-01-23 18:35:32

"ulimit -s illimité" permet à la pile de croître illimité. Cela peut empêcher votre programme de s'écraser si vous écrivez des programmes par récursion, surtout si vos programmes ne sont pas recursive queue (compilateurs peuvent "optimiser" ceux-ci), et la profondeur de la récursion est grande.

la réponse de @Maxwell Hansen contient presque la bonne réponse à la question. Cependant, il est enterré profondément dans une multitude de fausses allégations -- voir les commentaires. Ainsi, je me suis senti obligé d'écrire ceci réponse.

1
répondu Abhishek Anand 2017-02-14 15:32:58