Heim  >  Artikel  >  Backend-Entwicklung  >  Erkundung der Speicherverwaltung und des Caching-Mechanismus des PHP-Kernels

Erkundung der Speicherverwaltung und des Caching-Mechanismus des PHP-Kernels

不言
不言Original
2018-04-17 10:05:091557Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Erforschung der Speicherverwaltung und des Caching-Mechanismus des PHP-Kernels. Jetzt kann ich ihn mit Ihnen teilen.

Vorwort:

Der von PHP beim Ausführen benötigte Speicher wird einmal und nicht mehrmals auf das Betriebssystem angewendet. . Wie hat er also alles auf einmal beantragt und was war der Mechanismus? Bitte beachten Sie die Einleitung unten.

Die Heap-Schicht ist die Kernimplementierung der PHP-Speicherverwaltung , die zugrunde liegende Speicherverwaltung von PHP, die ZendMM bereitstellt System Die Speicheranwendung ist bei Bedarf keine unmittelbare Anwendung auf das System, sondern die unterste Schicht (Heap-Schicht) von ZendMM wendet zunächst einen großen Speicherblock auf das System an und richtet nach der Deaktivierung einen Verwaltungsmechanismus ein, der einem Speicherpool ähnelt , ZendMM gibt den Speicher nicht sofort direkt an das System zurück, sondern nur im Speicherpool (Speicherschicht) , den es verwaltet Markieren Sie es als verfügbar ,.

Vorteile:

1. Es gibt viele vordefinierte konstante Variablen und es gibt Hunderte von Speicheranforderungen. Es vermeidet die häufigen Speicheranwendungsoperationen von PHP vom System und reduziert die Anzahl der Anfragen an das Betriebssystem.

2. wird schneller ausgeführt. Der Nachteil besteht darin, dass mit zunehmender Laufzeit des Programms der Speicherverbrauch zunimmt. Daher führt 5.3 einen neuen Garbage-Collection-Mechanismus ein.


Die detaillierte Analyse lautet wie folgt:


Die Speicherverwaltung von PHP kann als angesehen werden unterteilt in hierarchische. Es ist in drei Schichten unterteilt: Speicherschicht (Storage), Heap-Schicht (Heap) und Schnittstellenschicht (emalloc/efree) . Die Speicherschicht beantragt tatsächlich Speicher vom System über Funktionen wie malloc() und mmap() und gibt den angeforderten Speicher über die Funktion free() frei.



Die normalerweise von der Speicherschicht beanspruchten Speicherblöcke sind relativ groß und der Speicher Die hier beantragten Blöcke sind groß. Dies bedeutet nicht, dass der von der Speicherschichtstruktur benötigte Speicher groß ist, sondern dass, wenn die Heapschicht die Zuweisungsmethode der Speicherschicht aufruft, der Speicher in großen Blöcken angewendet wird der Speicherschicht Die Funktion besteht darin, die Speicherzuweisungsmethode für die Heap-Schicht transparent zu machen.

Wie in der Abbildung unten gezeigt, PHP-Speichermanager. PHP verfügt über 4 Speicherzuweisungsschemata in der Speicherebene: malloc, win32, mmap_anon, mmap_zero. Wenn das Makro
ZEND

_WIN32 festgelegt ist, handelt es sich um die Windows-Version und HeapAlloc wird aufgerufen, um Speicher zuzuweisen. Die beiden Speicherschemata sind anonyme Speicherzuordnungen, und das Speicherschema von PHP kann durch Festlegen von Umgebungsvariablen geändert werden.


Abbildung 6.1 PHP-Speichermanager


1. Speicheranwendung

Die Heap-Schicht ist die Kernimplementierung der PHP-Speicherverwaltung Die zugrunde liegende Speicherverwaltung von PHP dreht sich um die kleine Speicherliste (free_buckets), die große Speicherliste (large_free_buckets) und die verbleibende Speicherliste (rest_buckets) drei Listen zur Durchführung einer hierarchischen Verarbeitung. Die von ZendMM auf das System vorgenommene Speicheranwendung wird bei Bedarf nicht sofort auf das System angewendet, sondern zunächst auf das System Durch das Ausfüllen der oben genannten drei Listen wird ein Verwaltungsmechanismus ähnlich einem Speicherpool eingerichtet.


Wenn das Programm Speicher verwenden muss, weist
Zend

MM den entsprechenden Speicher im Speicherpool zu verwenden. Der Vorteil davon besteht darin, dass PHPs häufige Speicheranwendungsvorgänge vom System vermieden werden, wie z. B. der folgende Code:




[php] view plain copy 
<?php  
  $tipi = "o_o\n";  
  echo $tipi;  
?>


Dies ist ein einfaches PHP-Programm, aber wenn man die Aufrufe von emalloc zählt, ist es nur ein PHP-Programm, das nur eine Variable zuweist, aber es stellt sich heraus, dass es Hunderte von Speicheranforderungen gibt. Das ist natürlich sehr Das ist leicht zu erklären, denn die Ausführung von PHP-Skripten erfordert die Definition einer großen Anzahl von Umgebungsvariablen und internen Variablen (Einzelheiten finden Sie unter PHP-Kernel - Lebenszyklus ) und diese Definitionen selbst müssen im Speicher gespeichert werden .

Beim Schreiben von PHP-Erweiterungen

