2010-11-01 6 views
4

Malloc alloue de la mémoire à partir de l'une des régions de mémoire virtuelle du processus appelé Heap. Quelle est la taille initiale du tas (juste après le début de l'exécution et avant tout appel malloc)? Dites, si Heap commence à partir de l'adresse virtuelle X et se termine à l'adresse virtuelle Y, je veux connaître la différence entre X et Y.Comment les pages physiques sont-elles allouées et libérées pendant l'appel malloc et l'appel gratuit?

J'ai lu les réponses à la question en double qui a été posée plus tôt.

How do malloc() and free() work?

Les réponses écrites sont tous dans le contexte d'adresse virtuelle, mais je veux savoir comment les pages physiques sont allouées. Je ne suis pas sûr mais je pense que cette taille initiale (X-Y) n'aurait pas les entrées de table de page correspondantes dans le système d'exploitation. S'il vous plait corrigez moi si je me trompe. Maintenant, disons qu'il y a une requête pour allouer (et utiliser) 10 octets de mémoire, une nouvelle page serait allouée. Ensuite, toutes les autres demandes de mémoire seraient satisfaites à partir de cette page ou chaque fois qu'une nouvelle page serait allouée? Qui déciderait cela?

Lorsque la mémoire serait libérée (en utilisant free()) alors à quel moment cette page physique allouée serait libérée et marquée comme disponible? Je comprends que l'adresse virtuelle et la page physique ne seraient pas libérées immédiatement car la quantité de mémoire libérée pourrait être très inférieure. Puis à quelle heure l'association correspondante entre l'adresse physique et l'adresse virtuelle serait terminée?

Je suis désolé si mes questions peuvent sembler étranges. Je suis juste un débutant et essaie de comprendre les internes.

+0

Veuillez modifier votre titre pour refléter la spécificité de votre problème. –

Répondre

4

Normalement, vous pouvez penser à des pages physiques comme étant affecté temporairement. Si la mémoire que votre programme utilise est échangée sur le disque, à tout moment l'association entre vos adresses virtuelles et la RAM physique peut être supprimée, et cette RAM physique utilisée pour autre chose. Si le programme accède ultérieurement à cette mémoire, le système d'exploitation attribuera une nouvelle page physique à cette page virtuelle, copiera les données du fichier de page dans la mémoire physique et terminera l'accès à la mémoire. Donc, pour répondre à votre question, la page physique peut être marquée comme disponible lorsque votre programme n'utilise plus les allocations qui y ont été ajoutées, ou avant. Ou après, puisque malloc ne se soucie pas toujours de libérer de la mémoire dans le système d'exploitation. Vous n'avez pas vraiment de prédiction de ce genre de choses.

Tout cela se passe dans le noyau, il est invisible du point de vue de C, tout comme la mémoire cache de la CPU est invisible de C. Bien, invisible jusqu'à ce que votre programme ralentisse massivement suite à l'échange. Évidemment, si vous désactivez le fichier d'échange, les choses changent un peu: au lieu que votre programme ralentisse en raison de l'échange, un programme n'attribuera pas de mémoire, ou quelque chose sera tué par le tueur du MOO.

3

La façon dont les pages sont allouées est différente dans chaque OS, Linux, Mac, Windows, etc. Dans la plupart/toutes les implémentations, il existe un mécanisme de noyau qui définit comment il est alloué.

http://www.linuxjournal.com/article/1133

+0

C'est un article vénérable! –

2

Comment le système d'exploitation gère-t-il cela dépend de l'OS? Dans la plupart des cas (sinon tous), l'OS notera au moins dans son tableau qu'il y avait une allocation.Vous êtes probablement confus avec le fait que certains systèmes d'exploitation dans certaines situations ne libèrent pas de mémoire jusqu'à ce qu'il ait été accédé. (mot-clé: overcommit, si vous voulez mon avis sur ceci, il devrait s'agir d'un paramètre par processus, et non global, et par défaut de la mémoire).

Maintenant, pour renvoyer de la mémoire libérée à l'OS, cela dépend de l'allocateur. Il ne peut renvoyer rien de moins qu'une page, donc si une page contient de la mémoire allouée, elle ne sera pas retournée. Et selon la façon dont il a été attribué, il peut y avoir d'autres contraintes; Par exemple, lorsque vous utilisez sbreak() comme d'habitude sous Unix, vous pouvez renvoyer uniquement les dernières pages allouées (c'est-à-dire si vous renvoyez une page, toutes les pages attribuées après sont également renvoyées). Une approche plus moderne sur Unix utilise la mémoire mmapped pour les gros blocs, sous le raisonnement que la mémoire mmapped peut être retournée comme voulu. Pour les petits blocs d'allocation, il est souvent jugé inutile de vérifier si les pages du milieu peuvent être renvoyées, et ainsi la mémoire mouillée n'est pas utilisée.

Questions connexes