Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Kernel – detaillierte grafische Erläuterung der Speicherverwaltung und des Caching-Mechanismus

PHP-Kernel – detaillierte grafische Erläuterung der Speicherverwaltung und des Caching-Mechanismus

黄舟
黄舟Original
2017-03-09 09:47:011672Durchsuche

Vorwort:

Der von PHP beim Ausführen benötigte Speicher ist eine einmalige Anwendung Betriebssystem geöffnet und nicht in mehrere Teile unterteilt. 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 hierarchisch betrachtet werden. 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. Antrag auf Erinnerung

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 ein großer Speicher, indem die oben genannten drei Listen ausgefüllt werden, Richten Sie einen Verwaltungsmechanismus ähnlich einem Speicherpool ein.


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
  $tipi = "o_o\n";
  echo $tipi;
?>

Dies ist ein einfaches PHP-Programm, aber wenn man die Aufrufe von emalloc zählt, handelt es sich nur um ein PHP-Programm, das nur eine Variable zuweist, aber es stellt sich heraus, dass es Hunderte von Anfragen dafür gibt Speicher: Dies ist natürlich sehr einfach zu erklären, da die Ausführung von PHP-Skripten die Definition einer großen Anzahl von Umgebungsvariablen und internen Variablen erfordert (Einzelheiten finden Sie unter PHP-Kernel – Lebenszyklus). 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 soll stattdessen PHPs ZendMM verwendet werden Rufen Sie die Speicherverwaltung auf Systemebene manuell direkt auf.


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. Dies hat den Vorteil, dass es schneller ausgeführt wird. Der Nachteil besteht darin, dass die Laufzeit des Programms länger wird. Die Speichernutzung wird „zunehmen“ (PHP5.2 und früher). 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) Neu identifizieren es ist verfügbar in , Ordnen Sie sie entsprechend der Größe des Speichers zur Verwendung in der nächsten Speicheranwendung in die drei oben genannten Listen (klein, groß, frei) ein.


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 Cache zwischen zwei Hardwaretypen mit einem großen Geschwindigkeitsunterschied wird für die Struktur verwendet Das koordiniert den Unterschied in der Datenübertragungsgeschwindigkeit zwischen den beiden und kann als Cache bezeichnet werden. Ausgehend vom anfänglichen Cache zwischen Prozessor und Speicher geht es darum, die Geschwindigkeit des Datenzugriffs an die Verarbeitungsgeschwindigkeit der CPU anzupassen. Es basiert auf dem Prinzip des „lokalen Verhaltens der Programmausführung und des Datenzugriffs“ im Speicher. 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 angelegten Speicher gespeichert. Wenn der Speicher nicht ausreicht, muss der Cache verwendet werden freigelassen 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 .


Das obige ist der detaillierte Inhalt vonPHP-Kernel – detaillierte grafische Erläuterung der Speicherverwaltung und des Caching-Mechanismus. 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