Solution 1 :
En bref :
-
Taille virtuelle : est la quantité d'espace d'adressage qu'un processus gère. L'espace d'adressage virtuel contient tout ce à quoi le processus peut accéder via des pointeurs (références d'adresse mémoire). Par exemple, si votre programme accède au framebuffer de votre carte vidéo, cette mémoire est mappée à l'espace virtuel du processus et reçoit une adresse qui est stockée dans un pointeur. Les fichiers mappés en mémoire et les mappages anonymes sont également pris en compte dans la taille de l'espace d'adressage virtuel. Presque tout est dans la taille virtuelle. Si vous additionnez la taille de toutes les plages d'adresses répertoriées dans
/proc/<pid>/maps
, il devrait vous renvoyer à peu près la même valeur de la taille virtuelle. -
Taille du résident : est la quantité de mémoire qui appartient spécifiquement à ce processus qui réside actuellement en mémoire. Cela signifie, la quantité de mémoire qui n'est pas en swap. Notez que des parties du processus peuvent se trouver dans la mémoire d'échange même lorsque le processus est en cours d'exécution. Le système d'exploitation extrait ces régions du swap lorsque le processus tente d'y accéder. Cela devrait inclure le tas, les piles de tous les threads et autres mappages privés. Si vous regardez dans
/proc/<pid>/maps
, le[stack]
,[heap]
et d'autres mappages anonymes (ceux sans chemin de fichier) sont soit permutés, soit pris en compte dans la taille résidente. -
Taille partagée : est la quantité de mémoire pouvant appartenir à plusieurs processus. Par exemple, si vous avez quatre instances de la même application chargées en mémoire, vous aurez quatre instances du tas et au moins quatre piles, une pour chaque processus (c'est la mémoire résidente), mais vous n'aurez qu'une seule instance de le code binaire du programme et ses librairies. C'est l'espace partagé. Non seulement il inclut le code binaire du programme et ses bibliothèques, mais aussi les fichiers de localisation, les données du programme en lecture seule, les segments de mémoire partagée SysV et POSIX, les sémaphores, etc... Si vous regardez dans
/proc/<pid>/maps
, la plupart des mappages liés aux fichiers de bibliothèque et de programme sont partagés.
Notez que VIRT contient l'union de RSS et SHR, et sera toujours supérieur à l'un d'eux. Certaines régions peuvent être comptabilisées à la fois comme RSS et SHR.
Solution 2 :
Dans Juliano, répondez :
Notez que RSS + SHR <=VIRT, toujours.
C'est tout simplement faux. SHR contient toute la mémoire virtuelle qui pourrait être partagée avec d'autres processus, et RSS contient toute la mémoire physique dans la RAM qui est utilisée par le processus.
Ainsi, toute la mémoire partagée actuellement dans la RAM est comptée à la fois dans SHR et dans RSS, donc SHR + RSS n'a aucun sens car il peut contenir des comptes en double.
Pour construire un processus avec RSS + SHR> VIRT, il suffit de mmaper un fichier volumineux (1 Go), puis de le lire entièrement :le fichier mmapé sera chargé en RAM, et VIRT, SHR et RSS seront chacun légèrement supérieurs à 1 Go, donc SHR + RSS> VIRT.