36 votes

Est-ce que 2 Go est vraiment mon maximum ?

Espace d'adressage du processus me dit que mon application .NET ne peut utiliser que 2 Go au maximum sous Windows XP. Est-ce exact ?

Mais si j'avais un disque dur de 20 terrabytes. Ne sera-t-il pas possible d'utiliser une partie de cet espace disque ?

166voto

Eric Lippert Points 300275

Les réponses qui disent que cela a à voir avec la RAM sont profondément erronées. Il est important de comprendre correctement la relation entre l'espace disque, la RAM et l'espace d'adressage.

Voici comment cela fonctionne réellement.

Chaque processus sous Windows 32 bits dispose d'un disque dur de 4 Go. espace adresse .

Sur ces 4 Go d'espace d'adressage, 2 Go sont réservés à l'usage du système d'exploitation et les 2 Go restants sont disponibles pour que le code utilisateur du processus puisse les utiliser comme bon lui semble.

Permettez-moi d'être extrêmement clair sur ce point : l'espace d'adressage n'est pas la mémoire . Un processus peut avoir autant mémoire comme il le souhaite. Je vais le répéter : un processus peut avoir bien plus que 4 Go de mémoire allouée . La limite est que seuls 2 Go de cette mémoire peuvent être mappés dans l'espace d'adressage du mode utilisateur à tout moment. .

Je n'ai pas mentionné la RAM parce que La RAM n'a rien à voir avec la question de l'espace d'adressage. . Il importe peu que le système d'exploitation stocke le mémoire du processus en RAM ou sur le disque ou autre. La RAM n'est qu'une optimisation des performances qui permet au système d'exploitation de stocker les données du processus. mémoire dans une puce rapide plutôt que dans un disque lent.

Votre processus indique au système d'exploitation la quantité de mémoire dont il a besoin et l'emplacement de cette mémoire dans l'espace d'adressage de 2 Go. Si le processus a besoin de plus de 2 Go de mémoire, il ne pourra pas la mapper entièrement dans l'espace d'adressage ; un tel processus doit soit être écrit de manière intelligente pour indiquer au système d'exploitation les pages de mémoire à mapper et à démapper de l'espace d'adressage, soit utiliser moins de mémoire. S'il ne le fait pas, il échouera avec une exception de mémoire insuffisante.

Une analogie pourrait peut-être vous aider. Votre immeuble dispose d'un parking d'une centaine de places. C'est de la RAM. Vous avez un parking en bas de la rue avec dix mille places. C'est le disque. Vous et tous les autres habitants de l'immeuble avez chacun un trousseau de clés pouvant contenir dix clés. C'est l'espace d'adressage par processus. Le fait que vous n'ayez de la place que pour dix clés signifie-t-il que vous ne pouvez posséder que dix voitures ? Non ! Vous pouvez posséder autant de voitures que vous voulez, mais si vous voulez accéder à onze de ces voitures, vous allez devoir retirer une des clés du trousseau, la ranger ailleurs, et mettre la nouvelle clé sur le trousseau. C'est le mappage de la mémoire dans et hors de l'espace d'adressage. .

Et si tous les habitants du bâtiment essayaient chacun de garer dix voitures en RAM ? Si le parking est plein, ils devront transférer certaines de ces voitures dans le parking en bas de la rue. Cela les empêche-t-il d'avoir des clés sur leur porte-clés ? Non, évidemment pas. Ça ralentit juste les choses quand ils veulent conduire une voiture qui est garée sur le disque.

Et s'il y avait un service de voiturier qui savait quelles voitures les gens étaient le plus susceptibles d'utiliser, et qui déplaçait les moins utilisées vers le parking en bas de la rue ? C'est le gestionnaire de mémoire qui met les pages de mémoire les moins utilisées dans le fichier d'échange.

Vous soulignez que vous avez un gros disque. Supposons que vous ayez un fichier de 10 Go sur ce disque. Vous pouvez certainement utiliser le contenu de ce fichier dans votre programme .NET, mais vous ne pouvez pas le charger en entier dans votre programme .NET. espace d'adressage contigu en même temps. Tu dois le lire par morceaux. Si tu étais intelligent, tu pourrais le mettre dans la mémoire du processus tout d'un coup vous avez plein de possibilités mémoire -- mais vous ne pouviez pas ensuite mettre en correspondance 10 Go de mémoire en 2 Go de espace adresse .

En général, il est plus facile de ne pas essayer d'obtenir autant de mémoire en premier lieu ; il suffit de lire quelques centaines de Ko à la fois.

Il est extrêmement courant que les gens confondent l'espace d'adressage avec la mémoire physique, mais ce n'est pas la même chose depuis des décennies. Pour plus de détails, voir mon article sur ce sujet, "Out Of Memory" ne fait pas référence à la mémoire physique .

13voto

Justin Points 42106

La réponse d'Eric Lipperts est tout à fait juste et vous devriez la lire en premier, mais j'ai deux ou trois choses à ajouter :

  • Vous pouvez augmenter la limite d'espace d'adressage de 2 Go en mode utilisateur à 3 Go en utilisant la fonction appelée /Commutateur 3G - il s'agit d'un par machine qui réduit l'espace d'adressage utilisé par le système d'exploitation à 1 Go (au lieu de 2 Go), libérant ainsi 1 Go supplémentaire pour l'espace d'adressage du mode utilisateur.
  • Si vous exécutez votre processus 32 bits sous un système d'exploitation 64 bits, la limite maximale de l'espace d'adressage en mode utilisateur est augmentée à 4 Go (même si votre application est compilée en tant que processus 32 bits). Cela peut être utile si (par exemple) vous êtes limité à l'architecture x86 parce que certaines références ne sont encore que 32 bits.

Notez que les deux des solutions ci-dessus exigent que le IMAGE_FILE_LARGE_ADDRESS_AWARE soit activé. Voir Comment puis-je créer une application .NET (32 bits) pour utiliser 3 Go de RAM ? pour obtenir des conseils sur la façon dont vous pourriez faire cela pour une application .NET.

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