PHP のメモリ マネージャーは階層型です。このマネージャーには、ストレージ層、ヒープ層、emalloc/efree 層の 3 つの層があります。ストレージ層は実際には、malloc() や mmap() などの関数を通じてシステムからメモリを適用し、free() 関数を通じて要求されたメモリを解放します。
ストレージ層によって通常適用されるメモリ ブロックは比較的大きいですが、ここで適用される大容量メモリは、ストレージ層構造によって必要とされる大容量メモリを指すものではなく、ヒープ層の割り当てメソッドを呼び出す場合にのみ適用されます。ストレージ層はセグメント形式で適用され、メモリは比較的大きく、ストレージ層の役割はメモリ割り当て方法をヒープ層に対して透過的にすることです。
まずストレージ層の構造を見てみましょう:
/* ユーザー定義のストレージを使用したヒープ */
typedef struct _zend_mm_storage zend_mm_storage;
typedef struct _zend_mm_segment {
size_t size; 🎜> struct _zend_mm_segment *next_segment;
} zend_mm_segment
typedef struct _zend_mm_mem_handlers {
const char *name id *params); *storage); // デストラクター
void (*compact)(zend_mm_storage *storage);
zend_mm_segment* (*_alloc)(zend_mm_storage *storage, size_t size); // メモリ割り当て関数
zend_mm_segment* ( *_realloc)(zend_mm_storage *storage, zend_mm_segment *ptr, size_t size); //メモリ再割り当て関数
void (*_free)(zend_mm_storage *storage, zend_mm_segment *ptr); //メモリ関数の解放
} zend_mm_mem_handlers;
struct _zend_mm_storage {
const zend_mm_mem_handlers *handlers; //処理関数セット
void
}; 呼び出される関数は、で設定された処理関数です。 _zend_mm_storage 構造体であり、メモリはセグメントの形式で表されます。
4 つのメモリ スキーム
PHP には、ストレージ層に 4 つのメモリ割り当てスキーム (malloc、win32、mmap_anon、mmap_zero) があります。デフォルトでは、ZEND_WIN32 マクロが設定されている場合は、malloc がメモリの割り当てに使用され、HeapAlloc がメモリの割り当てに呼び出されます。残りの 2 つのメモリ スキームは、変数を設定することで変更できます。 。
公式の説明は次のとおりです:
Zend MM は、ZEND_MM_MEM_TYPE および ZEND_MM_SEG_SIZE 環境変数を使用して調整できます。デフォルト値は「malloc」および「256K」です。ターゲット システムに応じて、「mmap_anon」も使用できます。
コードでは、これら 4 つのメモリ割り当てスキームに対して、zend_mm_mem_handlers の各処理関数がそれぞれ実装されています。コードの簡単な説明は次のとおりです:
/* mmap メモリ マッピング関数を使用して、メモリ、書き込み時にコピーされるプライベート マッピング、および匿名マッピングを割り当てます。マッピング領域はどのファイルにも関連付けられません。 */
# 定義 ZEND_MM_MEM_MMAP_ANON_DSC {"mmap_anon", zend_mm_mem_dummy_init, zend_mm_mem_dummy_dtor, zend_mm_mem_dummy_compact, zend_mm_mem_mmap_anon_alloc, zend_mm_mem_mmap_realloc, mmap_free} この記事のリンク http://www.cxybl.com/html/wlbc/Php/20130922/40142.html