Maison > Article > Tutoriel système > Mémoire virtuelle Linux, vous la comprenez bien ?
Récemment, il y a un sujet de partage dans le groupe que j'attends avec impatience : "La mémoire virtuelle sous Linux". Un soir, alors que nous faisions des heures supplémentaires, nous discutions du concept de mémoire virtuelle. Notre chef a constaté que plusieurs collègues ne comprenaient pas assez clairement la mémoire virtuelle, il a donc spécialement choisi ce sujet pour ce collègue (rires).
Avant, j'avais une certaine compréhension du concept des systèmes d'exploitation, mais après l'obtention de mon diplôme, j'ai ressenti un peu de regret face au gaspillage de mes quatre années de spécialisation en informatique à l'université. Par conséquent, après le travail, j'ai pris le temps de regarder le cours sur le système d'exploitation ouvert du Harbin Institute of Technology sur NetEase Cloud Classroom, et j'ai également lu un livre « Linux Kernel Design and Implementation » qui explique les concepts de base des systèmes d'exploitation. De plus, l'année dernière, j'ai écrit un serveur simple en langage C et j'en ai appris davantage sur le système sous-jacent. Ces connaissances m'ont permis de mieux appréhender la couche applicative et m'ont beaucoup aidé lors d'un récent dépannage.
Il y a quelques jours, un autre collègue m'a posé une autre question liée à la mémoire virtuelle, et j'ai réalisé que ma compréhension de la mémoire virtuelle n'était pas assez approfondie, et que certains concepts étaient même contradictoires. Par conséquent, j'ai parcouru quelques informations et réorganisé ces connaissances, dans l'espoir d'être plus à l'aise dans l'application pratique la prochaine fois.
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 c'est principalement à cause de l'importance de la mémoire dans l'ensemble du système. Le processeur est très rapide, mais a une capacité limitée et une seule fonction. Les autres matériels d'E/S prennent en charge diverses fonctions sophistiquées, mais elles sont plus lentes que le processeur. Par conséquent, ils ont besoin d’un lubrifiant qui agisse comme un tampon entre eux, et c’est là que la mémoire entre en jeu.
Dans les systèmes d'exploitation modernes, le multitâche est devenu la norme. Le parallélisme multitâche améliore considérablement l'utilisation du processeur, mais il entraîne également des conflits dans les opérations de mémoire entre plusieurs processus. Le concept de mémoire virtuelle vise à 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.
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 et rechercher les données en 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 a donc introduit 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 être paginée pour réduire la consommation de mémoire. La table de mappage entre la mémoire virtuelle du système d'exploitation et la mémoire physique s'appelle 页表
.
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 existe un élément matériel dans le processeur qui est spécifiquement utilisé 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 %. 内存管理单元 MMU(Memory Management Unit)
Pendant le traitement de l'interruption, le système passe à l'état du noyau. pour attribuer l’adresse virtuelle au processus. 缺页中断
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.
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.
J'avais aussi beaucoup de questions sur la compréhension de la mémoire virtuelle.
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.
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 appareil sur /dev/
目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。在 Linux 中,内存设置被映射为 /dev/mem
, et l'utilisateur root pourra directement exploiter la mémoire en lisant et en écrivant ce fichier.
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 qui est réellement mappée à la mémoire physique.
Nous pouvons également gérer nous-mêmes la mémoire virtuelle Linux.
Il existe de nombreuses façons de vérifier l'état de la mémoire du système. free
、 vmstat
et d'autres commandes 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 d'exploitation. , un grand nombre de tampons/cache seront utilisés lorsque le processus n'est pas en cours d'exécution, ils ne seront pas nettoyés immédiatement après réutilisation. Si le processus qui les utilisait auparavant peut continuer à être utilisé, ils peuvent également être exploités si nécessaire. .
De plus, via cat /proc/meminfo
, vous pouvez 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 à : /PROC/MEMINFO Mystery.
Si vous souhaitez afficher la distribution de mémoire virtuelle d'un certain 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 -XX
paramètres pour afficher des informations plus détaillées.
Nous pouvons également modifier la configuration du système Linux et utiliser les fichiers du répertoire sysctl vm [-options] CONFIG
或 直接读写 /proc/sys/vm/
pour afficher et modifier la configuration.
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 la commande vm.swappiness=0
来设置内存尽量少使用 swap,或者干脆使用 swapoff
pour désactiver SWAP.
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!