亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

淺談PHP源碼三十一:PHP內存池中的堆(heap)層基礎

2020-03-22 17:47:25
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了關于淺談PHP源碼三十一:PHP內存池中的堆(heap)層基礎,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

淺談PHP源碼三十一:PHP內存池中的堆(heap)層基礎

【概述】
PHP的內存管理器是分層(hierarchical)的。這個管理器共有三層:存儲層(storage)、堆(heap)層和 emalloc/efree 層。在PHP源碼閱讀筆記三十:PHP內存池中的存儲層中介紹了存儲層,存儲層通過 malloc()、mmap() 等函數向系統真正的申請內存,并通過 free() 函數釋放所申請的內存。存儲層通常申請的內存塊都比較大,這里申請的內存大并不是指storage層結構所需要的內存大,只是堆層通過調用存儲層的分配方法時,其以段的格式申請的內存比較大,存儲層的作用是將內存分配的方式對堆層透明化。
在存儲層之上就是今天我們要了解的堆層。堆層一個調度層,它與上面的emalloc/efree層交互,將通過存儲層申請到的大塊內存,進行拆分,按需提供。在堆層中有其一套內存的調度策略,這個整個PHP內存分配管理的核心區域。

以下的所有分享都是基于ZEND_DEBUG未打開的情況。
首先看下堆層所涉及到的結構:
【結構】

 /* mm block type */typedef struct _zend_mm_block_info {size_t _size;/* block的大小*/size_t _prev;/* 計算前一個塊有用到*/} zend_mm_block_info;  typedef struct _zend_mm_block {zend_mm_block_info info;} zend_mm_block; typedef struct _zend_mm_small_free_block {/* 雙向鏈表 */zend_mm_block_info info;struct _zend_mm_free_block *prev_free_block;/* 前一個塊 */struct _zend_mm_free_block *next_free_block;/* 后一個塊 */} zend_mm_small_free_block;/* 小的空閑塊*/ typedef struct _zend_mm_free_block {/* 雙向鏈表 + 樹結構 */zend_mm_block_info info;struct _zend_mm_free_block *prev_free_block;/* 前一個塊 */struct _zend_mm_free_block *next_free_block;/* 后一個塊 */ struct _zend_mm_free_block **parent;/* 父結點 */struct _zend_mm_free_block *child[2];/* 兩個子結點*/} zend_mm_free_block;  struct _zend_mm_heap {int use_zend_alloc;/* 是否使用zend內存管理器 */void *(*_malloc)(size_t);/* 內存分配函數*/void (*_free)(void*);/* 內存釋放函數*/void *(*_realloc)(void*, size_t);size_t free_bitmap;/* 小塊空閑內存標識 */size_t large_free_bitmap; /* 大塊空閑內存標識*/size_t block_size;/* 一次內存分配的段大小,即ZEND_MM_SEG_SIZE指定的大小,默認為ZEND_MM_SEG_SIZE (256 * 1024)*/size_t compact_size;/* 壓縮操作邊界值,為ZEND_MM_COMPACT指定大小,默認為 2 * 1024 * 1024*/zend_mm_segment *segments_list;/* 段指針列表 */zend_mm_storage *storage;/* 所調用的存儲層 */size_t real_size;/* 堆的真實大小 */size_t real_peak;/* 堆真實大小的峰值 */size_t limit;/* 堆的內存邊界 */size_t size;/* 堆大小 */size_t peak;/* 堆大小的峰值*/size_t reserve_size;/* 備用堆大小*/void *reserve;/* 備用堆 */int overflow;/* 內存溢出數*/int internal;#if ZEND_MM_CACHEunsigned int cached;/* 已緩存大小 */zend_mm_free_block *cache[ZEND_MM_NUM_BUCKETS];/* 緩存數組/#endifzend_mm_free_block *free_buckets[ZEND_MM_NUM_BUCKETS*2];/* 小塊空閑內存數組 */zend_mm_free_block *large_free_buckets[ZEND_MM_NUM_BUCKETS];/* 大塊空閑內存數組*/zend_mm_free_block *rest_buckets[2];/* 剩余內存數組 */ };

對于heap結構中的內存操作函數,如果use_zend_alloc為否,則使用malloc-type 內存分配,此時所有的操作就不經過堆層中的內存管理,直接采用malloc等函數。

compact_size的大小默認為 2 * 1024 * 1024(2M),如果有設置變量ZEND_MM_COMPACT則為此指定大小,如果內存的峰值超過這個值,則會調用storage的compact函數,只是這個函數現在的實現為空,可能在后續的版本中添加。

reserve_size為備用堆的大小,默認情況下為ZEND_MM_RESERVE_SIZE,其大小為(8*1024)
*reserve為備用堆,其大小為reserve_size,其用作內存溢出時報告錯誤用。

【關于USE_ZEND_ALLOC】
html' target='_blank'>環境變量 USE_ZEND_ALLOC 可用于允許在運行時選擇 malloc 或 emalloc 內存分配。使用 malloc-type 內存分配將允許外部調試器觀察內存使用情況,而 emalloc 分配將使用 Zend 內存管理器抽象,要求進行內部調試。
[zend_startup() - start_memory_manager() - alloc_globals_ctor()]

static void alloc_globals_ctor(zend_alloc_globals *alloc_globals TSRMLS_DC){char *tmp;alloc_globals- mm_heap = zend_mm_startup(); tmp = getenv( USE_ZEND_ALLOC if (tmp) {alloc_globals- mm_heap- use_zend_alloc = zend_atoi(tmp, 0);if (!alloc_globals- mm_heap- use_zend_alloc) {/* 如果不使用zend的內存管理器,同直接使用malloc函數*/alloc_globals- mm_heap- _malloc = malloc;alloc_globals- mm_heap- _free = free;alloc_globals- mm_heap- _realloc = realloc;}}

初始化

[zend_mm_startup()]
初始化storage層的分配方案,初始化段大小,壓縮邊界值,并調用zend_mm_startup_ex()初始化堆層。

[zend_mm_startup() - zend_mm_startup_ex()]
【內存對齊】
在PHP的內存分配中使用了內存對齊,內存對齊計算顯然有兩個目標:一是減少CPU的訪存次數;第二個就是還要保持存儲空間的效率足夠高。

 # define ZEND_MM_ALIGNMENT 8 #define ZEND_MM_ALIGNMENT_MASK ~(ZEND_MM_ALIGNMENT-1)  #define ZEND_MM_ALIGNED_SIZE(size)(((size) + ZEND_MM_ALIGNMENT - 1) ZEND_MM_ALIGNMENT_MASK)  #define ZEND_MM_ALIGNED_HEADER_SIZEZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_block)) #define ZEND_MM_ALIGNED_FREE_HEADER_SIZEZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_small_free_block))

PHP在分配塊的內存中,用到內存對齊,如果所需要的內存的大小的低三位不為0(不能為8整除),則將低三位加上7,并~7進行與操作,即對于大小不是8的整數倍的內存大小補全到可以被8整除。
在win32機器上,一些宏對應的數值大小為:
ZEND_MM_MIN_SIZE=8
ZEND_MM_MAX_SMALL_SIZE=272
ZEND_MM_ALIGNED_HEADER_SIZE=8
ZEND_MM_ALIGNED_FREE_HEADER_SIZE=16
ZEND_MM_MIN_ALLOC_BLOCK_SIZE=8
ZEND_MM_ALIGNED_MIN_HEADER_SIZE=16
ZEND_MM_ALIGNED_SEGMENT_SIZE=8

如果要分配一個大小為9個字節的塊,則其實際分配的大小為ZEND_MM_ALIGNED_SIZE(9 + 8)=24

【塊的定位】
所分配的內存的右邊的兩位是用來標記內存的類型。
其大小的定義為#define ZEND_MM_TYPE_MASK ZEND_MM_LONG_CONST(0×3)

如下所示代碼為塊的定位

 #define ZEND_MM_NEXT_BLOCK(b)ZEND_MM_BLOCK_AT(b, ZEND_MM_BLOCK_SIZE(b)) #define ZEND_MM_PREV_BLOCK(b)ZEND_MM_BLOCK_AT(b, -(int)((b)- info._prev ~ZEND_MM_TYPE_MASK))  #define ZEND_MM_BLOCK_AT(blk, offset)((zend_mm_block *) (((char *) (blk))+(offset))) #define ZEND_MM_BLOCK_SIZE(b)((b)- info._size ~ZEND_MM_TYPE_MASK)#define ZEND_MM_TYPE_MASKZEND_MM_LONG_CONST(0x3)

當前塊的下一個元素,即為當前塊的頭位置加上整個塊(去掉了類型的長度)的長度。
當前塊的上一個元素,即為當前塊的頭位置減去前一個塊(去掉了類型的長度)的長度。
關于前一個塊的長度,在塊的初始化時設置為當前塊的大小與塊類型的或操作的結果。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

淺談PHP源碼三十:PHP內存池中的存儲層

淺談PHP源碼二十九:關于接口的繼承

淺談PHP源碼二十八:關于類結構和繼承

以上就是淺談PHP源碼三十一:PHP內存池中的堆(heap)層基礎的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品欧美一区二区三区| 日韩欧美在线一区| 国产不卡在线观看| 亚洲电影在线看| 日韩精品在线观看视频| 欧美最猛性xxxxx(亚洲精品)| 国产精品视频公开费视频| 成人有码视频在线播放| 91午夜理伦私人影院| 欧美在线观看网站| 亚洲精品国产福利| 另类天堂视频在线观看| 日韩精品久久久久久久玫瑰园| 日韩高清电影好看的电视剧电影| 精品久久久久久久久久久久久久| 91欧美精品午夜性色福利在线| 久久综合色影院| 日韩欧美在线视频观看| 欧美激情在线观看视频| 麻豆精品精华液| 91免费观看网站| 精品自在线视频| 国产精品国产福利国产秒拍| 国产亚洲精品一区二555| 中文字幕不卡在线视频极品| 欧美亚洲另类激情另类| 国产一区二区三区免费视频| 91禁外国网站| 日韩免费视频在线观看| 欧美洲成人男女午夜视频| 成人免费网站在线| 欧美一区二三区| 国产精品久久久久久久久免费| 欧美日韩免费区域视频在线观看| 亚洲国产精彩中文乱码av在线播放| 91精品国产综合久久香蕉的用户体验| 97视频色精品| 亚洲已满18点击进入在线看片| 国产精品对白刺激| 97超碰蝌蚪网人人做人人爽| 成年人精品视频| 欧美亚洲午夜视频在线观看| 成人午夜激情网| 亚洲老司机av| 精品中文字幕视频| 欧美在线视频一区二区| 在线观看欧美成人| 91精品国产色综合| 亚洲品质视频自拍网| 久久久国产一区二区三区| 欧美做受高潮1| 国产精品伦子伦免费视频| 97国产精品免费视频| 亚洲精品黄网在线观看| 欧美精品免费在线| 日日噜噜噜夜夜爽亚洲精品| 久久手机精品视频| 色无极影院亚洲| 91伊人影院在线播放| 欧美日韩免费一区| 欧美成人精品一区二区| 色无极亚洲影院| 国产剧情久久久久久| 久久影视电视剧免费网站| 亚洲电影免费观看| 久久不射热爱视频精品| 九色精品美女在线| 在线播放精品一区二区三区| 国产精品久久不能| 91深夜福利视频| 欧美日韩色婷婷| 国产精品xxx视频| 日韩一区二区三区在线播放| 精品欧美一区二区三区| 久久久99久久精品女同性| 午夜精品www| 国产精品电影久久久久电影网| 国产91精品黑色丝袜高跟鞋| 国产精品福利网| 久久精品久久久久电影| 成人黄色影片在线| 国产精品xxx视频| 亚洲成人aaa| 国产亚洲欧美日韩一区二区| 欧美日韩中文在线| 欧美激情一区二区三区久久久| 欧美激情手机在线视频| 国产精品成人免费电影| 欧美日韩在线视频首页| 日韩精品在线免费观看| 欧美最顶级的aⅴ艳星| 日韩av免费网站| 黑人极品videos精品欧美裸| 在线观看欧美视频| 91禁国产网站| 6080yy精品一区二区三区| 成人国产在线激情| 久久久精品视频在线观看| 久久全国免费视频| 欧美电影在线播放| 中文字幕不卡在线视频极品| 日本亚洲欧美成人| 欧美一级bbbbb性bbbb喷潮片| 日韩精品中文字幕久久臀| 国产成人精品亚洲精品| 中文字幕亚洲一区| 91精品在线影院| 日韩中文字幕视频| 成人黄色片网站| 国产精品一区二区三区久久久| 国产成人精品视频在线观看| 久久精品亚洲一区| 亚洲欧美三级伦理| 精品国产一区二区三区在线观看| 在线播放日韩av| 18久久久久久| 亚洲欧美日韩爽爽影院| 狠狠色狠色综合曰曰| 日韩免费中文字幕| 日韩欧美国产激情| 91精品国产综合久久久久久蜜臀| 欧洲美女7788成人免费视频| 久久久久国产精品www| 成人黄色免费网站在线观看| 国产精品9999| 国产精品av电影| 欧美精品做受xxx性少妇| 久久香蕉国产线看观看网| 国产美女久久精品香蕉69| 亚洲一区二区日本| 欧美日韩美女视频| 中文字幕在线观看日韩| 欧美—级a级欧美特级ar全黄| 91精品在线影院| 欧美成人精品三级在线观看| 亚洲最大的免费| 国产精品久久久久高潮| 久久国产一区二区三区| 日韩在线视频免费观看高清中文| 成人在线中文字幕| 欧美成人午夜剧场免费观看| 欧美综合在线第二页| 91欧美精品成人综合在线观看| 欧美性感美女h网站在线观看免费| 精品小视频在线| 成人妇女淫片aaaa视频| 91中文在线观看| 精品中文字幕乱| 欧美午夜女人视频在线| 亚洲**2019国产| 欧美国产日本高清在线| 久久精品99久久香蕉国产色戒| 日韩午夜在线视频| 国产一级揄自揄精品视频| 国产在线高清精品| 欧美日韩国产成人| 亚洲日本aⅴ片在线观看香蕉| 中文一区二区视频| 亚洲成人av在线播放| 欧美一级大片在线免费观看| 日韩成人在线免费观看| 亚洲精美色品网站| 97成人精品区在线播放| 亚洲精品美女久久久|