//La pile (Stack) et le tas (Heap)

La pile (Stack) et le tas (Heap)

La fois dernière j’ai publié un article pour définir ce qu’est le « Buffer Overflow », en français « Dépassement de tampon », soit la situation où un volume de données dépasse la capacité de stockage d’une mémoire tampon.

Aujourd’hui je souhaite revenir plus en détails sur ce qu’est une mémoire en informatique, comment elle se divise et comprendre la différence entre la pile (Stack) et le tas (Heap).

Qu’est ce que la mémoire en informatique ?

Lorsque vous codez dans des langages de programmation, par exemple en C ou C++, il est possible de manipuler la mémoire et cela peut créer des dysfonctionnements plus ou moins problématiques, la plus rencontrée est sans doute l’erreur de segmentation. Ces erreurs indiquent souvent que vous utilisez de la mémoire que vous ne devriez pas utiliser.

L’un des problèmes les plus courants est l’accès à la mémoire qui a déjà été libérée. Il s’agit parfois de la mémoire que votre programme a automatiquement libérée à partir d’une pile (Stack). Comprendre tout cela est vraiment facile et cela vous aidera sans doute à mieux appréhender les erreurs que l’on peut commettre au début de l’apprentissage.

Comment la mémoire est-elle divisée ?

La mémoire est divisée en plusieurs segments, dont les plus rencontrés sont la pile (Stack) et le tas (Heap). La pile est l’endroit où vous placez vos données de manière ordonnée, tandis que sur le tas, vous allouez de la mémoire partout où vous le pouvez.

Le Stack fonctionne d’une certaine manière et a des opérations spécifiques pour le rendre possible. Certains des registres de votre CPU sont sauvegardés. C’est aussi là que vont les informations essentielles sur votre programme : quelles fonctions sont appelées, quelles variables vous avez créées, etc. Cette mémoire est gérée par le programme, pas par le développeur ou le programmeur.

Le Tas est souvent utilisé pour allouer une grande quantité de mémoire qui devrait exister aussi longtemps que le développeur le souhaite. Cela signifie que le travail du programmeur consiste à contrôler l’utilisation de la mémoire sur le tas. Lors de la construction de programmes complexes, le professionnel doit souvent allouer de gros morceaux de mémoire, et c’est là que vous utilisez le tas. C’est ce qu’on appelle la mémoire dynamique.

Ces différentes manipulations sur la mémoire facilite la recherche d’erreurs dans le programme et la recherche de segments.

Comprendre les mécanismes de la pile (Stack)

Si vous débutez en informatique vous ne savez sans doute pas que votre programme alloue continuellement de la mémoire de pile pour le faire fonctionner. Chaque variable locale et chaque fonction que vous appelez vont utiliser ce type de mémoire. Il y a beaucoup de choses que vous pouvez faire avec cela.

Fonctionnement de la pile

La pile est une structure de données LIFO (Last-In-First-Out). Vous pouvez l’imaginer comme une bibliothèque de livres parfaitement rangée et classée, le dernier livre que vous mettez est le premier que vous sortez. En utilisant cette structure, le programme peut facilement gérer toutes ses opérations et plages avec deux opérations simples : push et pop.

Ces deux opérations sont exactement opposées l’une à l’autre. Push place la valeur en haut de la pile. Pop en tire sa dernière valeur.

Pour garder une trace de l’emplacement mémoire actuel, il existe un registre de processeur spécial appelé Stack Pointer. Chaque fois que quelque chose doit être écrit, comme une variable ou l’adresse de retour d’une fonction, il déplace le pointeur de pile vers le haut. Chaque fois que vous quittez la fonction, elle apparaît du pointeur de pile vers l’adresse de retour enregistrée de la fonction.

Comprendre le Tas (Heap)

Contrairement à une pile, un tas est ce que vous utilisez lorsque vous voulez que quelque chose existe pendant un certain temps, quelles que soient les fonctions et les plages. Pour utiliser cette mémoire, vous pouvez utiliser les fonctions présentes dans la bibliothèque standard du C : malloc et free.

Malloc (allocation de mémoire) demande au système la quantité de mémoire exigée et renvoie un pointeur vers l’adresse de départ. Free indique au système que la mémoire que vous avez demandé n’est plus nécessaire et peut être utilisée pour d’autres tâches. Tant que vous évitez les erreurs, cela se fait très simplement.

Autre chose, le système ne peut pas écraser ce que les développeurs ont demandé. C’est à vous humains de le gérer avec les deux fonctions ci-dessus. Bien entendu, cela ouvre la porte à une erreur humaine, provoquant une fuite de mémoire.

Une fuite de mémoire est la mémoire qui a été demandée par l’utilisateur et qui n’a jamais été libérée, lorsque le programme s’est terminé ou que des pointeurs vers son emplacement ont été perdus. Cela oblige le programme à utiliser beaucoup plus de mémoire qu’il ne le devrait. Pour éviter cela, chaque fois que nous n’avons plus besoin d’un élément du tas alloué, nous le libérons.

Oublier de libérer la mémoire utilisée

Imaginez que vous ne libériez jamais la mémoire utilisée. Cela finit par gaspiller plusieurs dizaines d’octets. Cela n’a peut-être pas l’air très sérieux, mais imaginez que cela se produise lors d’un événement important (spectacle, représentation sportive, congrès, etc). Sur des milliers d’opérations vous allez gaspiller des gigaoctets !

La gestion de la mémoire de tas est nécessaire pour améliorer les performances de la mémoire programme. Mais il faut aussi faire attention à son utilisation. Comme la mémoire de la pile, une fois la mémoire libérée, y accéder ou l’utiliser peut entraîner une erreur de segmentation.

By |2022-01-31T10:43:58+00:00janvier 31st, 2022|Technologie|0 Comments