Avez-vous déjà rencontré divers problèmes de mémoire dans les systèmes Linux ? Tels que les fuites de mémoire, la fragmentation de la mémoire, etc. Ces problèmes peuvent être résolus par une compréhension approfondie du mécanisme de recyclage de la mémoire du noyau Linux.
Peu importe la quantité de mémoire disponible sur l'ordinateur, elle n'est pas suffisante, le noyau Linux doit donc récupérer certaines pages de mémoire rarement utilisées pour garantir que le système continue d'utiliser la mémoire. Il existe trois méthodes de recyclage de page : la réécriture de page, l'échange de page et la suppression de page : si le stockage de sauvegarde d'une page rarement utilisée est un périphérique bloc (tel qu'un mappage de fichiers), la mémoire peut être directement synchronisée avec le périphérique bloc pour libérer la page. La page peut être réutilisée ; si la page n'a pas de stockage de sauvegarde, elle peut être échangée vers une partition d'échange spécifique, puis replacée dans la mémoire lors d'un nouvel accès si le stockage de sauvegarde de la page est un fichier, mais le contenu du fichier ne peut pas être modifié dans la mémoire (comme un fichier exécutable), il peut être supprimé directement s'il n'est pas actuellement nécessaire.
2.1 Recyclage des cadres de page
LRU (Least Récemment Utilisé), la liste chaînée la moins récemment utilisée, est classée en fonction de l'utilisation récente. La liste la moins utilisée existe à la fin de la liste chaînée, ce qui peut être vu à travers la définition de macro suivante :
.
#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))
Chaque zone dispose de 5 listes chaînées LRU pour stocker diverses pages récemment utilisées.
enum lru_list {
LRU_INACTIVE_ANON = LRU_BASE,
LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
LRU_UNEVICTABLE,
NR_LRU_LISTS
};
Parmi eux, les pages des quatre listes chaînées INACTIVE_ANON, ACTIVE_ANON, INACTIVE_FILE et ACTIVE_FILE peuvent être recyclées. ANON représente un mappage anonyme, aucun stockage de sauvegarde ; FILE représente un mappage de fichiers.
Lors du recyclage des pages, les pages INACTIVES seront recyclées en premier. Ce n'est que lorsqu'il y a très peu de pages INACTIVES que les pages ACTIVES seront prises en compte pour le recyclage.
Afin d'évaluer l'activité de la page, le noyau introduit deux drapeaux, PG_referend et PG_active. Pourquoi avons-nous besoin de deux bits ? Supposons qu'un seul PG_active soit utilisé pour identifier si la page est active. Ce bit est défini lors de l'accès à la page, mais quand est-il clair ? Cela nécessite de maintenir un grand nombre de timers du noyau, et cette approche est vouée à l'échec.
Une approche plus élégante peut être implémentée en utilisant deux indicateurs. L'idée principale est la suivante : un indiquant le niveau d'activité actuel et un autre indiquant s'il a été référencé récemment. La figure suivante illustre l'algorithme de base.
En gros, il y a les étapes suivantes :
(1) Si la page est active, définissez le bit PG_active et enregistrez-le dans la liste ACTIVE LRU, sinon définissez-le sur INACTIVE ;
(2) À chaque accès à la page, le bit PG_referenced est défini. La fonction mark_page_accessed est responsable de ce travail ;
(3) PG_referenced et les informations fournies par le mappage inverse sont utilisées pour déterminer l'activité de la page. Chaque fois que ce bit est effacé, la fonction page_referenced implémente ce comportement ;
(4) Entrez à nouveau mark_page_accessed. S'il s'avère que PG_referenced a été défini, cela signifie que page_referenced n'est pas coché, donc mark_page_accessed est appelé plus fréquemment que page_referenced, ce qui signifie que la page est fréquemment consultée. Si la page est dans la liste chaînée INACTIVE, déplacez-la vers ACTIVE. De plus, l'indicateur PG_active sera défini et PG_referenced sera effacé ;
(5) Le transfert inverse est également possible lorsque l'activité de la page diminue, page_referenced peut être appelé deux fois de suite sans mark_page_accessed entre les deux.
Si l'accès à une page mémoire est stable, alors les appels à page_referenced et mark_page_accessed sont de nature équilibrée et la page reste dans la liste LRU actuelle. Cette solution garantit également que les pages mémoire ne sauteront pas rapidement entre les listes chaînées ACTIVE et INACTIVE.
2.2 Recyclage cache dalle****
Le recyclage du cache Slab est relativement flexible et toutes les méthodes enregistrées dans Shrinker_list seront exécutées.
Le noyau enregistre la méthode prune_super pour chaque système de fichiers par défaut. Cette fonction est utilisée pour recycler le cache dentry et inode qui ne sont plus utilisés dans le système de fichiers ;
Le mécanisme lowmemorykiller d'Android enregistre une méthode pour tuer sélectivement les processus et récupérer la mémoire utilisée par le processus. 3****Comment recycler les cadres de page
Où Shrink_page_list est le processus de recyclage des pages
4.1 kswapd
kswapd est un thread de recyclage de mémoire créé par le noyau pour chaque nœud de mémoire. Pourquoi a-t-il besoin d'un recyclage périodique alors qu'il existe un mécanisme de recyclage en pénurie ? Étant donné que certaines allocations de mémoire ne sont pas autorisées à bloquer l'attente de récupération, telles que les allocations de mémoire dans les gestionnaires d'interruptions et d'exceptions, certaines allocations de mémoire ne sont pas autorisées à activer l'accès aux E/S ; Seuls quelques cas de manque de mémoire peuvent exécuter complètement le processus de recyclage, il est donc très nécessaire d'utiliser le temps d'inactivité du système pour récupérer de la mémoire.
Cette fonction enregistre l'ordre d'allocation utilisé lors de la dernière opération d'équilibrage. Si kswapd_max_order est supérieur à la dernière valeur, ou si classzone_idx est inférieur à la dernière valeur, balance_pgdat est appelé pour équilibrer à nouveau le domaine mémoire. Le temps de sommeil est de HZ /10, pour le bras (HZ=100), le temps de sommeil est de 1 ms.
balance_pgdat équilibre l'opération jusqu'à zone_wartermark_ok du domaine mémoire.
4.2 cache_reap
cache_reap est utilisé pour recycler les objets inactifs dans la dalle Si les objets inactifs peuvent être restaurés sur une page, ils sont renvoyés vers le système partenaire. Chaque fois que cache_reap est appelé, tous les slab_caches seront parcourus, puis il dormira pendant 2*HZ Pour arm (HZ=100), le cycle est de 20 ms.
En bref, le mécanisme de recyclage de la mémoire du noyau Linux est un concept très important qui peut vous aider à mieux comprendre la gestion de la mémoire dans les systèmes Linux. Si vous souhaitez en savoir plus sur ce concept, vous pouvez consulter les ressources fournies dans cet article.
(1)《comprendre le noyau Linux》
(2) 《architecture de noyau Linux professionnelle》
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!