Cet article présente principalement le code source PHP 32 : la couche emalloc/efree et la couche de tas dans le pool de mémoire PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec tous les amis dans le besoin. Veuillez vous référer à
<.> Bref exposé sur le code source PHP 32 : couche emalloc/efree et couche de tas dans le pool de mémoire PHP La couche emalloc/efree est la structure de niveau supérieur dans l'ensemble du système de mémoire. Elle est transmise via l'échange de couches de tas qui utilise celui de PHP. mécanisme de gestion de la mémoire. Si USE_ZEND_ALLOC est défini sur 0, malloc/free et d'autres fonctions peuvent être utilisées pour faire fonctionner directement la mémoire.
Ici, nous analyserons l'interaction entre la couche emalloc/efree et la couche tas, et le mécanisme de gestion de la mémoire de la couche tas à partir de l'implémentation des fonctions emalloc et efree.
La fonction emalloc commence à la ligne 70 de zend_alloc.h.
emalloc est une macro, qui correspond à la fonction _emalloc.
Dans la fonction _emalloc, si le mécanisme de gestion de la mémoire de zend n'est pas utilisé, la fonction malloc est appelée directement, sinon
_zend_mm_alloc_int [emalloc() -> _emalloc() -> _zend_mm_alloc_int() ]
la fonction zend_mm_search_large_block est utilisée pour trouver les blocs de mémoire appropriés. dans large_free_buckets. Lorsque la taille ZEND_MM_LARGE_BUCKET_INDEX (true_size) n'est pas trouvée, vous devez trouver le plus petit bloc dans la plus grande liste de blocs.
S'il l'est. introuvable dans les trois listes, l'allocation de mémoire doit alors être à nouveau augmentée. À ce stade, la fonction d'allocation de la couche de stockage est appelée pour l'allocation. La taille de la mémoire à allouer est supérieure à block_size, elle doit être recalculée en fonction de la taille. attribués directement.
Après l'allocation de mémoire, le tas doit être réorganisé. À ce stade, la taille de la mémoire dans le tas doit être recalculée et la mémoire nouvellement allouée est ajoutée au début de segments_list.
ZEND_MM_BUCKET_INDEX (true_size) est situé à la position dans le bucket. Cette valeur est supérieure ou égale à 0 et inférieure à 32.
L'implémentation est la suivante :
#define ZEND_MM_BUCKET_INDEX(true_size) ((true_size>>ZEND_MM_ALIGNMENT_LOG2)-(ZEND_MM_ALIGNED_MIN_HEADER_SIZE>>ZEND_MM_ALIGNMENT_LOG2))
La fonction efree commence à la ligne 72 de zend_alloc.h.
efree est une macro, qui correspond à la fonction _efree.
Dans la fonction _efree, si le mécanisme de gestion de la mémoire de zend n'est pas utilisé, appelez directement la fonction free, sinon appelez _
zend_mm_free_int [efree() -> _efree() -> _zend_mm_free_int() ]
Une brève discussion du code source PHP 31 : principes de base de la couche de tas dans le pool de mémoire PHP
Une brève discussion sur le code source PHP 30 : La couche de stockage dans le pool de mémoire PHP
Une brève discussion sur le code source PHP 29 : À propos de l'héritage des interfaces
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!