Explorer la gestion de la mémoire et le mécanisme de mise en cache du noyau PHP

不言
Libérer: 2023-03-24 07:36:01
original
1550 Les gens l'ont consulté

Le contenu de cet article concerne l'exploration du mécanisme de gestion de la mémoire et de mise en cache du noyau PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Avant-propos :

La mémoire requise par PHP lors de son exécution est appliquée au système d'exploitation une seule fois, plutôt que plusieurs fois. . Alors, comment a-t-il fait sa demande d’un seul coup et quel a été le mécanisme ? Veuillez consulter l'introduction ci-dessous.

La couche tas est l'implémentation principale de la gestion de la mémoire PHP , la gestion de la mémoire sous-jacente de PHP, ZendMM fournit le system L'application mémoire n'est pas une application immédiate au système lorsque cela est nécessaire, mais la couche inférieure (couche tas) de ZendMM s'applique d'abord au système pour un gros bloc de mémoire, et établit un mécanisme de gestion similaire à un pool de mémoire après désactivation. , ZendMM ne renverra pas directement la mémoire au système immédiatement, mais uniquement dans le pool de mémoire (couche de stockage) qu'il maintient Notez-le comme disponible ,.

Avantages :

1 Il existe de nombreuses variables constantes prédéfinies, et il existe des centaines de demandes de mémoire, Il évite les opérations fréquentes d’application mémoire de PHP depuis le système et réduit le nombre de requêtes adressées au système d’exploitation.

2. s'exécutera plus rapidement. L'inconvénient est qu'à mesure que la durée d'exécution du programme s'allonge, l'utilisation de la mémoire augmentera. donc 5.3 introduit un nouveau mécanisme de récupération de place.


L'analyse détaillée est la suivante :


La gestion de la mémoire de PHP peut être considérée comme divisé en hiérarchique. Il est divisé en trois couches :

couche de stockage (storage), couche de tas (heap) et couche d'interface (emalloc/efree) . La couche de stockage demande en fait de la mémoire au système via des fonctions telles que malloc() et mmap(), et libère la mémoire demandée via la fonction free().



Les blocs de mémoire généralement demandés par la couche de stockage sont relativement volumineux, et la mémoire les blocs demandés ici sont volumineux. Cela ne signifie pas que la mémoire requise par la structure de la couche de stockage est grande, mais que lorsque la couche de tas appelle la méthode d'allocation de la couche de stockage, elle demande de la mémoire en gros morceaux

de la couche de stockage La fonction est de rendre la méthode d'allocation de mémoire transparente pour la couche de tas. Comme le montre la figure ci-dessous, gestionnaire de mémoire PHP. PHP a 4 schémas d'allocation de mémoire dans la couche de stockage : malloc, win32, mmap_anon, mmap_zero Par défaut, malloc est utilisé pour allouer de la mémoire. Si la macro

ZEND
_WIN32 est définie, il s'agit de la version Windows et de HeapAlloc. est appelé pour allouer de la mémoire. Les deux schémas de mémoire restants sont un mappage de mémoire anonyme, et le schéma de mémoire de PHP peut être modifié en définissant des variables d'environnement.

Figure 6.1 Gestionnaire de mémoire PHP


1. Application mémoire

La couche de tas est l'implémentation principale de la gestion de la mémoire PHP. La gestion de la mémoire sous-jacente de PHP s'articule autour de la petite liste de mémoire (free_buckets), de la grande liste de mémoire (large_free_buckets) et de la liste de mémoire restante. (rest_buckets) trois listes pour effectuer un traitement hiérarchique. L'application de mémoire effectuée par ZendMM sur le système ne s'applique pas immédiatement au système lorsque cela est nécessaire. Au lieu de cela, la couche inférieure (couche de tas) de ZendMM s'applique d'abord au système. un gros bloc. En remplissant les trois listes ci-dessus, un mécanisme de gestion similaire à un pool de mémoire est établi.


Lorsque le programme a besoin d'utiliser de la mémoire, ZendMM allouera la mémoire correspondante dans le pool de mémoire pour utiliser. L'avantage est que cela évite les opérations fréquentes d'application mémoire de PHP depuis le système , comme le code suivant :




[php] view plain copy 
<?php  
  $tipi = "o_o\n";  
  echo $tipi;  
?>
Copier après la connexion


Il s'agit d'un simple programme PHP, mais en comptant les appels à emalloc, c'est juste un programme PHP qui n'attribue qu'une variable, mais on constate qu'il y a des centaines de demandes de mémoire. Bien sûr, c'est très. facile à expliquer, car L'exécution de scripts PHP nécessite la définition d'un grand nombre de variables d'environnement et de variables internes (voir PHP Kernel - Life Cycle pour plus de détails), et ces définitions elles-mêmes doivent être stockées en mémoire .

