马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。
PHP的内存办理器是分层(hierarchical)的。这个办理器共有三层:存储层(storage)、堆(heap)层和emalloc/efree层。存储层经由过程malloc()、mmap()等函数向体系真实的请求内存,并经由过程free()函数开释所请求的内存。
存储层一般请求的内存块都对照年夜,这里请求的内存年夜并非指storage层布局所必要的内存年夜,只是堆层经由过程挪用存储层的分派办法时,其以段的格式请求的内存对照年夜,存储层的感化是将内存分派的体例对堆层通明化。
起首看storage层的布局:
/*Heapswithuserdefinedstorage*/
typedefstruct_zend_mm_storagezend_mm_storage;
typedefstruct_zend_mm_segment{
size_tsize;
struct_zend_mm_segment*next_segment;
}zend_mm_segment;
typedefstruct_zend_mm_mem_handlers{
constchar*name;
zend_mm_storage*(*init)(void*params);//初始化函数
void(*dtor)(zend_mm_storage*storage);//析构函数
void(*compact)(zend_mm_storage*storage);
zend_mm_segment*(*_alloc)(zend_mm_storage*storage,size_tsize);//内存分派函数
zend_mm_segment*(*_realloc)(zend_mm_storage*storage,zend_mm_segment*ptr,size_tsize);//从头分派内存函数
void(*_free)(zend_mm_storage*storage,zend_mm_segment*ptr);//开释内存函数
}zend_mm_mem_handlers;
struct_zend_mm_storage{
constzend_mm_mem_handlers*handlers;//处置函数集
void*data;
};
内存的分派体例,挪用的函数是_zend_mm_storage布局中的处置函数集,而内存是以段的情势体现的。
4种内存计划
PHP在存储层共有4种内存分派计划:malloc,win32,mmap_anon,mmap_zero。默许利用malloc分派内存,假如设置了ZEND_WIN32宏,则为windows版本,挪用HeapAlloc分派内存,剩下两种内存计划为匿名内存映照,而且PHP的内存计划能够经由过程设置变量来修正。
官方申明以下:
TheZendMMcanbetweakedusingZEND_MM_MEM_TYPEandZEND_MM_SEG_SIZEenvironmentvariables.Defaultvaluesare“malloc”and“256K”.Dependentontargetsystemyoucanalsouse“mmap_anon”,“mmap_zero”and“win32″storagemanagers.
在代码中,关于这4种内存分派计划,分离对应完成了zend_mm_mem_handlers中的各个处置函数。共同代码的复杂申明以下:
/*利用mmap内存映照函数分派内存写进时拷贝的公有映照,而且匿名映照,映照区不与任何文件联系关系。*/
#defineZEND_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学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。 |