wird die Verwendung von emalloc empfohlen (gilt für den Speicherblock des zend). _mm_storage Layer ) anstelle von malloc (gilt für den Speicherblock des Betriebssystems), tatsächlich bedeutet dies, PHPs ZendMM zu verwenden, anstatt manuell direkt aufzurufen Speicherverwaltung auf Systemebene.


Zend

MM verwendet die Funktion _zend_mm_alloc_int für die Speicherzuweisung:




Wie oben zu sehen ist Die Zuweisung basiert auf der Verwendung von PHP. PHP wird im Allgemeinen für die Datenunterstützung in Webanwendungen verwendet. Der Ausführungszyklus eines einzelnen Skripts ist im Allgemeinen relativ kurz (bis zu Sekunden). Für die Zuweisung erfolgt keine komplizierte freie Speicherzusammenführung nicht benachbarter Adressen mehr, sondern eine zentrale Anfrage an das System. Der Vorteil besteht darin, dass es schneller ausgeführt wird. Der Nachteil besteht darin, dass mit zunehmender Laufzeit des Programms die Speichernutzung „immer größer“ wird (PHP5.2 und frühere Versionen). Daher sind Versionen vor PHP5.3 nicht für den langfristigen Betrieb als Daemon-Prozesse geeignet. (Natürlich gibt es andere Möglichkeiten, das Problem zu lösen, und in PHP5.3 wurde ein neuer GC-Mechanismus eingeführt. Einzelheiten finden Sie im folgenden Abschnitt

PHP-Kernel – Speicherleck und neuer Garbage-Collection-Mechanismus)


2. Zerstörung des Gedächtnisses

ZendMM verwendet bei der Verarbeitung der Speicherzerstörung die gleiche Strategie wie die Speicheranwendung. Wenn das Programm eine Variable zurücksetzt oder andere Freigabeverhalten ausführt, ZendMM gibt den Speicher nicht sofort direkt an das System zurück, sondern verwaltet ihn nur in seinem eigenen Speicherpool (Speicherschicht) Markieren Sie ihn als verfügbar und organisieren Sie es in den drei oben genannten Listen (klein, groß, frei) entsprechend der Größe des Speichers zur Verwendung in der nächsten Speicheranwendung.


Die endgültige Implementierungsfunktion der Speicherzerstörung ist _efree. In _efree muss bei der Zerstörung des Speichers zunächst ermittelt werden, ob er wieder in den Cache gelegt werden soll. Wenn die Speichergröße ZEND_MM_SMALL_SIZE entspricht und der Cache die Systemeinstellung von ZEND_MM_CACHE_SIZE nicht überschritten hat, wird der aktuelle Speicherblock zend_mm_block wieder abgelegt mm_heap- >Im Cache.

Am Speicherzerstörungsprozess sind auch Referenzzählung und Garbage Collection (GC) beteiligt, die in den folgenden Abschnitten erläutert werden. Siehe PHP-Kernel – Speicherverlust und neuer Garbage-Collection-Mechanismus


3. Cache


Es gibt eine solche Beschreibung in Wikipedia: Jeder Ort mit einem großen Geschwindigkeitsunterschied Die Struktur Der Unterschied in der Datenübertragungsgeschwindigkeit zwischen zwei Hardwaretypen wird als Cache bezeichnet. Ausgehend vom anfänglichen Cache zwischen Prozessor und Speicher geht es darum, die Geschwindigkeit des Datenzugriffs an die Verarbeitungsgeschwindigkeit der CPU anzupassen. Das Prinzip basiert auf dem „lokalen Verhalten der Programmausführung und des Datenzugriffs“. die Erinnerung. In ähnlicher Weise basiert auch der Cache in der PHP-Speicherverwaltung auf dem Prinzip des „lokalen Verhaltens der Programmausführung und des Datenzugriffs“. Der Cache wird eingeführt, um die Anzahl der Abfragen für kleine Speicherblöcke zu reduzieren (überprüfen Sie vor der Abfrage, ob der Cache erreicht werden kann) und einen schnelleren Zugriff auf kürzlich aufgerufene Daten zu ermöglichen.

PHP fügt den Cache zum Speicherverwaltungsmechanismus hinzu und führt Folgendes aus:

·Identifiziert den Cache und die Größenbeschränkung des Caches, d. h. wann der Cache verwendet werden soll. In einigen Fällen kann der Cache mit minimalen Änderungen deaktiviert werden

·Cache-Speicherstruktur, d. h. Cache-Speicherort, Struktur und Speicherlogik

· Initialisieren Sie den Cache

·Holen Sie sich den Inhalt im Cache

·Schreiben Sie den Cache

Cache freigeben oder Cache-Liste löschen

Der Cache selbst wird auch im von der Speicherschicht angeforderten Speicher gespeichert. Wenn der Speicher nicht ausreicht, muss der Cache freigegeben werden. Wenn der Heap-Speicher überläuft, ruft das Programm zend_mm_free_cache auf, um den Cache freizugeben. Der gesamte Freigabeprozess ist ein Array-Durchlauf. Für jedes Array-Element durchläuft das Programm das Element vor sich selbst in der verknüpften Liste, führt eine Speicherzusammenführungsoperation durch und reduziert die Cache-Messzahl in der Heap-Struktur .

Verwandte Empfehlungen:

PHP-Kernel-SAPI-Explorationsbeispiel-Sharing


Das obige ist der detaillierte Inhalt vonErkundung der Speicherverwaltung und des Caching-Mechanismus des PHP-Kernels. 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