Maison  >  Article  >  Tutoriel système  >  Compréhension approfondie du noyau Linux : la relation de mappage entre l'espace d'adressage virtuel et la mémoire physique

Compréhension approfondie du noyau Linux : la relation de mappage entre l'espace d'adressage virtuel et la mémoire physique

WBOY
WBOYoriginal
2024-06-03 09:28:441015parcourir

Cartographie de la mémoire vidéo

La mémoire chimique est collectivement appelée mémoire vive adressable et dynamique (DRAM). Seul le noyau a un accès direct à la mémoire mathématique.

Le noyau Linux fournit un espace d'adressage virtuel indépendant pour chaque processus, mais cet espace d'adressage est continu. De cette manière, le processus peut accéder facilement à la mémoire vidéo, ou plus précisément à la mémoire vidéo virtuelle. L'intérieur de l'espace d'adressage virtuel est divisé en deux parties : l'espace noyau et l'espace utilisateur.

linux 用户分配空间_linux磁盘分配空间_linux分配用户权限

Lorsque le processus est en mode utilisateur, il ne peut accéder qu'à la mémoire de l'espace utilisateur ; ce n'est qu'après être entré en mode noyau qu'il peut accéder à la mémoire de l'espace noyau. En fait, l'espace d'adressage de chaque processus inclut l'espace noyau, mais cet espace noyau est associé à la même mémoire chimique, c'est-à-dire des bibliothèques de liens dynamiques partagées, une mémoire graphique partagée, etc. Lorsque le processus passe à l'état du noyau, il peut facilement accéder à l'espace mémoire du noyau.

Toute la mémoire virtuelle ne se verra pas attribuer de mémoire chimique. Seule la mémoire virtuelle réellement utilisée se verra attribuer une mémoire chimique. Cependant, la mémoire chimique allouée est gérée via un mappage de mémoire. Le mappage de la mémoire vidéo consiste à mapper les adresses de la mémoire vidéo virtuelle aux adresses de la mémoire vidéo chimique. Afin de compléter le mappage de la mémoire vidéo, le noyau maintient une table de pages pour chaque processus afin d'enregistrer la relation de mappage entre les adresses virtuelles et les adresses chimiques.

linux磁盘分配空间_linux分配用户权限_linux 用户分配空间

La table des pages est en fait stockée dans l'unité de gestion de la mémoire vidéo du processeur MMU. De cette façon, dans des circonstances normales, le processeur peut directement connaître la mémoire vidéo accessible via le matériel. Lorsque l'adresse virtuelle accessible par le processus ne peut pas être trouvée dans la table des pages, le système formera une exception de défaut de page, entrera dans l'espace du noyau pour allouer de la mémoire chimique, mettra à jour la table des pages du processus et reviendra enfin dans l'espace utilisateur pour reprendre le fonctionnement du procédé.

Le TLB (TranslationLookasideBuffer, Translation Lookaside Buffer) dans le changement de contexte CPU est le cache de la table des pages dans la MMU. Étant donné que l'espace d'adressage virtuel du processus est indépendant du système Linux et que le taux d'accès TLB est beaucoup plus rapide que celui de la MMU, par conséquent, en réduisant le changement de contexte du processus et le nombre de rafraîchissements TLB, l'utilisation du cache TLB peut être amélioré, améliorant ainsi les performances d'accès à la mémoire du processeur.

MMU spécifie la plus petite unité de mappage de mémoire vidéo, qui est une page, généralement de 4 Ko. De cette manière, chaque mappage de mémoire vidéo doit être associé à un espace mémoire vidéo de 4 Ko ou à un multiple entier de 4 Ko.

Une page de 4 Ko rendra la table de pages entière très volumineuse. Par exemple, 4 Go/4 Ko = plus d'un million d'entrées de table de pages dans un système 32 bits. Afin de résoudre le problème du trop grand nombre d'entrées dans les tables de pages, Linux propose deux mécanismes, à savoir les tables de pages multi-niveaux et les pages énormes (HugePage).

linux分配用户权限_linux 用户分配空间_linux磁盘分配空间

