Différence entre stack et heap

Signaler
Messages postés
255
Date d'inscription
samedi 20 avril 2002
Statut
Membre
Dernière intervention
16 janvier 2007
-
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
salut à tous,
Quelqu'un aurait-il la gentillesse de m'expliquer la différence entre la pile (stack) et le tas (heap). Je sais que le tas alloue une mémoire plus conséquente mais sinon qu'est-ce qu'il faut vraiment savoir ?

Merci ++

16 réponses

Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
sur la pile, on empile et depile des données. Elle est de type LIFO, last in first out (pas tt le temps), alors ke le tas est une zone de memoire alloué pour chak processus, et elle est egale a 4go sur win...

Voila, c pas complet, mais tt ske je C...

++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
sous win NT, elle est moindre sur win9x je crois..
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Non membre
Dernière intervention
9 juillet 2020
1
Salut,
Le tas n'a pas de vocation particuliere et est un bloc de mémoire allouable au byte près.
La pile est de la mémoire paginée (réserve par page de 4 Ko) et a pour seule utilisateur esp , le registre pointeur de pile.Au démarrage , il y en a obligatoirement avec le programme.
ToutEnMasm
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
ToutEnMasm > tu sais comment est defini la taille de la pile pour un processus ? Ou est stocké cette memoire ? Est ce que la pile est accessible par tous les processus ou bien est dependant du processus l'utilisant ?
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Non membre
Dernière intervention
9 juillet 2020
1
Salut,
Pour un process (autrement dit un programme ) la taille de la pile est défini dans le fichier executable lui même.
Le format de fichier PE possède deux datas fixant a 2 pages la taille de la pile au démarrage du programme et une variable fixant le maximum de pile allouable par le programme.
Voir mon site (la pile et le proc) pour des renseignements plus précis,en bas de page.
La heap possède deux variables similaires dans le pe.
La mémoire pile est propre a chaque process,seuls les interruptions du système utilise éventuellement cette pile.
Pour les API je ne suis pas trop sur de quelle mémoire pile elles utilisent.
Pour savoir ou est stocké cette mémoire,il faut utiliser virtualQuery en lui passant la valeur de esp.
L'exemple de gestion dynamique de la pile que j'ai mis sur code source utilise cette API.
TouEnMasm
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

la pile est utilisée pour stocker des variable locales a une fonction et pour passer des parametres a cette fonction. La memoire allouée dans la pile est toujours éphemere et sera libérée a la sortie de la fonction. Ce qui est logique car sinon, la fonction appelante n'aurait plus la meme base de pile.

toute la memoire de ton process est paginée que ce soit le code, les données, la pile,le tas ou quoi que ce soit. ( je l'ai déjà dit a ToutEnMasm mais il n'écoute rien ).

le tas te permet d'effectuer des allocations de memoire qui vont pouvoir etre utilisés en dehors de la fonction qui les a crées.
exemple: new et delete du c++

autrement dit:

new MACRO sze
invoke GlobalAlloc,GPTR,sze ; dans le tas
ENDM

delete MACRO pbloc
invoke GlobalFree,pbloc
ENDM

fcttest PROC param1:DWORD,param2:DWORD
LOCAL local1:DWORD ; dans la pile
new 1000h ; dans le tas
ret 8 ; desalloue variables locales + params de la pile
fcttest ENDP

main PROC
push param2 ; dans la pile
push param1 ; dans la pile
call fcttest ; retour de fonction dans la pile
delete eax ; libere le bloc alloué dans le tas
main ENDP

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

le tas n'est pas une zone de 4go puisque ca représente la memoire virtuelle totale.

la zone de memoire accessible par un process est + grande sous win9X que sous NT.

elle s'etend de 00400000h a C0000000h pour 9X.
elle s'etend de 00400000h a 80000000h pour NT/XP.

@++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
AlexMAN a dit: "Elle est de type LIFO, last in first out (pas tt le temps)".
Si une pile n'est pas de ce type, de quelle type est-elle donc?
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
FIFO, First in First out
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Dans ce cas c'est une file FIFO (une pile est une file LIFO)
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Faut pas mélanger le vocabulaire non plus :

PILE = LIFO
FILE = FIFO

C'est tout rien de plus simple.

vecchio56> "une pile est une file LIFO" ??? T'as fini par t'embrouillé toi aussi

Shell
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Plus ou moins
Messages postés
8
Date d'inscription
jeudi 7 octobre 2004
Statut
Membre
Dernière intervention
8 novembre 2004

La pile et le tas sont tous deux des zones de mémoire dynamique :

la pile : il n'y a pas de reservation, on empile et on dépile des valeurs à la vollé. Chaque processus à sa propre pile et il y a une pile pour le systeme.

le tas : dans un tas, on doit reserver la place utilisé et la liberer (malloc & free). Cette gestion est à la charge du SE. Chaque processeur voit un espace d'adressage différant. Actuellement, les processeur (32 bits) admette 4 Go de mémoire principale et 64 Go de mémoire virtuelle. Dans ces condition, il est tous à fait possible d'avoir donc un tas de + de 4 Go ... mais ce n'est pas réalisé par la plus part des systeme. En général, on ne laisse voir que les 4 Go d'adressage. Et sur ces 4 Go, une partie de la place est utilisé par le systeme, si bien qu'en general, le tas est bien inferieur à 4 Go !
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

est-tu sur de toi quand tu dis que le system d'exploitation ne reserve pas + de 4Go de tas parsque il ne le gere pas.

Je ne suis pas d'accord avec toi car la memoire physique accessible par un process reste toujours de 0x400000 a 0x80000000. or, le tas, c de la memoire.

ce que tu dit me parait bizarre car cela voudrait dire qu'un process pourrait acceder a plusieurs blocs memoire différents ( stockés dans le swap ) a l'aide d'une meme adresse memoire.

le swap est utilisé entre les différents process par le system d'exploitation mais pas au sein d'un meme process.

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

en plus, je crois que le max de swap est de 64To

@++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
CodeFighter a raison, le tas n'est pas de 4go, c'est l'espace adressable ki l'est. Les DLL et autres, en particulier des infos pour le systeme, sont stocké ds ces 4go..J'avais la table exacte, mais ca doit facilement se trouver sur le net.

++