suchen
HeimBackend-EntwicklungPHP-TutorialEine kurze Diskussion des PHP-Quellcodes 33: Grundlagen des neuen Garbage Collection-Mechanismus (Garbage Collection) in PHP5.3

In diesem Artikel werden hauptsächlich die Grundlagen des PHP-Quellcodes 33 vorgestellt: Der neu hinzugefügte Garbage Collection-Mechanismus (Garbage Collection) hat einen gewissen Referenzwert dazu.

Lassen Sie uns kurz über PHP-Quellcode 33 sprechen: Die Grundlagen des neuen Garbage-Collection-Mechanismus (Garbage Collection) in PHP5.3
PHP5.3 verfügt über einen neuen Garbage-Collection-Mechanismus, was als sehr fortgeschritten gilt, hat mich dazu verführt, die fortgeschrittene Implementierung zu sehen.
Für die offizielle Dokumentation klicken Sie bitte auf Garbage Collection
Adresse der chinesischen Version: http://docs.php.net/manual/zh/features.gc.php
[Einbettungsmethode des Garbage Collection-Mechanismus]
Auf die Datei zend_gc.h wird in Zeile 749 von zend.h verwiesen: #include "zend_gc.h"
Dadurch werden ALLOC_ZVAL und andere Makros in der Datei zend_alloc.h, auf die in Zeile 237 verwiesen wird, ersetzt und abgedeckt
zend Die Datei /zend_gc.h beginnt in Zeile 202

 /* The following macroses override macroses from zend_alloc.h */#undef  ALLOC_ZVAL#define ALLOC_ZVAL(z) \
do {\
(z) = (zval*)emalloc(sizeof(zval_gc_info));\
GC_ZVAL_INIT(z);\
} while (0)

Die Definition des Makros ALLOC_ZVAL in zend_alloc.h besteht darin, den Speicherplatz einer Zval-Struktur zuzuweisen. Das neue ALLOC_ZVAL-Makro weist ein zval_gc_info-Strukturmakro zu. Die Struktur von zval_gc_info ist wie folgt:
Beginnen Sie in Zeile 91 der Datei zend/zend_gc.h:

 typedef struct _zval_gc_info {
zval z;
union {
gc_root_buffer       *buffered;
struct _zval_gc_info *next;
} u;} zval_gc_info;

Das erste Mitglied von zval_gc_info ist die zval-Struktur, die sicherstellt, dass sie am Anfang ausgerichtet ist des mit der zval-Variablen zugewiesenen Speichers, sodass er als zval verwendet werden kann, wenn der Zeiger vom Typ zval_gc_info umgewandelt wird. Informationen zu gc_root_buffer usw. werden später in der Struktur und Implementierung vorgestellt. Es definiert die Cache-Struktur des PHP-Garbage-Collection-Mechanismus. GC_ZVAL_INIT wird verwendet, um zval_gc_info zu initialisieren, das zval ersetzt. Es setzt das gepufferte Feld des Mitglieds u in zval_gc_info auf NULL. Dieses Feld hat nur einen Wert, wenn es in den Garbage Collection-Puffer gestellt wird, andernfalls ist es immer NULL.

Da alle Variablen in PHP in Form von zval-Variablen vorliegen, wird zval hier durch zval_gc_info ersetzt, wodurch der Garbage-Collection-Mechanismus erfolgreich in das ursprüngliche System integriert wird.
Das fühlt sich ein bisschen wie objektorientierter Polymorphismus an.

[Speichermethode des Garbage-Collection-Mechanismus]
Knotenstruktur:

 typedef struct _gc_root_buffer {
struct _gc_root_buffer   *prev;/* double-linked list               */
struct _gc_root_buffer   *next;
zend_object_handle        handle;/* must be 0 for zval               */
union {
zval                 *pz;
zend_object_handlers *handlers;
} u;} gc_root_buffer;

Offensichtlich (siehe Kommentare, obwohl es in PHP nur sehr wenige Kommentare gibt, handelt es sich bei einigen nur um verworrene Kommentare). eine doppelt verkettete Liste.

Die pz-Variable in der Union ist offensichtlich die zuvor definierte polymorphe zval_gc_info-Struktur, sodass ihr aktueller Knotenzeiger in der verknüpften Liste übergeben werden kann ((zval_gc_info*)(pz))->u .buffered, aber Wenn man sich den Quellcode ansieht, wird diese Aufrufmethode an vielen Stellen verwendet. Warum nicht ein neues Makro erstellen? Liegt es daran, dass ich Angst habe, zu viele Makros zu haben? Nein, PHP ist dafür bekannt, viele Makros zu haben, und es gibt viele Makros, die mehr verschachtelte Makros haben als dieses. Ich weiß es nicht. Darüber hinaus sind Handle und andere Strukturen speziell auf Objektvariablen ausgerichtet.

