Home php教程 php手册 详解PHP内存池中的存储层(1)

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

Jun 13, 2016 am 11:12 AM
php three Memory layered storage yes pool of Manager Detailed explanation this

PHP的内存管理器是分层(hierarchical)的。这个管理器共有三层:存储层(storage)、堆(heap)层和 emalloc/efree 层。存储层通过 malloc()、mmap() 等函数向系统真正的申请内存,并通过free()函数释放所申请的内存。

存储层通常申请的内存块都比较大,这里申请的内存大并不是指storage层结构所需要的内存大,只是堆层通过调用存储层的分配方法时,其以段的格式申请的内存比较大,存储层的作用是将内存分配的方式对堆层透明化。

首先看storage层的结构:

<ol class="dp-xml">
<li class="alt"><span><span>/* Heaps with user defined storage */  </span></span></li>
<li><span>typedef struct _zend_mm_storage zend_mm_storage;  </span></li>
<li class="alt"><span>   </span></li>
<li><span>typedef struct _zend_mm_segment {  </span></li>
<li class="alt"><span>    size_t    size;  </span></li>
<li><span>    struct _zend_mm_segment *next_segment;  </span></li>
<li class="alt"><span>} zend_mm_segment;  </span></li>
<li><span>   </span></li>
<li class="alt"><span>typedef struct _zend_mm_mem_handlers {  </span></li>
<li><span>    const char *name;  </span></li>
<li class="alt"><span>    zend_mm_storage* (*init)(void *params);    //初始化函数  </span></li>
<li><span>    void (*dtor)(zend_mm_storage *storage);    //析构函数  </span></li>
<li class="alt"><span>    void (*compact)(zend_mm_storage *storage);  </span></li>
<li><span>    zend_mm_segment* (*_alloc)(zend_mm_storage *storage, size_t size);    //内存分配函数  </span></li>
<li class="alt"><span>    zend_mm_segment* (*_realloc)(zend_mm_storage *storage, zend_mm_segment *ptr, size_t size);    //重新分配内存函数  </span></li>
<li><span>    void (*_free)(zend_mm_storage *storage, zend_mm_segment *ptr);    //释放内存函数  </span></li>
<li class="alt"><span>} zend_mm_mem_handlers;  </span></li>
<li><span>   </span></li>
<li class="alt"><span>struct _zend_mm_storage {  </span></li>
<li><span>    const zend_mm_mem_handlers *handlers;    //处理函数集  </span></li>
<li class="alt"><span>    void *data;  </span></li>
<li><span>};  </span></li>
</ol>
Copy after login

内存的分配方式,调用的函数是_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中的各个处理函数。配合代码的简单说明如下:

<ol class="dp-xml">
<li class="alt"><span><span>/* 使用mmap内存映射函数分配内存 写入时拷贝的私有映射,并且匿名映射,映射区不与任何文件关联。*/  </span></span></li>
<li><span># 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}  </span></li>
<li class="alt"><span> </span></li>
<li><span>/* 使用mmap内存映射函数分配内存 写入时拷贝的私有映射,并且映射到/dev/zero。*/  </span></li>
<li class="alt"><span># 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}  </span></li>
<li><span> </span></li>
<li class="alt"><span>/* 使用HeapAlloc分配内存 windows版本 关于这点,注释中写的是VirtualAlloc() to allocate memory,实际在程序中使用的是HeapAlloc*/  </span></li>
<li><span># 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}  </span></li>
<li class="alt"><span> </span></li>
<li><span>/* 使用malloc分配内存 默认为此种分配 如果有加ZEND_WIN32宏,则使用win32的分配方案*/  </span></li>
<li class="alt"><span># 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}  </span></li>
<li><span> </span></li>
<li class="alt"><span>static const zend_mm_mem_handlers mem_handlers[] = {  </span></li>
<li><span>#ifdef HAVE_MEM_WIN32  </span></li>
<li class="alt"><span>    ZEND_MM_MEM_WIN32_DSC,  </span></li>
<li><span>#endif  </span></li>
<li class="alt"><span>#ifdef HAVE_MEM_MALLOC  </span></li>
<li><span>    ZEND_MM_MEM_MALLOC_DSC,  </span></li>
<li class="alt"><span>#endif  </span></li>
<li><span>#ifdef HAVE_MEM_MMAP_ANON  </span></li>
<li class="alt"><span>    ZEND_MM_MEM_MMAP_ANON_DSC,  </span></li>
<li><span>#endif  </span></li>
<li class="alt"><span>#ifdef HAVE_MEM_MMAP_ZERO  </span></li>
<li><span>    ZEND_MM_MEM_MMAP_ZERO_DSC,  </span></li>
<li class="alt"><span>#endif  </span></li>
<li><span>    {NULL, NULL, NULL, NULL, NULL, NULL}  </span></li>
<li class="alt"><span>};  </span></li>
</ol>
Copy after login

1

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

CakePHP Project Configuration CakePHP Project Configuration Sep 10, 2024 pm 05:25 PM

In this chapter, we will understand the Environment Variables, General Configuration, Database Configuration and Email Configuration in CakePHP.

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

CakePHP Date and Time CakePHP Date and Time Sep 10, 2024 pm 05:27 PM

To work with date and time in cakephp4, we are going to make use of the available FrozenTime class.

Sources say Samsung Electronics and SK Hynix will commercialize stacked mobile memory after 2026 Sources say Samsung Electronics and SK Hynix will commercialize stacked mobile memory after 2026 Sep 03, 2024 pm 02:15 PM

According to news from this website on September 3, Korean media etnews reported yesterday (local time) that Samsung Electronics and SK Hynix’s “HBM-like” stacked structure mobile memory products will be commercialized after 2026. Sources said that the two Korean memory giants regard stacked mobile memory as an important source of future revenue and plan to expand "HBM-like memory" to smartphones, tablets and laptops to provide power for end-side AI. According to previous reports on this site, Samsung Electronics’ product is called LPWide I/O memory, and SK Hynix calls this technology VFO. The two companies have used roughly the same technical route, which is to combine fan-out packaging and vertical channels. Samsung Electronics’ LPWide I/O memory has a bit width of 512

CakePHP File upload CakePHP File upload Sep 10, 2024 pm 05:27 PM

To work on file upload we are going to use the form helper. Here, is an example for file upload.

CakePHP Routing CakePHP Routing Sep 10, 2024 pm 05:25 PM

In this chapter, we are going to learn the following topics related to routing ?

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP is an open-source framework for PHP. It is intended to make developing, deploying and maintaining applications much easier. CakePHP is based on a MVC-like architecture that is both powerful and easy to grasp. Models, Views, and Controllers gu

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

See all articles