2008-12-22 8 views
2

Je suis en train d'obtenir une meilleure compréhension de la façon dont Windows, 32 bits, calcule les octets virtuels pour un programme. Je suis sous l'impression que les octets virtuels (__gVirt_NP_NN_NNPS<__ VB) sont la mesure de la quantité de l'espace d'adressage utilisateur est utilisé, tandis que les octets privés (PB) sont la mesure de la mémoire réelle engagée et réservé sur le système.Comment un programme peut-il avoir un nombre d'octets virtuels élevé alors que les octets privés sont relativement faibles sur Windows 32 bits?

En particulier, j'ai un programme serveur que je surveille qui, lorsqu'il est utilisé intensivement, atteindra la limite de 3 Go pour les VB. À peu près au même moment, le PB grimpe aussi, mais il tombe rapidement à environ 1 Go lorsque l'utilisation diminue. Le PB a alors tendance à rester bas, autour de la marque de 1 Go, mais le VB reste autour de la marque de 3 Go. Je n'ai pas accès au code source, alors j'utilise simplement les compteurs de performance Windows de base pour surveiller tout cela. Du point de vue de la programmation, quel concept de mémoire ne comprends-je pas qui rend tout cela possible? Y at-il une bonne référence pour en savoir plus à ce sujet?

Répondre

3

Ce que votre rapport est très probablement causé par le tas de processus. Il y a deux morceaux à une allocation de mémoire dans Windows. Le premier élément est l'espace d'adressage continu dans votre application pour la mémoire à laquelle accéder. Sur un système 32 bits qui n'exécute pas le commutateur/3GB, toutes vos allocations doivent provenir des 2 Go inférieurs d'espace d'adressage utilisateur. La deuxième partie de l'allocation de mémoire est la mémoire réellement pour l'allocation. Cela peut être de la RAM ou une partie du système de fichiers de la page sur le disque dur. Le système d'exploitation gère les allocations de déplacement entre la RAM et le système de fichiers de la page en arrière-plan.

Très probablement votre application utilise un tas Windows pour gérer toutes les allocations de mémoire.Lorsqu'un tas est créé, il réserve 1 Mo d'espace d'adressage pour la mémoire qu'il va allouer. Jusqu'à ce qu'il ait réellement besoin de mémoire associée à cet espace d'adressage, aucune mémoire physique n'est réellement utilisée. Si le tas a besoin de plus de mémoire que 1 Mo, il utilise un algorithme de doublage pour réserver plus d'espace d'adressage, puis valide la mémoire physique quand il en a besoin. La chose importante à noter est qu'une fois qu'un tas réserve l'espace d'adresse, il ne le libère jamais.

Personnellement, j'ai trouvé les livres et chapitres suivants utiles pour essayer de comprendre la gestion de la mémoire. Mise au point avancée de Windows - Chapitre 6 Ce livre a l'aspect le plus détaillé dans le tas que j'ai vu.

Windows Internals - Chapitre 7 Ce livre ajoute un peu d'information introuvable dans Advanced Windows Debugging; Cependant, cela ne donne pas une aussi bonne vue d'ensemble.

0

Il me semble que vous avez un ramasse-miettes qui ne marche que lorsque la pression de la mémoire atteint 1/3 (1 Go sur 3 Go).

Quant à la VB - ne vous inquiétez pas! C'est virtuel! Honnêtement, rien n'a été attribué, rien n'a été commis. Concentrez-vous sur vos octets privés - vos allocations réelles.

0

Il y a une telle chose comme « mémoire virtuelle ». C'est un concept plutôt non spécifique au système d'exploitation en informatique. Microsoft a également written sur l'implémentation Windows de la chose. En bref, dans Windows, vous pouvez demander de réserver de la mémoire sans affecter réellement de mémoire physique. C'est comme faire des adresses mémoire réservées pour un usage futur. Lorsque vous avez vraiment besoin de la mémoire, vous l'allouez physiquement (alias "commit").

Je n'ai pas eu besoin d'utiliser cette fonctionnalité moi-même, donc je ne sais pas comment il est utilisé dans les programmes réels, mais je sais que c'est là. Je pense que l'idée pourrait être de conserver des pointeurs sur une adresse mémoire et d'allouer de la mémoire quand cela est nécessaire, sans avoir à changer ce à quoi les pointeurs pointent.

0

Windows est connu pour avoir une variété de types d'allocation de mémoire, dont certains sont des sur-ensembles d'autres. Vous avez mentionné les octets privés et les octets virtuels. Les octets privés, comme vous le savez, font référence à la mémoire allouée spécifiquement à votre processus. Les octets virtuels incluent des octets privés, ainsi que toute mémoire partagée, mémoire réservée, etc.

Même si dans la vraie vie, vous ne devez vous occuper que des octets privés et peut-être de la mémoire partagée (Windows gère le reste, de toute façon), Le nombre d'octets virtuels est souvent ce que les utilisateurs (et les évaluateurs de votre logiciel) voient et interprètent comme l'utilisation de la mémoire de votre processus.

0

Une bonne référence et mise à jour sur le sujet est le livre intitulé Windows Via C/C++ par Jeffrey Richter, vous devriez chercher le chapitre 13: "Windows Memory Architecture".