1. 程式人生 > >PHP7記憶體分配管理(一)

PHP7記憶體分配管理(一)

最近沒什麼事情,就決定分析一下php7的記憶體管理方面的部落格,首先不得不說,PHP7的記憶體管理的程式碼和之前的版本比起來,思路上清晰了很多。記憶體的分配也分為了,小記憶體,大記憶體和超大記憶體。第一個章節我們就分析一下整個記憶體管理的結構吧。

一.主體的結構體:

struct _zend_mm_heap {
    #if ZEND_MM_STORAGE
        zend_mm_storage   *storage;
    #endif
    #if ZEND_MM_STAT
        size_t size;
        size_t peak;
    #endif
zend_mm_free_slot *free_slot[ZEND_MM_BINS];/*小記憶體分配的列表*/ #if ZEND_MM_STAT || ZEND_MM_LIMIT size_t real_size; #endif #if ZEND_MM_STAT size_t real_peak; #endif #if ZEND_MM_LIMIT size_tlimit; int overflow; #endif zend_mm_huge_list *huge_list;/*超大記憶體分配連結串列*/
zend_mm_chunk *main_chunk; zend_mm_chunk *cached_chunks; int chunks_count; int peak_chunks_count; int cached_chunks_count; double avg_chunks_count; }; struct _zend_mm_chunk { zend_mm_heap *heap; zend_mm_chunk *next; zend_mm_chunk *prev; int
free_pages; /* number of free pages */ int free_tail; /* number of free pages at the end of chunk */ int num; char reserve[64 - (sizeof(void*) * 3 + sizeof(int) * 3)]; zend_mm_heap heap_slot; /* used only in main chunk */ zend_mm_page_map free_map; /* 512 bits or 64 bytes */ zend_mm_page_info map[ZEND_MM_PAGES];/* 2 KB = 512 * 4 */ };

二.關於記憶體管理的原始碼在 Zend目錄下:
1.zend_alloc_types.h
2.zend_alloc.h
3.zend_alloc.c

三.PHP7如何區分 大記憶體 小記憶體 超大記憶體?

#define ZEND_MM_CHUNK_SIZE (2 * 1024 * 1024)
#define ZEND_MM_PAGE_SIZE  (4 * 1024)
#define ZEND_MM_FIRST_PAGE (1)

#define ZEND_MM_MIN_SMALL_SIZE      8
#define ZEND_MM_MAX_SMALL_SIZE      3072  //3K
#define ZEND_MM_MAX_LARGE_SIZE      (ZEND_MM_CHUNK_SIZE - (ZEND_MM_PAGE_SIZE * ZEND_MM_FIRST_PAGE))

如果申請的記憶體大小為:8b-3kb之間,則為小塊記憶體,按照小塊記憶體來分配
如果申請的記憶體大小在 3kb~(2M-4K) 為大塊記憶體,按照大塊記憶體的策略來分配
超過大塊記憶體的,按照超大塊記憶體來分配。

下一篇博文我們就詳細分析超大塊記憶體的分配策略。