Il y a quelques jours, un autre collègue est venu poser une autre question liée à la mémoire virtuelle. J'ai découvert que ma compréhension de la mémoire virtuelle n'était pas assez approfondie et que certains concepts étaient quelque peu contradictoires. J'ai donc parcouru les informations et réorganisé ces connaissances, dans l'espoir de les utiliser plus facilement la prochaine fois.
Il y a peu, il y a eu un autre partage dans le groupe que j'attendais avec impatience : "Linux Virtual Memory". C'était alors que nous faisions des heures supplémentaires une nuit et que nous discutions du concept de mémoire virtuelle. Le leader a découvert que plusieurs collègues n'avaient pas une compréhension claire de la mémoire virtuelle, il a donc spécialement choisi le sujet pour cet étudiant (rires).
J'ai déjà appris quelques concepts sur les systèmes d'exploitation, principalement parce que j'étais ennuyé par les quatre années d'université perdues après l'obtention de mon diplôme. Je me sentais un peu désolé pour ma formation en informatique, alors j'ai pris le temps après le travail de regarder le système d'exploitation s'ouvrir. classe du Harbin Institute of Technology dans NetEase Cloud Classroom. , J'ai également lu un livre relativement superficiel sur les systèmes d'exploitation, "Linux Kernel Design and Implementation", et lorsque j'ai écrit un simple serveur en C l'année dernière, j'en ai également appris davantage sur le sous-jacent. connaissance du système. Grâce à ces connaissances, je me sens plus en contrôle des connaissances de la couche application, et cela m'a également aidé lors du dépannage du problème la dernière fois.
Il y a quelques jours, un autre collègue est venu poser une autre question liée à la mémoire virtuelle. J'ai découvert que ma compréhension de la mémoire virtuelle n'était pas assez approfondie et que certains concepts étaient quelque peu contradictoires. J'ai donc parcouru les informations et réorganisé ces connaissances, dans l'espoir de les utiliser plus facilement la prochaine fois.
L'origine de la mémoire virtuelle
Il ne fait aucun doute que la mémoire virtuelle est certainement l'un des concepts les plus importants du système d'exploitation. Je pense que cela est principalement dû à la « position stratégique » importante de la mémoire. Le processeur est trop rapide, mais a une petite capacité et une seule fonction. Les autres matériels d'E/S prennent en charge diverses fonctions sophistiquées, mais elles sont trop lentes par rapport au processeur. Il faut donc un lubrifiant entre eux comme tampon, et c’est là que la mémoire entre en jeu.
Dans les systèmes d'exploitation modernes, le multitâche est standard. Le parallélisme multitâche améliore considérablement l'utilisation du processeur, mais conduit également à des conflits dans les opérations de mémoire entre plusieurs processus. Le concept de mémoire virtuelle a été proposé pour résoudre ce problème.
L'image ci-dessus est l'explication la plus simple et la plus intuitive de la mémoire virtuelle.
Le système d'exploitation a un morceau de mémoire physique (la partie centrale) et deux processus (en fait plus) P1 et P2. Le système d'exploitation dit respectivement à P1 et P2 que toute ma mémoire est à vous, utilisez-la comme vous le souhaitez et gérez-la. . assez. Mais en fait, le système d'exploitation leur a juste tiré un gros gâteau. Ces mémoires auraient été attribuées à P1 et P2, mais en fait, ils n'ont reçu qu'un numéro de série. Ce n'est que lorsque P1 et P2 commencent réellement à utiliser ces mémoires que le système commence à se déplacer et à reconstituer les différents blocs du processus. P2 pense qu'il utilise la mémoire A, mais en fait, elle a été discrètement redirigée vers la mémoire B réelle. le système. Même lorsque P1 et P2 partagent la mémoire C, ils ne le savent pas.
Cette méthode des systèmes d'exploitation pour tromper les processus est la mémoire virtuelle. Pour des processus tels que P1 et P2, ils pensent tous qu'ils occupent toute la mémoire, et ils ne savent pas et n'ont pas besoin de se soucier de l'adresse de la mémoire physique qu'ils utilisent.
Pagination et tableaux de pages
La mémoire virtuelle est un concept dans le système d'exploitation. Pour le système d'exploitation, la mémoire virtuelle est un tableau de comparaison Lorsque P1 obtient les données dans la mémoire A, il doit se rendre à l'adresse A de la mémoire physique pour trouver les données dans la mémoire B. . Il doit aller à l’adresse C de la mémoire physique.
Nous savons que l'unité de base du système est l'octet. Si chaque octet de mémoire virtuelle est mappé à l'adresse de la mémoire physique, chaque entrée nécessite au moins 8 octets (adresse virtuelle 32 bits -> adresse physique 32 bits), dans le cas de la mémoire 4G, 32 Go d'espace sont nécessaires pour stocker le tableau de comparaison, ce tableau est donc trop grand pour contenir même l'adresse physique réelle, le système d'exploitation introduit donc le concept de page.
Lorsque le système démarre, le système d'exploitation divise toute la mémoire physique en pages en unités de 4K. Lorsque la mémoire est allouée à l'avenir, l'unité est une page, donc la table de mappage des pages de mémoire virtuelle correspondant aux pages de mémoire physique est considérablement réduite. La mémoire 4G ne nécessite qu'une table de mappage de 8 Mo. Certains processus n'utilisent pas de mémoire virtuelle. Il est nécessaire de sauvegarder la relation de mappage, et Linux conçoit également une table de pages à plusieurs niveaux pour une mémoire volumineuse, qui peut faire avancer une page pour réduire la consommation de mémoire. La table de mappage de la mémoire virtuelle du système d'exploitation vers la mémoire physique est appelée table de pages.
Adressage et allocation de mémoire
Nous savons que grâce au mécanisme de mémoire virtuelle, chaque processus pense qu'il occupe toute la mémoire. Lorsque le processus accède à la mémoire, le système d'exploitation convertira l'adresse de mémoire virtuelle fournie par le processus en adresse physique, puis obtiendra les données. à l'adresse physique correspondante. Il y a un élément matériel dans le CPU, l'unité de gestion de mémoire MMU (Memory Management Unit), qui est spécialement utilisée pour traduire les adresses de mémoire virtuelle. Le processeur définit également une stratégie de cache pour l'adressage des tables de pages. En raison de la localisation du programme, son taux de réussite dans le cache peut atteindre 98 %.
La situation ci-dessus est le mappage de l'adresse virtuelle à l'adresse physique dans la mémoire de la table de pages. Si l'adresse physique accédée par le processus n'a pas été allouée, le système générera une interruption de défaut de page. Pendant le traitement de l'interruption, le système passe à. l'état du noyau pour la virtualisation des processus. Adresse attribue une adresse physique.
Fonction
La mémoire virtuelle résout non seulement le problème des conflits d'accès à la mémoire entre plusieurs processus grâce à la traduction d'adresses mémoire, mais apporte également plus d'avantages.
Gestion de la mémoire des processus
Cela aide le processus de gestion de la mémoire, principalement reflété dans :
Intégrité de la mémoire : En raison de la « tromperie » de la mémoire virtuelle sur le processus, chaque processus pense que la mémoire qu'il obtient est une adresse continue. Lorsque nous écrivons une application, nous n'avons pas besoin de considérer l'allocation de gros blocs d'adresses. Nous pensons toujours que le système dispose de suffisamment de gros blocs de mémoire.
Sécurité : puisque lorsqu'un processus accède à la mémoire, il doit être traité via la table des pages. Le système d'exploitation peut implémenter le contrôle des autorisations de mémoire en ajoutant divers indicateurs d'autorisation d'accès à chaque élément de la table des pages.
Partage de données
Il est plus facile de partager de la mémoire et des données via la mémoire virtuelle.
Lorsqu'un processus charge une bibliothèque système, il alloue toujours d'abord un morceau de mémoire et charge le fichier de bibliothèque sur le disque dans cette mémoire lorsqu'il utilise directement la mémoire physique, car l'adresse de la mémoire physique est unique, même si le système constate que la mémoire physique est unique. la même bibliothèque est dans le système. Elle a été chargée deux fois, mais la mémoire de chargement spécifiée par chaque processus était différente et le système n'a rien pu faire.
Lors de l'utilisation de la mémoire virtuelle, le système doit uniquement faire pointer l'adresse de mémoire virtuelle du processus vers l'adresse de mémoire physique où se trouve le fichier de bibliothèque. Comme le montre la figure ci-dessus, les adresses B des processus P1 et P2 pointent toutes deux vers l'adresse physique C.
Il est également très simple d'utiliser la mémoire partagée en utilisant la mémoire virtuelle. Le système n'a qu'à faire pointer l'adresse de mémoire virtuelle de chaque processus vers l'adresse de mémoire partagée allouée par le système.
ÉCHANGE
La mémoire virtuelle permet aux processus « d'étendre » la mémoire.
Nous avons mentionné plus tôt que la mémoire virtuelle alloue de la mémoire physique au processus via des interruptions de défaut de page. La mémoire est toujours limitée. Que se passe-t-il si toute la mémoire physique est occupée ?
Linux propose le concept de SWAP. Les partitions SWAP peuvent être utilisées sous Linux. Lorsque la mémoire physique est allouée mais que la mémoire disponible est insuffisante, les données de mémoire temporairement inutilisées seront d'abord placées sur le disque, permettant aux processus qui en ont besoin de l'utiliser en premier. puis le processus devra les utiliser à nouveau. Ces données sont ensuite chargées en mémoire Grâce à cette technologie « d'échange », Linux peut permettre au processus d'utiliser plus de mémoire.
FAQ
J'avais également beaucoup de questions sur la compréhension de la mémoire virtuelle.
32 bits et 64 bits
Le problème le plus courant concerne les versions 32 bits et 64 bits.
Le processeur accède à la mémoire via un bus physique, la plage d'adresses d'accès est donc limitée par le nombre de bus machine. Sur une machine 32 bits, il y a 32 bus. Chaque bus a deux potentiels, haut et bas, représentant les bits 1 et 2. 0 respectivement. Ensuite, l'adresse maximale accessible est 2 ^ 32 bits = 4 Go, il n'est donc pas valide d'insérer une mémoire supérieure à 4 Go sur une machine 32 bits et le processeur ne peut pas accéder à une mémoire supérieure à 4 Go.
Mais les machines 64 bits n'ont pas de bus 64 bits et leur mémoire maximale est limitée par le système d'exploitation Linux prend actuellement en charge un maximum de 256 Go de mémoire.
Selon le concept de mémoire virtuelle, il est acceptable d'exécuter un logiciel 64 bits sur un système 32 bits. Cependant, en raison de la conception structurelle des adresses de mémoire virtuelle du système, les adresses virtuelles 64 bits ne peuvent pas être utilisées en 32 bits. systèmes.
Exploiter directement la mémoire physique
Le système d'exploitation utilise la mémoire virtuelle. Que devons-nous faire si nous voulons exploiter directement la mémoire ?
Linux mappera chaque périphérique à un fichier du répertoire /dev/ Nous pouvons directement faire fonctionner le matériel via ces fichiers de périphérique, et la mémoire ne fait pas exception. Sous Linux, les paramètres de mémoire sont mappés sur /dev/mem et l'utilisateur root peut directement exploiter la mémoire en lisant et en écrivant dans ce fichier.
Le processus JVM occupe trop de mémoire virtuelle
Lorsque nous utilisons TOP pour afficher les performances du système, nous constaterons que dans la colonne VIRT, le processus Java occupera une grande quantité de mémoire virtuelle.
La raison de ce problème est que Java utilise le pool de mémoire Arena de Glibc pour allouer une grande quantité de mémoire virtuelle et ne pas l'utiliser. De plus, les fichiers lus par Java seront également mappés dans la mémoire virtuelle. Dans la configuration par défaut de la machine virtuelle, chaque pile de threads Java occupera 1 Mo de mémoire virtuelle. Pour plus de détails, vous pouvez vérifier pourquoi les programmes multithread sous Linux consomment autant de mémoire virtuelle.
La mémoire physique réelle occupée dépend de la colonne RES (résidente). La valeur de cette colonne est la taille réelle mappée à la mémoire physique.
Commandes de gestion couramment utilisées
Nous pouvons également gérer nous-mêmes la mémoire virtuelle Linux.
Afficher l'état de la mémoire système
Il existe de nombreuses façons de vérifier l'état de la mémoire du système. Des commandes telles que free et vmstat peuvent afficher l'état de la mémoire du système actuel. Il convient de noter que la mémoire disponible n'est pas seulement la colonne libre en raison des caractéristiques paresseuses du système. système d'exploitation, un grand nombre de tampons/cache sont présents. Les processus ne seront pas nettoyés immédiatement après qu'ils ne soient plus utilisés. Si les processus qui les utilisaient auparavant peuvent continuer à être utilisés à nouveau, ils peuvent également être exploités si nécessaire.
De plus, vous pouvez utiliser cat /proc/meminfo pour afficher les détails de l'utilisation de la mémoire système, y compris l'état des pages sales, etc. Les détails peuvent être trouvés à l'adresse : /PROC/MEMINFO Mystery.
pmap
Si vous souhaitez visualiser la distribution de mémoire virtuelle d'un processus individuellement, vous pouvez utiliser la commande pmap pid, qui répertoriera l'occupation de chaque segment de mémoire virtuelle de l'adresse basse à l'adresse haute.
Vous pouvez ajouter des paramètres -XX pour afficher des informations plus détaillées.
Modifier la configuration de la mémoire
Nous pouvons également modifier la configuration du système Linux, utiliser sysctl vm [-options] CONFIG ou directement lire et écrire des fichiers dans le répertoire /proc/sys/vm/ pour afficher et modifier la configuration.
Opération SWAP
La fonctionnalité SWAP de la mémoire virtuelle n'est pas toujours bénéfique. Permettre au processus d'échanger en continu de grandes quantités de données entre la mémoire et le disque occupera considérablement le processeur et réduira l'efficacité de fonctionnement du système, nous ne souhaitons donc parfois pas utiliser le swap.
Nous pouvons modifier vm.swappiness=0 pour que la mémoire utilise le moins possible le swap, ou simplement utiliser la commande swapoff pour désactiver SWAP.
Résumé
Le concept de mémoire virtuelle est très simple à comprendre, mais il en découlera une série de connaissances très complexes. Cet article ne parle que de quelques principes de base et ignore de nombreux détails, tels que l'utilisation de registres de segment intermédiaire dans l'adressage de la mémoire virtuelle, l'utilisation de la mémoire virtuelle par le système d'exploitation pour améliorer les applications de cache et de tampon, etc. S'il y a une opportunité, je j'en parlerai séparément.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!