详解PHP内存池中的存储层(1)
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>
内存的分配方式,调用的函数是_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>
1

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Selon des informations publiées sur ce site Web le 3 septembre, le média coréen etnews a rapporté hier (heure locale) que les produits de mémoire mobile à structure empilée « de type HBM » de Samsung Electronics et SK Hynix seraient commercialisés après 2026. Des sources ont indiqué que les deux géants coréens de la mémoire considèrent la mémoire mobile empilée comme une source importante de revenus futurs et prévoient d'étendre la « mémoire de type HBM » aux smartphones, tablettes et ordinateurs portables afin de fournir de la puissance à l'IA finale. Selon des rapports précédents sur ce site, le produit de Samsung Electronics s'appelle LPWide I/O memory, et SK Hynix appelle cette technologie VFO. Les deux sociétés ont utilisé à peu près la même voie technique, à savoir combiner emballage en sortance et canaux verticaux. La mémoire LPWide I/O de Samsung Electronics a une largeur de 512 bits.

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c
