Quoi et où sont la pile et le tas?

Les livres des >pile et que les types de référence sont créés sur le tas , sans expliquer en quoi consistent ces deux choses. Je n'ai pas lu d'explication claire à ce sujet. Je comprends ce qu'est une pile. Mais

  • où et quels sont-ils (physiquement dans la mémoire réelle de l'ordinateur)?
  • Dans quelle mesure sont-ils contrôlés par le système d'exploitation ou la >
  • Quel est leur volume?
  • Qu'est-ce qui détermine la taille de chacun d'eux?
  • Qu'est-ce qui fait plus vite?
7380
17 сент. mettre mattshane 17 sep . 2008-09-17 07:18 '08 à 7h18 2008-09-17 07:18
@ 25 réponses

Une pile est une mémoire réservée comme espace de travail pour un thread d'exécution. Lorsqu'une fonction est appelée, le bloc est réservé en haut de la pile pour les variables locales et certaines informations d'identification. Lorsque cette fonction revient, le bloc devient inutilisé et peut être utilisé lors du prochain appel de la fonction. La pile est toujours réservée dans l'ordre de LIFO (la dernière dans le premier ordre); le bloc réservé le plus récent est toujours le prochain bloc à libérer. Cela facilite le suivi de la pile; libérer un bloc de la pile n'est rien de plus qu'un simple ajustement de pointeur.

Un tas est une mémoire allouée pour une allocation dynamique. Contrairement à la pile, il n’existe pas de modèle forcé d’allocation et de libération de blocs d’un tas; Vous pouvez sélectionner un bloc à tout moment et le relâcher à tout moment. Cela rend très difficile de savoir quelles parties du tas sont distribuées ou libérées à un moment donné; Il existe de nombreux distributeurs de sperme personnalisés permettant d’optimiser les performances de segment de mémoire pour différents modèles d’utilisation.

Chaque thread reçoit une pile, tandis que pour une application, un seul segment est généralement utilisé (bien qu'il ne soit pas rare de disposer de plusieurs segments pour différents types de placement).

Pour répondre directement à vos questions:

Dans quelle mesure sont-ils contrôlés par le système d'exploitation ou la >

Le système d'exploitation alloue une pile pour chaque thread de niveau système lors de la création d'un thread. Généralement, le système d'exploitation est appelé par l'environnement d'exécution du >

Quel est leur volume?

La pile est attachée au thread. Ainsi, lorsque le thread sort de la pile, il est corrigé. Un tas est généralement alloué lorsque l'application est lancée au moment de l'exécution et revient après la fermeture de l'application (processus technique).

Qu'est-ce qui détermine la taille de chacun d'eux?

La taille de la pile est définie lors de la création d'un thread. La taille du segment de mémoire est définie au démarrage de l'application, mais peut augmenter si nécessaire (l'allocateur demande plus de mémoire au système d'exploitation).

Qu'est-ce qui fait plus vite?

La pile est plus rapide car le modèle d'accès rend l'allocation et la libération de mémoire triviales (le pointeur / entier augmente ou diminue tout simplement) et le tas contient des états financiers beaucoup plus compliqués concernant l'allocation ou la libération. De plus, chaque octet de la pile est souvent réutilisé, ce qui signifie qu'il a tendance à s'afficher dans le cache du processeur, ce qui le rend très rapide. Un autre impact négatif sur les performances est que le segment de mémoire, qui est principalement une ressource globale, doit généralement être multithread, c'est-à-dire En règle générale, chaque distribution et chaque version doivent être synchronisées avec "tous" les autres appels de tas du programme.

Démonstration claire: 2019

5436
17 сент. La réponse est donnée à Jeff Hill 17 sep. 2008-09-17 07:52 '08 à 7:52 am 2008-09-17 07:52

Pile

  • Enregistré dans la RAM de l'ordinateur, sous forme de groupe.
  • Les variables créées sur la pile sortent du cadre et sont automatiquement libérées.
  • Beaucoup plus rapide à allouer par rapport aux variables du tas.
  • Implémenté avec la structure de données de pile réelle.
  • Enregistre les données locales et renvoie les adresses utilisées pour transmettre les paramètres.
  • Peut avoir un débordement de pile lorsque trop de pile est utilisée (principalement par récursion infinie ou trop profonde, très grandes distributions).
  • Les données créées sur la pile peuvent être utilisées sans pointeur.
  • Vous utiliseriez la pile si vous saviez exactement combien de données vous devez allouer avant de compiler et si elles ne sont pas trop volumineuses.
  • Généralement, la taille maximale est déjà déterminée au démarrage de votre programme.

Tas:

border=0
  • Stocké dans la mémoire de l'ordinateur de la même manière que la pile.
  • En C ++, les variables du segment de mémoire doivent être détruites manuellement et ne doivent jamais tomber en dehors de la portée. Les données sont libérées avec delete , delete[] ou free .
  • Il est plus lent à allouer par rapport aux variables de la pile.
  • Utilisé à la demande pour allouer un bloc de données à utiliser par le programme.
  • Peut avoir une fragmentation quand il y a beaucoup d'allocations et d'exemptions.
  • En C ++ ou C, les données créées sur le tas seront indiquées par des pointeurs et attribuées à new ou malloc respectivement.
  • La distribution peut échouer si trop de mémoire tampon est requise.
  • Si vous ne savez pas exactement combien de données vous avez besoin au moment de l'exécution ou si vous devez allouer beaucoup de données, vous en utiliserez beaucoup.
  • Responsable de la fuite de mémoire.

Exemple:

2164
17 сент. La réponse est donnée par Brian R. Bondy 17 sep. 2008-09-17 07:20 '08 à 7:20 2008-09-17 07:20

Le point le plus important est que tas et pile sont des termes généraux pour les méthodes d'allocation de mémoire. Ils peuvent être mis en œuvre de différentes manières, et ces termes sont applicables aux concepts de base.

  • Dans la pile d'éléments, les éléments sont placés les uns sur les autres dans l'ordre dans lequel ils ont été placés, et vous ne pouvez supprimer que la partie supérieure (sans tout basculer).

    2019

1294
19 марта '09 в 17:38 2009-03-19 17:38 la réponse est donnée par thomasrutter le 19 mars 09 à 17:38 2009-03-19 17:38

(J'ai déplacé cette réponse d'une autre question plus ou moins trompée par elle.)

La réponse à votre question dépend de la mise en œuvre et peut varier d'un compilateur à l'autre et d'une architecture de processeur à une autre. Cependant, ceci est une explication simplifiée.

  • La pile et le segment de mémoire sont des zones de mémoire allouées à partir du système d'exploitation de base (souvent une mémoire virtuelle mappée sur une mémoire physique à la demande).
  • Dans un environnement multithread, chaque thread disposera de sa propre pile totalement indépendante, mais divisera le segment de mémoire. L'accès parallèle doit être contrôlé sur le tas et n'est pas possible sur la pile.

Une pile

  • Le tas contient une liste chaînée de blocs libres et utilisés. Les nouvelles allocations de tas ( new ou malloc ) sont satisfaites en créant un bloc approprié à partir de l'un des blocs libres. Cela nécessite la mise à jour de la liste des blocs du tas. Ces méta-informations sur les blocs d'un segment sont également stockées dans un segment, souvent dans une petite zone juste avant chaque bloc.
  • Au fur et à mesure que le segment de mémoire grandit, de nouveaux blocs sont souvent alloués d'adresses inférieures à des adresses supérieures. Ainsi, vous pouvez considérer un segment de mémoire comme une pile de blocs de mémoire dont la taille augmente à mesure que la mémoire est allouée. Si le segment de mémoire est trop petit pour être distribué, vous pouvez souvent augmenter la taille en acquérant plus de mémoire à partir du système d'exploitation sous-jacent.
  • L'affectation et la libération de nombreux petits blocs peuvent laisser une pile dans un état dans lequel se trouvent de nombreux petits blocs libres intercalés entre les blocs utilisés. Une demande d'allocation d'un bloc volumineux peut échouer car aucun des blocs libres n'est assez grand pour satisfaire la demande de distribution, même si la taille combinée des blocs libres peut être suffisante. C'est ce qu'on appelle la fragmentation du tas.
  • Lorsqu'un bloc utilisé adjacent à un bloc libre est libéré, un nouveau bloc libre peut être combiné à un bloc libre adjacent pour créer un bloc libre plus grand qui réduit efficacement la fragmentation du tas.

2019

681
31 июля '09 в 18:54 2009-07-31 18:54 La réponse est donnée par Martin Liversage le 31 juillet 09 à 18:54 2009-07-31 18:54

Dans le code suivant C #

Разница между распределением памяти стек и кучи "timmurphy.org