struct _zend_mm_storage {
const zend_mm_mem_handlers *handlers; //處理函數集
void *data;
};
記憶體的分配方式,調用的函數是_zend_mm_storage結構中的處理函數集,而記憶體是以段的形式表現的。
4種記憶體方案
PHP在儲存層共有4種記憶體配置方案: malloc,win32,mmap_anon,mmap_zero。預設使用malloc分配記憶體,如果設定了ZEND_WIN32宏,則為windows版本,調用HeapAlloc分配記憶體,剩下兩種記憶體方案為匿名記憶體映射,並且PHP的記憶體方案可以通過設定變數來修改。
官方說明如下:
The Zend MM can be tweaked using ZEND_MM_MEM_TYPE and ZEND_MM_SEG_SIZE environment variables. Default values are “malloc” and “256K”.Dependent on target system you can also use “mmap_anon”, “mmap_zero” and “win32″ storage managers.
在代碼中,對於這4種記憶體配置方案,分別對應實現了zend_mm_mem_handlers中的各個處理函數。配合代碼的簡單說明如下:
/* 使用mmap記憶體映射函數分配記憶體 寫入時拷貝的私人映射,並且匿名映射,映射區不與任何檔案關聯。*/
# define 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, zend_mm_mem_mmap_free} 本文連結http://www.cxybl.com/html/wlbc/Php/20130922/40142.html