2 votes

Pourquoi la mémoire physique disponible (dwAvailPhys) est-elle supérieure à la mémoire virtuelle disponible (dwAvailVirtual) dans l'appel GlobalMemoryStatus sous Windows Vista x64 ?

Je joue avec un échantillon MSDN pour faire des tests de stress de la mémoire (voir : http://msdn.microsoft.com/en-us/magazine/cc163613.aspx ) et une extension de cet outil qui mange spécifiquement la mémoire physique (voir http://www.donationcoder.com/Forums/bb/index.php?topic=14895.0;prev_next=suivant ). Cependant, je suis manifestement confus quant aux différences entre la mémoire virtuelle et la mémoire physique. Je pensais que chaque processus disposait de 2 Go de mémoire virtuelle (bien que j'aie également lu 1,5 Go en raison de la "surcharge"). J'ai cru comprendre qu'une partie/tout/rien de cette mémoire virtuelle pouvait être de la mémoire physique, et que la quantité de mémoire physique utilisée par un processus pouvait changer au fil du temps (la mémoire pouvait être transférée sur le disque, etc.) Je pensais également qu'en général, lorsque vous allouez de la mémoire, le système d'exploitation pouvait utiliser de la mémoire physique ou de la mémoire virtuelle. J'en ai conclu que dwAvailVirtual devrait toujours être égal ou supérieur à dwAvailPhys dans l'appel GlobalMemoryStatus. Cependant, je constate souvent (toujours ?) le contraire. Qu'est-ce que je rate ?

Je m'excuse par avance si ma question n'est pas bien formulée. J'essaie toujours de comprendre le système de gestion de la mémoire de Windows. Les tutoriels/explications/recommandations de livres sont les bienvenus !

Andrew

2voto

Hans Passant Points 475940

Ce n'était vrai qu'à l'époque où la RAM était chère. Le système d'exploitation fait correspondre les pages de mémoire virtuelle à la RAM selon les besoins. S'il n'y a pas assez de RAM pour satisfaire la demande d'un programme, il commence à démapper des pages pour faire de la place. Si une telle page contient des données au lieu du code, elle est écrite dans le fichier de pagination. Lorsque le programme accède à nouveau à cette page, il génère un défaut de pagination, ce qui permet au système d'exploitation de relire la page sur le disque.

Si la machine a peu de mémoire vive et que de nombreux processus consomment des pages de mémoire virtuelle, cela peut provoquer un effet très désagréable appelé "thrashing". Le système d'exploitation accède constamment au disque et les performances de la machine se réduisent comme peau de chagrin.

Plus de RAM signifie moins d'accès au disque. Il y a très peu de raisons de ne pas utiliser 3 ou 4 Go de RAM sur un système d'exploitation 32 bits, c'est bon marché. Même si vous n'utilisez pas les 4 Go, ils ne seront pas tous adressables en raison des périphériques matériels qui prennent de la place sur le bus d'adresse (vidéo, principalement). Mais cela ne changera pas la taille de la mémoire virtuelle accessible par le code utilisateur, elle est toujours de 2 gigaoctets.

Windows Internals est un bon livre.

1voto

Daniel Pryden Points 22167

Je ne sais pas si c'est votre problème, mais le Page MSDN pour la fonction GlobalMemoryStatus contient l'avertissement suivant :

Sur les ordinateurs disposant de plus de 4 Go de mémoire, l'application GlobalMemoryStatus peut renvoyer des informations incorrectes, en signalant une valeur de -1 pour indiquer un dépassement de capacité. Pour cette raison, les applications devraient utiliser la fonction GlobalMemoryStatusEx à la place.

De plus, cette page dit :

Sur les ordinateurs Intel x86 dotés de plus de 2 Go et de moins de 4 Go de mémoire, l'application GlobalMemoryStatus renverra toujours 2 Go dans le dwTotalPhys membre de la MEMORYSTATUS structure. De même, si la mémoire totale disponible est comprise entre 2 et 4 Go, le programme dwAvailPhys membre de la MEMORYSTATUS sera arrondie à 2 Go. Si l'exécutable est lié en utilisant l'option /GRANDEADDRESSAWARE de l'éditeur de liens, alors l'option GlobalMemoryStatus retournera la quantité correcte de mémoire physique dans les deux membres.

Puisque vous faites référence à des membres comme dwAvailPhys au lieu de ullAvailPhys il semble que vous utilisiez un MEMORYSTATUS au lieu d'une structure MEMORYSTATUSEX structure. Je ne connais pas les conséquences de cela sur une plate-forme 64 bits, mais sur une plate-forme 32 bits, cela pourrait certainement entraîner le signalement de tailles de mémoire incorrectes.

1voto

slacker Points 1614

La quantité de mémoire virtuelle est limitée par la taille de l'espace d'adressage - qui est de 4 Go par processus sur un système 32 bits. Vous devez en soustraire la taille des régions réservées à l'utilisation du système et la quantité de mémoire virtuelle déjà utilisée par votre processus (y compris toutes les bibliothèques mappées dans son espace d'adressage).

D'autre part, la quantité totale de mémoire physique peut être supérieure à la quantité d'espace de mémoire virtuelle que le système a laissé libre pour que votre processus puisse l'utiliser (et de nos jours, c'est souvent le cas).

Cela signifie que si vous avez plus de 2 Go de RAM, vous ne pouvez pas utiliser toute votre mémoire physique dans un seul processus (car il n'y a pas assez d'espace mémoire virtuel pour la mapper), mais elle peut être utilisée par plusieurs processus. Notez que cette limitation est supprimée dans un système 64 bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X