Der Puffer befindet sich in der globalen Variablen, auch gc verfügt über ein eigenes globales Variablenzugriffsmakro GC_G(v). In ähnlicher Weise unterscheidet sich das globale Variablenzugriffsmakro unter ZTS. Realisierung.
Die in zend_gc.h definierten globalen Variablen lauten wie folgt:

typedef struct _zend_gc_globals {
zend_bool         gc_enabled;/* 是否开启垃圾收集机制 */
zend_bool         gc_active;/* 是否正在进行 */ 
gc_root_buffer   *buf;/* 预分配的缓冲区数组,默认为10000(preallocated arrays of buffers)   */
gc_root_buffer    roots;/* 列表的根结点(list of possible roots of cycles) */
gc_root_buffer   *unused;/* 没有使用过的缓冲区列表(list of unused buffers)           */
gc_root_buffer   *first_unused;/* 指向第一个没有使用过的缓冲区结点(pointer to first unused buffer)   */
gc_root_buffer   *last_unused;/* 指向最后一个没有使用过的缓冲区结点,此处为标记结束用(pointer to last unused buffer)    */ 
zval_gc_info     *zval_to_free;/* 将要释放的zval变量的临时列表(temporaryt list of zvals to free) */
zval_gc_info     *free_list;/* 临时变量,需要释放的列表开头 */
zval_gc_info     *next_to_free;/* 临时变量,下一个将要释放的变量位置*/ 
zend_uint gc_runs;/* gc运行的次数统计 */
zend_uint collected;    /* gc中垃圾的个数 */ // 省略...

[Farbmarkierung im Garbage-Collection-Mechanismus]

 #define GC_COLOR  0x03 #define GC_BLACK  0x00#define GC_WHITE  0x01#define GC_GREY   0x02#define GC_PURPLE 0x03 #define GC_ADDRESS(v) \
((gc_root_buffer*)(((zend_uintptr_t)(v)) & ~GC_COLOR))#define GC_SET_ADDRESS(v, a) \
(v) = ((gc_root_buffer*)((((zend_uintptr_t)(v)) & GC_COLOR) | ((zend_uintptr_t)(a))))#define GC_GET_COLOR(v) \
(((zend_uintptr_t)(v)) & GC_COLOR)#define GC_SET_COLOR(v, c) \
(v) = ((gc_root_buffer*)((((zend_uintptr_t)(v)) & ~GC_COLOR) | (c)))#define GC_SET_BLACK(v) \
(v) = ((gc_root_buffer*)(((zend_uintptr_t)(v)) & ~GC_COLOR))#define GC_SET_PURPLE(v) \
(v) = ((gc_root_buffer*)(((zend_uintptr_t)(v)) | GC_PURPLE))

In der Speicherverwaltung von PHP haben wir auch Ähnliches gesehen Das Letzte Bit dient als eine Art Markierung.

Hier werden die letzten beiden Ziffern der Speicherbelegung als Farbmarkierung der gesamten Struktur verwendet. Unter diesen bedeutet
Weiß Müll,
Lila zeigt an, dass er in den Puffer gelegt wurde.
Grau zeigt an, dass eine Refcount-Operation durchgeführt wurde, um den Refcount um eins zu reduzieren.
Schwarz ist die Standardfarbe, normal

[definiert durch zval Change]
PHP3.0-Version befindet sich in der Datei zend/zend.h, die wie folgt definiert ist:

struct _zval_struct {
/* Variable information */
zvalue_value value;/* value */
zend_uint refcount__gc;
zend_uchar type;/* active type */
zend_uchar is_ref__gc;};

In Versionen vor PHP3.0, z Als PHP5.2.9-Version befindet es sich in der Datei zend/zend.h. Die Definition lautet wie folgt:

struct _zval_struct {
/* Variable information */
zvalue_value value;/* value */
zend_uint refcount;
zend_uchar type;/* active type */
zend_uchar is_ref;};

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

Eine kurze Diskussion des PHP-Quellcodes 32: Emalloc/Efree-Schicht und Heap-Schicht im PHP-Speicherpool

Eine kurze Diskussion des PHP-Quellcodes 31: Die Grundlagen der Heap-Schicht im PHP-Speicherpool

Eine kurze Diskussion des PHP-Quellcodes 30: PHP-Speicherpool Speicherschicht in

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion des PHP-Quellcodes 33: Grundlagen des neuen Garbage Collection-Mechanismus (Garbage Collection) in PHP5.3. 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
Jenseits des Hype: Beurteilung der Rolle von PHP heute heuteJenseits des Hype: Beurteilung der Rolle von PHP heute heuteApr 12, 2025 am 12:17 AM

PHP bleibt ein leistungsstarkes und weit verbreitetes Tool in der modernen Programmierung, insbesondere im Bereich der Webentwicklung. 1) PHP ist einfach zu bedienen und nahtlos in Datenbanken integriert und für viele Entwickler die erste Wahl. 2) Es unterstützt die Erzeugung der dynamischen Inhalte und die objektorientierte Programmierung, die für die schnelle Erstellung und Wartung von Websites geeignet sind. 3) Die Leistung von PHP kann verbessert werden, indem Datenbankabfragen zwischengespeichert und optimiert werden, und die umfangreiche Community und sein reiches Ökosystem machen es im heutigen Technologiestack immer noch wichtig.

