Maison > Article > développement back-end > Analyse du noyau PHP7 9 Gestion de la mémoire
Le contenu de cet article concerne la gestion de la mémoire de l'analyse du noyau PHP7 9. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
1.Pool de mémoire Zend
Le pool de mémoire est l'opération de mémoire de niveau le plus bas dans le noyau. Il définit trois blocs de mémoire granulaires : un bloc, une page et un emplacement. La taille de chaque bloc est de 2 Mo, la taille de la page est de 4 Ko et un. le morceau est découpé en 512 pages, et une ou plusieurs pages sont découpées en plusieurs emplacements, donc lors de la demande de mémoire, la stratégie d'allocation spécifique est déterminée en fonction des différentes tailles d'application :
Huge(chunk): 申请内存大于2M,直接调用系统分配,分配若干个chunk Large(page): 申请内存大于3K(3/4 page_size),小于2044K(511 page_size),分配若干个page Small(slot): 申请内存小于等于3K(3/4 page_size)
2.zend heap structure
le morceau se compose de 512 pages, dont la première page est utilisée pour enregistrez la structure des blocs et les 511 pages restantes ci-dessous sont utilisées pour l'allocation de mémoire. La page est principalement utilisée pour l'allocation de mémoire de grande et de petite taille. C'est la structure qui représente le pool de mémoire. pour gérer l'allocation des trois types de mémoire ci-dessus. Il n'y a qu'une seule structure de tas dans Zend.
3. Allocation de mémoire
Allocation énorme
Application pour plus de 2 M de mémoire et application de mémoire générale Il n'y a pas beaucoup de différence, sauf que les blocs mémoire demandés sont gérés via une liste à chaînage unique. Une allocation énorme signifie en fait l'allocation de plusieurs morceaux. L'allocation de morceaux est également la base d'une allocation de mémoire grande et petite. C'est la seule granularité que ZendMM peut appliquer à la mémoire du système. Il y a une opération clé lors de la demande de mémoire de bloc, qui consiste à aligner l'adresse mémoire sur ZEND_MM_CHUNK_SIZE, ce qui signifie que les adresses de bloc appliquées sont toutes des multiples entiers de ZEND_MM_CHUNK_SIZE
Allocation importante
supérieure à 3/4 Page_size (4 Ko) et inférieur ou égal à 511 page_size applications mémoire, c'est-à-dire que la taille d'un morceau est suffisante (la raison pour laquelle il s'agit de 511 pages au lieu de 512 est que la première page est toujours occupée par le morceau structure), si vous postulez pour plus. S'il y a des pages, ces pages seront consécutives une fois attribuées. Si le dernier morceau n'est pas trouvé, un nouveau morceau sera réaffecté et inséré dans la liste chaînée des morceauxchunk->free_map utilise un bitmap pour enregistrer l'utilisation de chaque groupe de pages
.
a.首先会直接跳过group1,直接到group2检索 b.在group2中找到第一个可用page位置:67,然后向下找第一个不可用page位置:69,找到的可用内存块长度为2,小于3,表示此内存块不可用 c.接着再次在group2中查找到第一个可用page位置:71,然后向下找到第一个不可用page位置:75,内存块长度为4,大于3,表示找到一个符合的位置,虽然已经找到可用内存块但并不"完美",先将这个并不完美的page_num及len保存到best、best_len,如果后面没有比它更完美的就用它了 d.再次检索,发现group2已无可用page,进入group3,找到可用内存位置:page 130-132,大小比c中找到的合适,所以最终返回的page就是130-132 e.page分配完成后会将free_map对应整数的bit位从page_num至(page_num+page_count)置为1
Petite allocation
La petite mémoire fait référence à une mémoire inférieure à (3/4 page_size). Ces mémoires sont également d'abord appliquées pour 1 ou plus. page, puis coupez ces pages en tailles fixes, de sorte que la première étape est exactement la même que celle de l'allocation importante dans la section précédente. Il existe un total de 30 spécifications de taille fixe de petite mémoire : 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128... 1792, 2048, 2560, 3072 octets, nous appelons cet emplacement, La taille de ces emplacements est régulière : la plus petite taille d'emplacement est de 8 octets, les 8 premiers emplacements sont incrémentés de 8 octets et toutes les 4 valeurs incrémentielles suivantes sont multipliées par 2
step1: 首先根据申请内存的大小在heap->free_slot中找到对应的slot规格bin_num,如果当前slot为空则首先分配对应的page,free_slot[bin_num]始终指向第一个可用的slot step2: 如果申请内存大小对应的的slot链表不为空则直接返回free_slot[bin_num],然后将free_slot[bin_num]指向下一个空闲位置 step3: 释放内存时先将此内存的next_free_slot指向free_slot[bin_num],然后将free_slot[bin_num]指向释放的内存,也就是将释放的内存插到链表头部
Recommandations associées :
PHP7 Kernel Analysis 8 et autres
PHP7 Kernel Analysis 7 Zend Engine Processus d'exécution
Analyse du noyau PHP7 6 fonctions
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!