2010-08-13 3 views
4

La question m'a été posée dans une interview et ma réponse était "mémoire de l'ordinateur". Mais où exactement ..? est-ce la Random Access Memory ou le disque dur?Où est allouée la mémoire dynamique?

+1

Dans la mémoire vive. – David

+0

@David, Alors où est allouée la mémoire vive? – strager

+1

Voir la réponse @ jwismar ci-dessous. C'est une bonne explication de ce que l'intervieweur voulait probablement. (Si vous voulez vraiment savoir où se trouve physiquement la RAM, c'est dans les longues puces rectangulaires de la carte mère de votre ordinateur, généralement juste à droite du CPU, ce qui est le gros dissipateur thermique et le ventilateur.) – David

Répondre

7

Ils cherchaient probablement "le tas". C'est une zone de mémoire distincte de "la pile", où toutes vos variables locales, paramètres, valeurs de retour, etc., sont stockés. Et oui, tout est en RAM, pas sur le disque dur.

+4

Mais je pourrais aller sur le disque dur si le système d'exploitation doit faire [Paging] (http://en.wikipedia.org/wiki/Paging) –

+0

@Carlos Muñoz, Oui, mais vous ne pouvez pas accéder plus maintenant. Il doit être récupéré en premier. – strager

+1

Vous devez exécuter un système d'exploitation vraiment primitif pour obtenir des allocations en RAM. Il est alloué dans le fichier d'échange. Et finit par là, si nécessaire. –

4

La mémoire allouée dynamiquement est allouée à partir de la mémoire communément appelée "Heap". En C++, nous avons vraiment deux "Heaps" (pensé qu'ils peuvent (ou ne peuvent pas) techniquement être la même zone). La mémoire allouée par malloc() (et family) vient du "tas" alors que la mémoire allouée par new (et family) vient du "free store".

Veuillez noter que "tas" et "magasin libre" sont des surnoms pour des instances spécifiques d'un "tas" d'informatique.

La définition de la langue ne définit pas ce que l'on entend par "heap" ou "free store" qui reste à définir par l'implémentation. En outre, le système d'exploitation jouera un rôle dans ce qui arrive aux pages de mémoire, mais cela dépasse le cadre de la plupart des applications.

En informatique, le terme «pile» est utilisé comme un outil d'enseignement simpliste. Il définit une zone de mémoire qui est utilisée pour suivre les appels de fonction et qui est distincte de "Heap". Dans les systèmes d'exploitation modernes, c'est une définition trop simpliste. En tant que tel, le "Stack" d'exécution est maintenant généralement implémenté dans le "Heap" (Ceci a l'avantage supplémentaire que vous n'avez pas besoin d'essayer de suivre si le tas/pile s'affrontent au moment de l'exécution. car il devient plus difficile de détruire la pile et d'obtenir un résultat déterministe).

3
  1. La norme C++ ne mentionne pas le mot «heap» par rapport à l'allocation de mémoire nouvelle ou dynamique de l'opérateur. Donc "tas" probablement dans le langage courant est utilisé pour désigner une mémoire qui est distincte de la zone de stockage pour les variables automatiques

  2. Les états de normes C++ dans une note de bas de page - "L'intention est que le modèle de mémoire de C + + est compatible avec celle du langage de programmation ISO/CEI 9899 C. "

  3. Lorsque je me réfère à la norme C, elle ne mentionne pas non plus 'heap'.

Donc, en résumé, il est préférable de supposer que le stockage réelle de l'allocation dynamique de la mémoire est non spécifié (comportement, pour une construction de programme bien formé et des données correctes, qui dépend de la mise en œuvre.)

Un dernier point.

4.Il est important de se rappeler que 'placement new' n'alloue aucune mémoire. Au lieu de cela, il utilise une mémoire préallouée (passée à lui en tant qu'argument) pour construire l'objet.

1

En résumé, une réponse d'un mot peut être «heap». Mais, ce qui est appelé stack ou heap s'avère dépendant du contexte. Par exemple,

Voir le paragraphe Intel Programming Guide, pour la pile. 'SS' est le segment de pile, qui fournit un espace d'adressage continu. Lorsque vous appelez une fonction, c'est l'adresse de retour, les paramètres passés et les variables locales sont attribuées sur ce segment, appelé «Stack».Si vous avez une variable pointeur (disons char * p), alors cette variable est allouée sur la pile, mais la mémoire est allouée quand malloc(), ou 'new' sont invoqués sur C, C++ est alloué sur le segment de données (DS) .Aussi, au lieu de simplement incrémenter le haut de la pile dans SS pour aller à l'adresse mémoire suivante, maintenant le processeur doit faire la traduction d'adresse - vérifier si l'adresse est dans la plage d'adresses de processus, diviser l'adresse virtuelle à Segment + Offset, pour obtenir la valeur à une adresse particulière. Par conséquent, ici, la discussion sur 'Stack' et 'Heap' est étroitement liée à l'architecture du processeur lorsque nous traitons des langages comme C, C++. Pour Java, tout est fait sur le tas, qui est une zone de stockage commune à tous les processus Java. Les sections 3.5 et 3.6 de la section JVM spec ( indiquent que chaque thread JVM possède sa propre pile privée qui stocke les cadres de pile. Il s'agit de paramètres transmis, de variables locales, etc. Plus important encore, ces trames de pile peuvent être attribuées à partir du tas et n'ont pas besoin d'être adressées séquentiellement. En plus de cela, java fournit également des piles de méthodes indigènes comme C.

Mais, je devine dans un cadre d'entrevue, il pourrait être préférable de dire «Heap» - et ne pense à élaborer si demandé.

2

Sur un PC moderne, un poste de travail ou un serveur, la réponse à "Est-ce la mémoire vive ou le disque dur?" est: ni. Il est alloué en mémoire virtuelle. Lors de sa première attribution, l'adresse virtuelle qui vous est attribuée n'a probablement aucune existence physique. Lors du premier accès, il sera physiquement instancié dans la RAM, mais il pourra être déplacé ultérieurement sur un disque ou un autre périphérique d'échange si la RAM est nécessaire pour d'autres utilisations. Lors d'une tentative ultérieure d'y accéder, il sera de nouveau déplacé dans la RAM.

Ceci est juste l'explication très basique de la mémoire virtuelle. Si vous voulez vraiment comprendre, allez lire quelques articles sur Wikipedia ou Google pour cela.

+0

Bonne réponse. C'est facile pour les idiots comme moi de comprendre! – Maxpm

Questions connexes