Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Taille de la pile pour un process

4 réponses
Avatar
Zouplaz
Bonsoir, question bizarre (et surtout HS, si vous avez un newsgroup
francophone sur le sujet, faite le moi savoir) : quelle est la taille
maximale de la pile pour une application fonctionnant sous linux ?

Exemple avec une fonction récursive, à quel moment va-t-on se payer un
"stack overflow" ?? Je suppose que chaque process dispose de sa propre pile
(vrai ?).
"Qui" détermine sa taille et quelle en est donc la limite ?

merci

4 réponses

Avatar
J. Mayer
On Wed, 24 Sep 2003 21:27:33 +0000, Zouplaz wrote:

Bonsoir, question bizarre (et surtout HS, si vous avez un newsgroup
francophone sur le sujet, faite le moi savoir) : quelle est la taille
maximale de la pile pour une application fonctionnant sous linux ?

Exemple avec une fonction récursive, à quel moment va-t-on se payer un
"stack overflow" ?? Je suppose que chaque process dispose de sa propre pile
(vrai ?).
"Qui" détermine sa taille et quelle en est donc la limite ?

merci


La pile est virtuellement _très_ grande. Il me semble que la limite
est à 1 Go...
En fait, la pile est allouée par le kernel à la création du process
juste en dessous de l'espace kernel, c.a.d en dessous de 0xc0000000
(en mémoire virtuelle) sur ix86. Le code du process est mappé en
0x8000000, toujours sur ix86, les libs et les mmap "anonymes"
étant entre 0x40000000 et 0x7fffffff si mes souvenirs sont bons.
La pile est gérée par le kernel: quand on accède à une page mémoire
qui est sous la pile et au dessus de la dernière addresse mappée,
celà déclenche une faute de page. Le kernel étend alors la pile
jusqu'à cette addresse. Sa taille max est donc 1 Go - la taille
mappée pour le code (et les variables globales ?) du process.
Bien entendu, si des mmap sont fait dans l'espace compris
entre le code du process et la pile, celà réduit l'espace disponible
pour la pile.
Grosso modo, on peut en conclure que, sur un programme écrit avec
soin, la pile est "infinie", a moins d'avoir un niveau de récursion
très élevé, auquel cas la récursion est sans doute une méthode inadaptée,
quel que soit l'OS.

J'éspère avoir répondu relativement clairement à la question...

Avatar
Bertrand Masius
Bonjour,


Bonsoir, question bizarre (et surtout HS, si vous avez un newsgroup
francophone sur le sujet, faite le moi savoir) : quelle est la taille
maximale de la pile pour une application fonctionnant sous linux ?


Ce renseignement se trouve dans /usr/src/linux/include/linux/sched.h
il faut trouver la ligne :
#define _STK_LIMIT (8x1024x1024)
la pile est donc de maximum 8 Mo environ. je pense que c'est la limite
pour chaque processus.

Exemple avec une fonction récursive, à quel moment va-t-on se payer un
"stack overflow" ?? Je suppose que chaque process dispose de sa propre pile
(vrai ?).
Vrai.


"Qui" détermine sa taille et quelle en est donc la limite ?


C'est le noyau (le scheduler) qui gère la pile attribuée aux processus,
et qui l'augmente si nécessaire, jusqu'à la limite vue ci-dessus.

On peut modifier cette limite avec setrlimit (man setrlimit) ou
directement dans les sources du kernel et recompiler...

--
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément."

(Nicolas Boileau, l'Art poétique)

Avatar
J. Mayer
On Thu, 25 Sep 2003 01:57:43 +0200, Bertrand Masius wrote:

Bonjour,


Bonsoir, question bizarre (et surtout HS, si vous avez un newsgroup
francophone sur le sujet, faite le moi savoir) : quelle est la taille
maximale de la pile pour une application fonctionnant sous linux ?


Ce renseignement se trouve dans /usr/src/linux/include/linux/sched.h
il faut trouver la ligne :
#define _STK_LIMIT (8x1024x1024)
la pile est donc de maximum 8 Mo environ. je pense que c'est la limite
pour chaque processus.

Utilises-tu un kernel standard (venu de kernel.org ?)

Je ne vois cette constante ni dans le 2.4, ni dans le 2.6.
D'autre part, je suis étonné car ça n'a rien à voir avec le scheduler,
donc rien à faire dans sched.h ...
Dans les kernel que j'ai regardé, la fonction qui gère la pile
s'appelle expand_stack, dans mm/mmap.c
Elle ne regarde que deux limites:
- la taille de la stack doit être < à la limite RLIMIT_STACK
- la taille totale de la mémoire virtuelle du process doit être <
à la limite RLIMIT_AS
Le principe est le même dans le 2.4.19, sauf que la fonction est
inline dans include/linux/mm.h

Exemple avec une fonction récursive, à quel moment va-t-on se payer un
"stack overflow" ?? Je suppose que chaque process dispose de sa propre pile
(vrai ?).
Vrai.


"Qui" détermine sa taille et quelle en est donc la limite ?


C'est le noyau (le scheduler) qui gère la pile attribuée aux processus,
et qui l'augmente si nécessaire, jusqu'à la limite vue ci-dessus.


Non, c'est géré quand une faute de page survient, si l'addresse
demandée est au dessous d'une zone mappée avec le flag VM_GROWSDOWN

On peut modifier cette limite avec setrlimit (man setrlimit)
Oui.

On peut également utiliser une deuxième pile (ou plus) pour contourner
la limite RLIMIT_STACK et ne garder que la limite RLIMIT_AS.
Mais si le process a vraiment besoin de beaucoup de mémoire,
il vaut mieux faire des malloc...


Avatar
Richard Delorme

Ce renseignement se trouve dans /usr/src/linux/include/linux/sched.h
il faut trouver la ligne :
#define _STK_LIMIT (8x1024x1024)
la pile est donc de maximum 8 Mo environ. je pense que c'est la limite
pour chaque processus.

Utilises-tu un kernel standard (venu de kernel.org ?)

Je ne vois cette constante ni dans le 2.4, ni dans le 2.6.


dans le kernel standard 2.4.22, ligne 390 du fichier cité.


--
Richard