Maison  >  Article  >  développement back-end  >  Noyau PHP - explication graphique détaillée de la gestion de la mémoire et du mécanisme de mise en cache

Noyau PHP - explication graphique détaillée de la gestion de la mémoire et du mécanisme de mise en cache

黄舟
黄舟original
2017-03-09 09:47:011667parcourir

Avant-propos :

La mémoire requise par PHP lors de son exécution est une application unique au système opérateur Ouvert, plutôt que divisé en plusieurs fois. Alors, comment a-t-il fait une 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 de ZendMM (couche tas) 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 de 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 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. Demande de 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 de mémoire, en remplissant les trois listes ci-dessus, Établissez un mécanisme de gestion similaire à un pool de mémoire.


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
  $tipi = "o_o\n";
  echo $tipi;
?>

C'est 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 requêtes pour mémoire. , Bien sûr, cela est très simple à 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), 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 ) pour remplacer malloc (appliquant le bloc mémoire du système d'exploitation), en fait, il s'agit d'utiliser le ZendMM de PHP à la place Appelez manuellement directement la 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 sur la base de l'utilisation 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 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" (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émon. (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)


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 il est disponible en , Organisez-les dans les trois listes mentionnées ci-dessus (petite, grande, libre) en fonction de la taille de la mémoire à utiliser dans la prochaine application 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 cache situé entre deux types de matériel avec une grande différence de vitesse est utilisé pour la structure. qui coordonne 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. Il repose sur le principe du « comportement local d'exécution du programme et d'accès aux données » en 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 des caches

Le cache lui-même est également stocké dans la mémoire appliquée par la couche de stockage. Si la mémoire n'est pas suffisante, le cache doit être utilisé. ê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 .


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