您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 安阳分类信息网,免费分类信息发布

详解PHP内存池中的存储层(1)_PHP教程

2024/6/5 4:21:16发布32次查看
php的内存管理器是分层(hierarchical)的。这个管理器共有三层:存储层(storage)、堆(heap)层和 emalloc/efree 层。存储层通过 malloc()、mmap() 等函数向系统真正的申请内存,并通过free()函数释放所申请的内存。
存储层通常申请的内存块都比较大,这里申请的内存大并不是指storage层结构所需要的内存大,只是堆层通过调用存储层的分配方法时,其以段的格式申请的内存比较大,存储层的作用是将内存分配的方式对堆层透明化。
首先看storage层的结构:
/* heaps with user defined storage */  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;      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_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 *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}   /* 使用mmap内存映射函数分配内存 写入时拷贝的私有映射,并且映射到/dev/zero。*/  # define zend_mm_mem_mmap_zero_dsc {mmap_zero, zend_mm_mem_mmap_zero_init, zend_mm_mem_mmap_zero_dtor, zend_mm_mem_dummy_compact, zend_mm_mem_mmap_zero_alloc, zend_mm_mem_mmap_realloc, zend_mm_mem_mmap_free}   /* 使用heapalloc分配内存 windows版本 关于这点,注释中写的是virtualalloc() to allocate memory,实际在程序中使用的是heapalloc*/  # define zend_mm_mem_win32_dsc {win32, zend_mm_mem_win32_init, zend_mm_mem_win32_dtor, zend_mm_mem_win32_compact, zend_mm_mem_win32_alloc, zend_mm_mem_win32_realloc, zend_mm_mem_win32_free}   /* 使用malloc分配内存 默认为此种分配 如果有加zend_win32宏,则使用win32的分配方案*/  # define zend_mm_mem_malloc_dsc {malloc, zend_mm_mem_dummy_init, zend_mm_mem_dummy_dtor, zend_mm_mem_dummy_compact, zend_mm_mem_malloc_alloc, zend_mm_mem_malloc_realloc, zend_mm_mem_malloc_free}   static const zend_mm_mem_handlers mem_handlers[] = {  #ifdef have_mem_win32      zend_mm_mem_win32_dsc,  #endif  #ifdef have_mem_malloc      zend_mm_mem_malloc_dsc,  #endif  #ifdef have_mem_mmap_anon      zend_mm_mem_mmap_anon_dsc,  #endif  #ifdef have_mem_mmap_zero      zend_mm_mem_mmap_zero_dsc,  #endif      {null, null, null, null, null, null}  };  
1
http://www.bkjia.com/phpjc/445855.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/445855.htmltecharticlephp的内存管理器是分层(hierarchical)的。这个管理器共有三层:存储层(storage)、堆(heap)层和 emalloc/efree 层。存储层通过 malloc()、mmap...
安阳分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录