Pourquoi sous Linux moderne, la taille de pile par défaut est si énorme - 8 Mo (même 10 sur certaines distributions)

10

Par exemple, sur OSX, c'est encore moins de 512k.

Y a-t-il une taille recommandée, compte tenu du fait que l'application n'utilise pas la récursivité et n'alloue pas beaucoup de variables de pile ?
Je sais que la question est trop large et dépend fortement de l'utilisation, mais je voulais tout de même demander, car je me demandais s'il y avait une raison cachée / interne / système derrière ce nombre énorme.


Je me demandais, car j'ai l'intention de changer la taille de la pile à 512 Ko dans mon application - cela semble toujours être un nombre énorme pour cela, mais il est beaucoup plus petit que 8 Mo - et entraînera une diminution significative de la mémoire virtuelle du processus, car je avoir beaucoup de threads (E / S).

Je sais aussi que cela ne fait pas vraiment de mal, bien expliqué ici : Taille de pile par défaut pour pthreads

Kiril Kirov
la source
Utilisez-vous un processeur 32 bits? Les processeurs X86_64 offrent un espace d'adressage virtuel pouvant atteindre 128 téraoctets (dans l'espace utilisateur), ce qui devrait être suffisant pour de nombreuses piles de 8 Mo.
Johan Myréen
@ JohanMyréen - non, c'est x64. Ce n'est pas grave, je me demandais juste, il n'y a pas vraiment de raison de faire ça (pour le moment).
Kiril Kirov
En 2019 et 8 MiB, c'est beaucoup de mémoire? Je ne pense pas. Le fait d'avoir une grande taille de pile par défaut facilite l'écriture de programmes avec récursivité. J'ai été très surpris de savoir que la taille de pile par défaut sous Windows n'est que de 1 Mo!
oldherl

Réponses:

15

Comme d'autres l'ont dit, et comme mentionné dans le lien que vous fournissez dans votre question, avoir une pile de 8 Mo ne fait rien de mal (à part consommer de l'espace d'adressage - sur un système 64 bits qui n'a pas d'importance).

Linux utilise des piles de 8 Mo depuis très longtemps; la modification a été introduite dans la version 1.3.7 du noyau, en juillet 1995. À l'époque, elle était présentée comme introduisant une limite, auparavant il n'y en avait pas:

Limitez la pile à une valeur par défaut raisonnable: root peut toujours augmenter cette limite si nécessaire. 8 Mo semblent raisonnables.

Sous Linux, la limite de pile affecte également la taille des arguments du programme et l'environnement, qui sont limités au quart de la limite de pile ; le noyau applique un minimum de 32 pages pour les arguments et l'environnement.

Pour les threads, si la limite de pile ( RLIMIT_STACK) est illimitée, pthread_createapplique ses propres limites aux piles de nouveaux threads - et sur la plupart des architectures, c'est moins de 8 Mo.

Stephen Kitt
la source
1
Wow intéressant. Je pensais que cela avait été introduit récemment. J'ai environ 200 threads (c'est un autre long sujet, alors ignorons-le pour le moment) et topmontre des résultats VIRT effrayants. Bien que, en creusant un peu plus, la majorité de cet espace d'adressage virtuel provient des arènes par thread (mémoire), pas de la taille de la pile, donc réduire la taille de la pile ne réduira pas considérablement la mémoire virtuelle. J'étais juste curieux de savoir pourquoi 8 Mo et pourquoi autant.
Kiril Kirov
Le "8 Mo" signifie simplement que la pile de chaque thread peut atteindre 8 Mo si le thread décide de l'utiliser. Mais la mémoire physique ne sera pas allouée tant que la mémoire n'est pas réellement utilisée. Si vos 200 threads utilisent 512 Ko chacun, vous utiliserez 100 Mo de RAM physique, et non 1,6 Go.
Guntram Blohm prend en charge Monica
Si vous n'échangez pas, la colonne RES topvous donne une bien meilleure réponse à "quelle mémoire ce processus utilise-t-il réellement" que VIRT.
kbolino
1
@Guntram l'OP en est bien conscient, voir le lien dans la question.
Stephen Kitt
1

8 Mo est la taille virtuelle de la pile. Une erreur de page se produit lorsque votre application essaie d'utiliser plus de pile que ce qui est actuellement physiquement alloué. Le gestionnaire de défauts de page du noyau se verra alors alloué une page physique , puis votre application continuera.

Voir /unix//a/280865/21212 pour une explication complète.

La réduction de la taille de votre pile ne devrait donc avoir aucun effet sur la réduction de l'utilisation de la mémoire physique de votre application.

Colin 't Hart
la source
1
J'ai déjà lié cette réponse dans ma question. J'ai également écrit que je suis au courant de cela, mais cela ne répond pas vraiment à la question. Merci quand même
Kiril Kirov
Je pense que vous devez revoir les prémisses de la question, et cette (non) réponse indique pourquoi. La mémoire virtuelle n'est pas une mémoire réelle. La taille de la pile peut être de 800 Mo et elle n'affectera pas l'utilisation réelle de la mémoire, sauf si votre application a créé plus de 8 Mo de trames de pile.
kbolino