Maison > Article > développement back-end > Une brève discussion du code source PHP 32 : couche emalloc/efree et couche de tas dans le pool de mémoire PHP
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() ]Dans la fonction _zend_mm_alloc_int, le programme traitera que la mémoire réellement requise est inférieure supérieur ou égal à ZEND_MM_MAX_SMALL_SIZE (272). S'il est inférieur à ZEND_MM_MAX_SMALL_SIZE, free_buckets sera recherché pour voir s'il existe un bloc de mémoire approprié. Si un bloc approprié peut être trouvé dans free_buckets, passez directement à zend_mm_finished_searching_for_block, sinon zend_mm_search_large_block. () sera exécuté.
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))Les valeurs de free_bitmap et large_free_bitmap sont toutes deux comprises entre 0 et 31.
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() ]Le tas réduit d'abord la taille du tas entier si la fin de. le bloc actuel Si un bloc est un bloc libre, le prochain bloc libre sera supprimé de la liste des blocs libres et fusionné avec le bloc actuel. Si le bloc précédent du bloc actuel est un bloc libre, le bloc libre précédent sera supprimé. de la liste des blocs libres et fusionnés avec le bloc actuel. Les blocs sont fusionnés et le pointeur pointe vers le bloc libre précédent. Si le bloc actuel est le bloc de départ à ce moment, appelez zend_mm_del_segment pour effacer tout le segment de mémoire. Si ce n'est pas le bloc de départ, le bloc fusionné est ajouté à la liste des blocs libres. Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois ! Recommandations associées :
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!