Une brève discussion du code source PHP 32 : couche emalloc/efree et couche de tas dans le pool de mémoire PHP

不言
Libérer: 2023-04-02 06:36:01
original
1866 Les gens l'ont consulté

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.

【emalloc】

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() ]
Copier après la connexion
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é.


[emalloc() -> _emalloc() -> _zend_mm_alloc_int() -> zend_mm_search_large_block()]

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 n'est pas trouvé à la fois dans la grande liste de blocs et dans la petite liste de blocs, vous devez effectuer une recherche dans les blocs de liste restants. S'il est trouvé, il passera également à zend_mm_finished_searching_for_block

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.

Si vous passez directement à zend_mm_finished_searching_for_block dans l'opération ci-dessus, vous devez supprimer le bloc de mémoire utilisé de la liste correspondante (cela devrait être un processus de marquage, une pseudo-suppression)

Ensuite, selon combien de mémoire il reste, déplacez-la vers la liste libre ou la liste restante.

Renvoie enfin le morceau alloué.

Pendant tout le processus d'emalloc, il y a quelques points à noter ci-dessous.

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))
Copier après la connexion
Les valeurs de free_bitmap et large_free_bitmap sont toutes deux comprises entre 0 et 31.


[efree]

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() ]
Copier après la connexion
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!

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!