Heim  >  Artikel  >  Backend-Entwicklung  >  PHP7-Kernel-Analyse 9 Speicherverwaltung

PHP7-Kernel-Analyse 9 Speicherverwaltung

不言
不言Original
2018-04-13 15:22:471698Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Speicherverwaltung der PHP7-Kernelanalyse 9. Jetzt teile ich ihn mit Ihnen. Freunde in Not können darauf verweisen

1.Zend-Speicherpool

Der Speicherpool ist die unterste Speicheroperation im Kernel. Er definiert drei granulare Speicherblöcke: Chunk, Seite und Slot. Die Größe jedes Chunks beträgt 2 MB, die Seitengröße beträgt 4 KB Der Block wird in 512 Seiten geschnitten, und eine oder mehrere Seiten werden in mehrere Slots geschnitten. Bei der Beantragung von Speicher wird die spezifische Zuweisungsstrategie entsprechend den unterschiedlichen Anwendungsgrößen bestimmt:
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-Struktur

PHP7-Kernel-Analyse 9 Speicherverwaltung

Chunk besteht aus 512 Seiten, von denen die erste Seite verwendet wird Speichern Sie die Blockstruktur und die folgenden 511 Seiten werden hauptsächlich für die Zuweisung von großem und kleinem Speicher verwendet. Es handelt sich um eine Struktur, die den Speicherpool darstellt Um die Zuweisung der oben genannten drei Speichertypen zu verwalten, gibt es in Zend nur eine Heap-Struktur.


3. Speicherzuweisung

Riesige Zuweisung

Anwendung für mehr als 2 MB Speicher und allgemeine Speicheranwendung Es gibt keinen großen Unterschied, außer dass die angeforderten Speicherblöcke über eine einfach verknüpfte Liste verwaltet werden. Eine große Zuweisung bedeutet eigentlich, dass die Zuweisung mehrerer Chunks die Grundlage für die Zuweisung von großem und kleinem Speicher ist. Dies ist die einzige Granularität, die ZendMM für Speicher vom System anwenden kann. Bei der Beantragung von Chunk-Speicher gibt es eine Schlüsseloperation, nämlich die Speicheradresse an ZEND_MM_CHUNK_SIZE auszurichten. Dies bedeutet, dass die angewendeten Chunk-Adressen alle ganzzahlige Vielfache von ZEND_MM_CHUNK_SIZE sind

Große Zuweisung

größer als 3/4 Page_size (4 KB) und weniger als oder gleich 511 page_size Speicheranwendungen, das heißt, die Größe eines Blocks ist ausreichend (der Grund, warum es 511 Seiten statt 512 sind, liegt darin, dass die erste Seite immer vom Block belegt ist Struktur), wenn Sie mehr beantragen. Wenn es Seiten gibt, werden diese Seiten bei der Zuweisung aufeinanderfolgend sein. Wenn der letzte Block nicht gefunden wird, wird ein neuer Block neu zugewiesen und in die verknüpfte Blockliste eingefügt.

chunk->free_map verwendet Bitmap, um die Nutzung jeder Seitengruppe aufzuzeichnen

PHP7-Kernel-Analyse 9 Speicherverwaltung

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

Kleiner Speicher

Kleiner Speicher bezieht sich auf Speicher von weniger als (3/4 Seitengröße). Diese Speicher werden auch zuerst für 1 oder mehr Seiten angewendet , und schneiden Sie diese Seiten dann in feste Größen zu, sodass der erste Schritt genau der gleiche ist wie bei der großen Zuweisung im vorherigen Abschnitt. Es gibt insgesamt 30 feste Größenspezifikationen für kleinen Speicher: 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128 ... 1792, 2048, 2560, 3072 Byte, wie wir es nennen Dieser Steckplatz, Die Größe dieser Steckplätze ist regelmäßig: Die kleinste Steckplatzgröße beträgt 8 Byte, die ersten 8 Steckplätze werden um 8 Byte erhöht und alle 4 nachfolgenden inkrementellen Werte werden mit 2 multipliziert

PHP7-Kernel-Analyse 9 Speicherverwaltung

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]指向释放的内存,也就是将释放的内存插到链表头部

Verwandte Empfehlungen:

PHP7 Kernel Analysis 8 und dergleichen

PHP7 Kernel Analysis 7 Zend Engine Ausführungsprozess

Funktionen der PHP7-Kernelanalyse 6                                                                      

Das obige ist der detaillierte Inhalt vonPHP7-Kernel-Analyse 9 Speicherverwaltung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn