PHP7記憶體分配管理(一)
阿新 • • 發佈:2019-01-25
最近沒什麼事情,就決定分析一下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) 為大塊記憶體,按照大塊記憶體的策略來分配
超過大塊記憶體的,按照超大塊記憶體來分配。
下一篇博文我們就詳細分析超大塊記憶體的分配策略。