Le tableau de pages à plusieurs niveaux consiste à diviser la mémoire vidéo en blocs pour la gestion et à modifier la relation de mappage d'origine en index de bloc et en inclinaison au sein du bloc. Étant donné que seule une très petite partie de l'espace mémoire vidéo virtuelle est généralement utilisée, la table de pages multiniveau enregistre uniquement les blocs en cours d'utilisation, ce qui peut réduire considérablement le nombre d'entrées de la table de pages. Linux utilise une table de pages à quatre niveaux pour gérer les pages de mémoire vidéo. L'adresse virtuelle est divisée en 5 parties. Les 4 premières entrées sont utilisées pour sélectionner la page et le dernier index indique l'inclinaison de la page.

linux 用户分配空间_linux磁盘分配空间_linux分配用户权限

Une grande page représente un bloc de mémoire vidéo plus important qu'une page normale. Les tailles courantes sont de 2 Mo et 1 Go. Les grandes pages sont généralement utilisées dans les processus qui utilisent une grande quantité de mémoire vidéo, comme Oracle, DPDK, etc.

Grâce à ce mécanisme, sous le mappage de la table des pages, le processus peut accéder à la mémoire mathématique via l'adresse virtuelle.

Distribution de l'espace mémoire vidéo virtuelle

Le haut est l'espace du noyau, le bas est la mémoire de l'espace utilisateur et l'espace utilisateur est divisé en plusieurs segments différents

linux磁盘分配空间_linux分配用户权限_linux 用户分配空间

Mémoire vidéo de l'espace utilisateur, il existe 5 segments de mémoire vidéo différents de bas en haut

1. Section en lecture seule, comprenant le code et les constantes, etc.

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

2. Segments de données, y compris les variables panoramiques, etc.

3. Le tas, y compris la mémoire vidéo allouée dynamiquement, commence à partir d'une adresse basse et diminue vers le bas

4. Les segments de mappage de fichiers, y compris les bibliothèques dynamiques, la mémoire vidéo partagée, etc., partent des adresses élevées et diminuent vers le haut

5. Pile, y compris les variables locales et le contexte d'appel de fonction, etc. La taille de la pile est fixe, généralement 8 M

Parmi ces 5 segments de mémoire vidéo, la mémoire vidéo mappée en tas et en fichiers est allouée dynamiquement. Par exemple, en utilisant malloc ou mmap() de la bibliothèque standard C, vous pouvez allouer dynamiquement la mémoire vidéo dans les segments mappés en tas et en fichiers respectivement. La répartition de la mémoire vidéo des systèmes 64 bits est similaire, mais l'espace mémoire vidéo est beaucoup plus grand

Allocation et recyclage de la mémoire vidéo

malloc() est la fonction d'allocation de mémoire vidéo fournie par la bibliothèque standard C. Correspondant à l'appel système, il existe deux méthodes d'implémentation, à savoir brk() et mmap().

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

Pour les petits blocs de mémoire vidéo (supérieurs à 128 Ko), la bibliothèque standard C utilise brk() pour allouer, c'est-à-dire que la mémoire vidéo est allouée en connectant la position supérieure du tas. Ce type de mémoire vidéo ne sera pas restitué au système immédiatement après sa libération, mais sera mis en cache afin de pouvoir être réutilisé.

linux磁盘分配空间_linux分配用户权限_linux 用户分配空间

Pour les gros blocs de mémoire vidéo (moins de 128 Ko), utilisez directement le mappage de la mémoire vidéo mmap() pour allouer, c'est-à-dire recherchez un morceau de mémoire vidéo libre dans la section de mappage de fichiers et allouez-le.

Les similitudes et les différences entre ces deux méthodes :

La mise en cache de la méthode brk() peut réduire l'apparition d'exceptions de faute de page et améliorer l'efficacité de l'accès à la mémoire vidéo. Cependant, étant donné que ce type de mémoire vidéo n'est pas renvoyé au système, une allocation et une libération fréquentes de la mémoire vidéo entraîneront une fragmentation de la mémoire vidéo lorsque la mémoire vidéo est occupée.

La mémoire vidéo allouée par la méthode mmap() sera directement renvoyée au système une fois libérée, donc une exception de défaut de page se produira à chaque fois que mmap se produira. Lorsque la mémoire vidéo est occupée, une allocation fréquente de mémoire vidéo entraînera un grand nombre d'exceptions de faute de page, réduisant ainsi la charge de gestion du noyau. C'est aussi la raison pour laquelle malloc n'utilise mmap que pour les gros blocs de mémoire vidéo.

