Existe-t-il une relation entre la taille de la DLL en mémoire et la taille du disque dur?
C’est parce que j’utilise l’extension de Gestionnaire de tâches (MS) et que je peux accéder à un fichier EXE de la liste et cliquer avec le bouton droit de la souris sur -> Module, puis je peux voir toutes les DLL utilisées par ce fichier EXE. Il a une colonne de longueur, mais est-ce en octets? Et la valeur (longueur) de la DLL semble être différente de la taille (DLL) sur le disque dur. Pourquoi?
Il y a une relation, mais ce n’est pas tout à fait direct ou simple.
Lorsque votre DLL est utilisée pour la première fois, elle est mappée à la mémoire. Cela ne le charge pas en mémoire, mais alloue simplement un espace d’adressage dans votre processus où il peut / peut être chargé quand / si nécessaire. Ensuite, des pages individuelles de la DLL sont chargées en mémoire via la pagination à la demande. En d’autres termes, lorsque vous faites référence à une partie de l’espace d’adressage alloué, le code (ou les données) mappé (s) à cette adresse est chargé. si ce n’est pas déjà en mémoire.
À présent, le mappage d’adresses prend peu de place (une page de 4 Ko pour chaque mégaoctet d’espace d’adresses mappé). Bien sûr, lorsque vous chargez des données en mémoire, cela utilise également de la mémoire.
Notez cependant que la plupart des pages peuvent / seront partagées entre plusieurs processus. Par conséquent, si votre DLL était utilisée à la fois par 5 processus différents, elle serait mappée 5 fois (c’est-à-dire une fois pour chaque processus qui l’utilisait), mais il y aurait toujours N’avoir qu’une seule copie physique en mémoire (au moins normalement).
Entre celles-ci, il peut être un peu difficile de définir exactement ce que vous entendez par consommation de mémoire d’une DLL particulière.
Deux dimensions entrent en jeu pour déterminer la taille d’une DLL en mémoire:
.bss
est alloué, ce qui augmente sa taille. Généralement, ceci est petit et sera absent de l’alignement de la page, mais si une dll contient d’énormes tampons statiques, cela peut gonfler sa taille virtualisée. Ne pensez pas à un fichier .dll ou .exe comme quelque chose qui est copié en mémoire pour être exécuté.
Pensez-y comme un ensemble d’instructions pour le chargeur. Bien sûr, il contient le programme et le texte de données statiques. Plus important encore, il contient toutes les informations permettant de déplacer ce texte, de connecter toutes les références non satisfaites et d’exporter les références dont d’autres modules peuvent avoir besoin.
Ensuite, s’il existe des informations sur le symbole et le numéro de ligne pour le débogage, il s’agit de texte supplémentaire.
Donc, en général, vous vous attendez à ce qu’elle soit plus grande que l’image mémoire.
Tout dépend de ce que vous appelez “mémoire” et de ce que montre exactement votre extension TaskManager.
Chaque module exécutable (Exe / Dll) est mappé dans un espace d’adressage. La taille de cette cartographie est égale à sa taille. Et, je suppose, voici ce que votre “extension” vous montre.
L’encombrement de la mémoire sera généralement supérieur à la taille du disque car, lorsqu’il est mappé en mémoire, il est aligné sur la page. Les tailles de page standard sont 4Ko et 8Ko, donc si votre dll a 1Ko de code, elle utilisera encore 4Ko en mémoire.