Lors de l'écriture d'extensions PHP, il est recommandé d'utiliser emalloc (en demandant le bloc mémoire du zend _mm_storage layer ) au lieu de malloc (demandant le bloc mémoire du système d'exploitation), en fait, cela signifie utiliser le ZendMM de PHP au lieu d'appeler manuellement directement gestion de la mémoire au niveau du système.


ZendMM utilise la fonction _zend_mm_alloc_int pour l'allocation de mémoire. Le processus est le suivant :




Comme on peut le voir ci-dessus allocation, PHP a L'allocation est conçue en fonction de l'objectif de PHP. PHP est généralement utilisé pour la prise en charge des données dans les applications Web. Le cycle d'exécution d'un seul script est généralement relativement court (jusqu'à quelques secondes). être effectuée indépendamment en petits blocs. Pour l'allocation, il n'y a plus de fusion compliquée de mémoire libre d'adresses non adjacentes, mais une nouvelle demande centralisée au système. L'avantage est qu'il fonctionnera plus rapidement. L'inconvénient est qu'à mesure que la durée d'exécution du programme s'allonge, l'utilisation de la mémoire sera "de plus en plus" (PHP5.2 et versions antérieures). Par conséquent, les versions antérieures à PHP5.3 ne sont pas adaptées à un fonctionnement à long terme en tant que processus démons. (Bien sûr, il existe d'autres moyens de résoudre ce problème, et un nouveau mécanisme GC a été introduit dans PHP5.3. Pour plus de détails, consultez la section suivante Noyau PHP - Fuite de mémoire et nouveau mécanisme de récupération de place)


2. Destruction de la mémoire


ZendMM adopte la même stratégie que l'application de mémoire dans le traitement de la destruction de la mémoire lorsque le programme désactive une variable ou exécute d'autres comportements de libération, ZendMM ne renverra pas directement la mémoire au système immédiatement, mais la conservera uniquement dans son propre pool de mémoire (couche de stockage) Ré-identifier comme disponible , et organisez-le dans les trois listes (petite, grande, gratuite) mentionnées ci-dessus en fonction de la taille de la mémoire à utiliser dans la prochaine application de mémoire.


La fonction finale d'implémentation de la destruction de la mémoire est _efree. Dans _efree, la destruction de la mémoire doit d'abord déterminer s'il faut la remettre dans le cache. Si la taille de la mémoire correspond à ZEND_MM_SMALL_SIZE et que le cache n'a pas dépassé le paramètre système de ZEND_MM_CACHE_SIZE, alors le bloc de mémoire actuel zend_mm_block sera remis dans mm_heap- >Dans le cache.

Dans le processus de destruction de la mémoire, le comptage de références et le garbage collection (GC) sont également impliqués, qui seront abordés dans les sections suivantes. Voir Noyau PHP - Fuite de mémoire et nouveau mécanisme de récupération de place


3. Cache


Il existe une telle description dans Wikipédia : Tout emplacement avec une grande différence de vitesse La structure entre deux types de matériel utilisé pour coordonner la différence de vitesse de transmission des données entre les deux peut être appelé Cache. A partir du cache initial entre le processeur et la mémoire, il s'agit d'adapter la vitesse d'accès aux données à la vitesse de traitement du CPU. Le principe repose sur le "comportement local d'exécution du programme et d'accès aux données" en. la mémoire. De même, le cache dans la gestion de la mémoire PHP repose également sur le principe du « comportement local d'exécution du programme et d'accès aux données ». Le cache est introduit pour réduire le nombre de requêtes pour les petits blocs de mémoire (vérifiez si le cache peut être utilisé avant d'interroger) et fournissez un accès plus rapide aux données récemment consultées.

PHP ajoute le cache au mécanisme de gestion de la mémoire et effectue les opérations suivantes :

·Identifie le cache et la limite de taille du cache, c'est-à-dire quand utiliser le cache, dans certains cas, le cache peut être désactivé avec des modifications minimes

·Structure de stockage du cache, c'est-à-dire l'emplacement de stockage du cache, la structure et la logique de stockage

· Initialiser le cache

·Récupérer le contenu dans le cache

·Écrire le cache

Libérer le cache ou Effacer la liste du cache

Le cache lui-même est également stocké dans la mémoire demandée par la couche de stockage. Si la mémoire n'est pas suffisante, le cache doit être libéré. Lorsque la mémoire du tas déborde, le programme appellera zend_mm_free_cache pour libérer le cache. L'ensemble du processus de publication est une traversée de tableau. Pour chaque élément du tableau, le programme parcourt l'élément avant lui-même dans la liste chaînée, effectue une opération de fusion de mémoire et réduit le numéro de mesure du cache dans la structure du tas .

Recommandations associées :

Partage d'exemples d'exploration SAPI du noyau PHP


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!