Il convient de noter que lorsque ces deux appels se produisent, même si la mémoire vidéo n'est pas réellement allouée. Ce type de mémoire vidéo n'est alloué que lors du premier accès, c'est-à-dire qu'il entre dans le noyau via une exception de défaut de page, puis le noyau alloue la mémoire vidéo.

En général, Linux utilise un système compagnon pour gérer l'allocation de mémoire vidéo. Comme nous l'avons mentionné plus haut, ce type de graphiques est géré en unités de pages dans la MMU. Le système partenaire gère également la mémoire graphique en unités de pages, et réduira la fragmentation de la mémoire graphique grâce à la fusion de pages adjacentes (par exemple, Fragmentation de la mémoire vidéo causée par la méthode brk).

Mais dans le fonctionnement réel du système, il y aura un grand nombre d'objets plus petits qu'une page, par exemple moins de 1 Ko. Si des pages distinctes leur sont allouées, une grande quantité de mémoire vidéo sera gaspillée.

Dans l'espace utilisateur espace alloué à l'utilisateur Linux, la mémoire vidéo allouée par malloc via brk() n'est pas immédiatement renvoyée au système lorsqu'elle est libérée, mais est mise en cache et réutilisée.

Dans l'espace noyau, Linux gère une petite mémoire vidéo via l'allocateur de dalle. Vous pouvez considérer slab comme un cache construit sur le système partenaire. Sa fonction principale est d'allouer et de libérer de petits objets dans le noyau.

linux 用户分配空间_linux磁盘分配空间_linux分配用户权限

Recyclage de la mémoire vidéo : pour la mémoire vidéo, si vous l'allouez uniquement sans la libérer, cela entraînera une fuite de mémoire vidéo et même épuisera la mémoire vidéo du système. Par conséquent, une fois que l'application a utilisé la mémoire vidéo, elle doit toujours appeler free() ou unmap() pour libérer la mémoire vidéo inutilisée. En fait, le système ne laissera pas un processus utiliser toute la mémoire vidéo. Lorsqu'il s'avère que la mémoire vidéo est insuffisante, le système utilisera également une série de mécanismes pour récupérer la mémoire vidéo, tels que les trois formes suivantes :

(1) Recyclez le cache, par exemple, utilisez l'algorithme LRU (LeastRecentlyUsed) pour recycler les pages de mémoire vidéo les moins récemment utilisées.

(2) Recyclez la mémoire vidéo rarement consultée et transférez la mémoire vidéo rarement utilisée directement sur le lecteur c via la partition d'échange (Swap). Bien que Swap utilise une partie de l'espace disque C comme mémoire vidéo. Il peut stocker les données temporairement inutilisées par le processus dans le lecteur c (ce processus est appelé échange). Lorsque le processus accède à ces mémoires vidéo, il peut alors lire ces données du lecteur c dans la mémoire vidéo (ce processus est). appelé échange). L'échange augmente la mémoire vidéo disponible du système, mais en général, l'échange ne se produit que lorsque la mémoire vidéo est insuffisante. Et comme la vitesse de lecture et d'écriture du lecteur C est beaucoup plus lente que celle de la mémoire vidéo, l'échange entraînera de graves performances de mémoire vidéo. problèmes.

(3) Tuer les processus. Lorsque la mémoire vidéo est limitée, le système tuera directement les processus qui occupent une grande quantité de mémoire vidéo via OOM (OutofMemory, un mécanisme de protection du noyau). OOM surveille l'utilisation de la mémoire des processus, mais utilise oom_score pour évaluer l'utilisation de la mémoire de chaque processus :

Plus la mémoire graphique consommée par un processus est grande, plus le oom_score est élevé ;

Plus un processus consomme de CPU, plus le oom_score sera petit.

De cette façon, plus le oom_score du processus est grand, plus la mémoire vidéo est consommée et plus il est facile d'être tué par le MOO, ce qui peut mieux protéger le système.