Was sind schwache Referenzen in PHP und wann sind sie nützlich?Was sind schwache Referenzen in PHP und wann sind sie nützlich?Apr 12, 2025 am 12:13 AM

In PHP werden schwache Referenzen in der WeaPreference -Klasse implementiert und verhindern nicht, dass der Müllsammler Objekte zurückerobern. Schwache Referenzen eignen sich für Szenarien wie Caching -Systeme und Event -Hörer. Es ist zu beachten, dass es das Überleben von Objekten nicht garantieren kann und dass die Müllsammlung möglicherweise verzögert wird.

Erklären Sie die __invoke magische Methode in PHP.Erklären Sie die __invoke magische Methode in PHP.Apr 12, 2025 am 12:07 AM

Mit der \ _ \ _ -Invoke -Methode können Objekte wie Funktionen bezeichnet werden. 1. Definieren Sie die Methode \ _ \ _, damit das Objekt aufgerufen werden kann. 2. Bei Verwendung der Syntax $ OBJ (...) wird PHP die Methode \ _ \ _ aufrufen. 3.. Geeignet für Szenarien wie Protokollierung und Taschenrechner, Verbesserung der Codeflexibilität und Lesbarkeit.

Erklären Sie Fasern in PHP 8.1 für die Parallelität.Erklären Sie Fasern in PHP 8.1 für die Parallelität.Apr 12, 2025 am 12:05 AM

Fasern wurde in Php8.1 eingeführt, wodurch die gleichzeitigen Verarbeitungsfunktionen verbessert wurden. 1) Fasern ist ein leichtes Parallelitätsmodell, das Coroutinen ähnelt. 2) Sie ermöglichen es den Entwicklern, den Ausführungsfluss von Aufgaben manuell zu steuern, und eignen sich zum Umgang mit E/O-intensiven Aufgaben. 3) Die Verwendung von Fasern kann effizientere und reaktionsschnelle Code schreiben.

Die PHP -Community: Ressourcen, Unterstützung und EntwicklungDie PHP -Community: Ressourcen, Unterstützung und EntwicklungApr 12, 2025 am 12:04 AM

Die PHP -Community bietet umfangreiche Ressourcen und Unterstützung, um Entwicklern zu helfen, zu wachsen. 1) Zu den Ressourcen gehören offizielle Dokumentation, Tutorials, Blogs und Open -Source -Projekte wie Laravel und Symfony. 2) Die Unterstützung kann durch Stackoverflow-, Reddit- und Slack -Kanäle erhalten werden. 3) Entwicklungstrends können durch Befolgung von RFC gelernt werden. 4) Die Integration in die Community kann durch aktive Teilnahme, Beitrag zum Code und Lernfreigabe erreicht werden.

PHP vs. Python: Verständnis der UnterschiedePHP vs. Python: Verständnis der UnterschiedeApr 11, 2025 am 12:15 AM

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

PHP: Stirbt es oder passt es sich einfach an?PHP: Stirbt es oder passt es sich einfach an?Apr 11, 2025 am 12:13 AM

PHP stirbt nicht, sondern sich ständig anpasst und weiterentwickelt. 1) PHP hat seit 1994 mehreren Versionen für die Version unterzogen, um sich an neue Technologietrends anzupassen. 2) Es wird derzeit in E-Commerce, Content-Management-Systemen und anderen Bereichen häufig verwendet. 3) PHP8 führt den JIT -Compiler und andere Funktionen ein, um die Leistung und Modernisierung zu verbessern. 4) Verwenden Sie Opcache und befolgen Sie die PSR-12-Standards, um die Leistung und die Codequalität zu optimieren.

Die Zukunft von PHP: Anpassungen und InnovationenDie Zukunft von PHP: Anpassungen und InnovationenApr 11, 2025 am 12:01 AM

Die Zukunft von PHP wird erreicht, indem sich an neue Technologietrends angepasst und innovative Funktionen eingeführt werden: 1) Anpassung an Cloud Computing, Containerisierung und Microservice -Architekturen, Unterstützung von Docker und Kubernetes; 2) Einführung von JIT -Compilern und Aufzählungsarten zur Verbesserung der Leistung und der Datenverarbeitungseffizienz; 3) die Leistung kontinuierlich optimieren und Best Practices fördern.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version