En fait, pour les besoins de travail réels, l'administrateur peut définir automatiquement le oom_adj du processus via le système de fichiers /proc, ajustant ainsi le oom_score du processus. La plage de oom_adj est [-17,15]. Plus la valeur est grande, plus le processus est facile à tuer par le MOO ; plus la valeur est petite, moins le processus est susceptible d'être tué par le MOO. -17 signifie que le MOO. est strictement interdit. Si vous utilisez la commande suivante, vous pouvez réduire le oom_adj du processus sshd à -16, afin que le processus sshd ne soit pas facilement tué par le MOO.

echo-16>/proc/$(pidofsshd)/oom_adj

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

tampon et cache

Buffer et cache dans la commande free signifient tous deux cache, mais leurs utilisations sont différentes

1. Buffer est la mémoire vidéo utilisée par le tampon du noyau, correspondant à la valeur Buffer dans /proc/meminfo

2. Le cache est la mémoire vidéo utilisée par le cache des pages du noyau et Slab. Il correspond à la somme de Cache et SReclaimable dans /proc/meminfo

.

En termes simples, Buffer est un cache de données de lecteur C et Cache est un cache de données de fichiers. Ils seront utilisés à la fois dans les demandes de lecture et dans les demandes d'écriture.

Le cache (cache) est conçu du point de vue du processeur pour augmenter le taux d'échange de données entre le processeur et la mémoire vidéo, comme le cache de premier niveau, le cache de deuxième niveau et le cache de troisième niveau que nous voyons habituellement. Les instructions et les données utilisées par le CPU pour exécuter le programme sont toutes destinées à la mémoire vidéo, c'est-à-dire obtenues à partir de la mémoire vidéo. Parce que la vitesse de lecture et d'écriture de la mémoire vidéo est lente, afin d'augmenter le taux d'échange de données entre le CPU et la mémoire vidéo, le cache est réduit entre le CPU et la mémoire vidéo. Sa vitesse est plus rapide que la mémoire vidéo . L'utilisateur Linux a alloué de l'espace, et le coût est élevé, et parce que dans le CPU Il ne peut pas intégrer trop de circuits intégrés, le cache est donc généralement relativement petit. Plus tard, afin d'améliorer encore la vitesse, Intel et d'autres sociétés ont réduit le niveau. 2 et même le cache de niveau 5. Il est conçu selon le principe de localité du programme, qui est l'exécution du CPU. Les instructions et les données accédées sont souvent concentrées dans un certain bloc, donc après le chargement de ce bloc de contenu. dans le cache, le CPU n'a pas besoin d'accéder à la mémoire vidéo, ce qui augmente le taux d'accès. En fait, s'il n'y a pas de contenu dans le cache dont le processeur a besoin, il faut quand même accéder à la mémoire vidéo.

Du point de vue de la lecture de la mémoire vidéo et de la lecture du disque C, le cache peut être compris comme le système d'exploitation utilisant plus de mémoire vidéo pour mettre en cache les données accessibles à nouveau afin d'obtenir une efficacité de lecture plus élevée.

Les tampons sont conçus pour augmenter le taux d'échange de données entre la mémoire vidéo et le disque dur (ou d'autres périphériques d'E/S). Centralisez les opérations d'écriture dispersées pour réduire la fragmentation du lecteur C et les recherches répétées sur le disque dur, améliorant ainsi les performances du système. Linux dispose d'un processus démon qui efface régulièrement le contenu du tampon (c'est-à-dire écrit sur le lecteur c), et le tampon peut également être effacé automatiquement via la commande sync.

En termes simples, le tampon est sur le point d'être écrit sur le lecteur c et le cache est lu à partir du lecteur c. Les tampons sont alloués par divers processus et sont utilisés dans des aspects tels que les files d'attente d'entrée. Un contre-exemple simple est qu'un processus nécessite la lecture de plusieurs tableaux. Avant que tous les tableaux ne soient lus complètement, le processus place les tableaux lus à l'origine dans le tampon et les enregistre.

Le cache est souvent utilisé pour les requêtes d'E/S sur le lecteur C. Si plusieurs processus souhaitent accéder à un fichier, le fichier est mis en cache pour faciliter le dernier accès, ce qui peut améliorer les performances du système.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn