PHP7 커널 분석 9 메모리 관리

不言
풀어 주다: 2023-03-23 18:12:02
원래의
1726명이 탐색했습니다.

이 글의 내용은 PHP7 커널 분석 9의 메모리 관리에 관한 것입니다. 이제 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다

1. Zend 메모리 풀

메모리 풀은 가장 낮은 수준의 메모리입니다. 커널 Operation에서는 청크, 페이지, 슬롯의 세 가지 단위로 메모리 블록을 정의합니다. 각 청크의 크기는 2M이고, 페이지 크기는 4KB로, 한 청크는 512페이지로 분할되고, 하나 이상의 페이지는 여러 개로 분할됩니다. 페이지 슬롯이므로 메모리를 적용할 때 다양한 애플리케이션 크기에 따라 구체적인 할당 전략이 결정됩니다.
Huge(chunk): 申请内存大于2M,直接调用系统分配,分配若干个chunk
Large(page): 申请内存大于3K(3/4 page_size),小于2044K(511 page_size),分配若干个page
Small(slot): 申请内存小于等于3K(3/4 page_size)
로그인 후 복사


2.zend 힙 구조

PHP7 커널 분석 9 메모리 관리

청크는 512페이지로 구성됩니다. 첫 번째 페이지는 청크 구조를 저장하기 위해 나머지 511페이지는 메모리 할당에 사용됩니다. 이 페이지는 주로 Large 및 Small 메모리 할당에 사용됩니다. 힙은 메모리 풀을 나타내는 구조입니다. 세 가지 메모리 할당 유형 중 Zend에는 힙 구조가 하나만 있습니다.


3. 메모리 할당

대량 할당

2M 이상의 메모리 적용은 ​​적용된 메모리 블록을 단일 연결 리스트를 통해 관리한다는 점만 제외하면 일반 메모리 적용과 크게 다르지 않습니다. 대규모 할당은 실제로 여러 청크를 할당하는 것을 의미합니다. 청크 할당은 또한 크고 작은 메모리 할당의 기초이기도 합니다. 이는 ZendMM이 시스템에서 메모리에 적용할 수 있는 유일한 세분성입니다. 청크 메모리를 적용할 때 핵심 연산이 있는데, 이는 메모리 주소를 ZEND_MM_CHUNK_SIZE에 맞추는 것인데, 이는 적용된 청크 주소가 모두 ZEND_MM_CHUNK_SIZE

Large 할당

의 정수 배수라는 것을 의미합니다. page_size(4KB)의 3/4보다 큽니다. ) 이하이며 511 page_size의 메모리 적용은 ​​청크의 크기가 충분하다는 것을 의미합니다(512가 아닌 511페이지인 이유는 첫 번째 페이지가 항상 청크 구조에 의해 점유되기 때문입니다). 여러 페이지의 경우 이 페이지는 모두 연속적으로 할당됩니다. 마지막 청크를 찾을 수 없으면 새 청크를 다시 할당하고 청크 연결 목록에 삽입합니다.

chunk->free_map은 비트맵을 사용하여 각 페이지 그룹의 사용량을 기록합니다

PHP7 커널 분석 9 메모리 관리

a.首先会直接跳过group1,直接到group2检索
b.在group2中找到第一个可用page位置:67,然后向下找第一个不可用page位置:69,找到的可用内存块长度为2,小于3,表示此内存块不可用
c.接着再次在group2中查找到第一个可用page位置:71,然后向下找到第一个不可用page位置:75,内存块长度为4,大于3,表示找到一个符合的位置,虽然已经找到可用内存块但并不"完美",先将这个并不完美的page_num及len保存到best、best_len,如果后面没有比它更完美的就用它了
d.再次检索,发现group2已无可用page,进入group3,找到可用内存位置:page 130-132,大小比c中找到的合适,所以最终返回的page就是130-132
e.page分配完成后会将free_map对应整数的bit位从page_num至(page_num+page_count)置为1
로그인 후 복사

Small 할당

작은 메모리는 (3/4 page_size)보다 작은 메모리를 의미합니다. 이러한 메모리는 먼저 하나 이상의 페이지에 적용한 다음 이 페이지를 고정된 크기로 자르므로 이전 섹션에서 첫 번째 단계는 Large로 완전히 할당됩니다. . 같은. 작은 메모리에는 총 30개의 고정 크기 사양이 있습니다: 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128 ... 1792, 2048, 2560, 3072바이트. 이 슬롯의 크기는 일정합니다. 가장 작은 슬롯 크기는 8바이트이고 처음 8개 슬롯은 8바이트씩 증가하며 이후 4개의 증분 값마다 2

PHP7 커널 분석 9 메모리 관리

step1: 首先根据申请内存的大小在heap->free_slot中找到对应的slot规格bin_num,如果当前slot为空则首先分配对应的page,free_slot[bin_num]始终指向第一个可用的slot
step2: 如果申请内存大小对应的的slot链表不为空则直接返回free_slot[bin_num],然后将free_slot[bin_num]指向下一个空闲位置
step3: 释放内存时先将此内存的next_free_slot指向free_slot[bin_num],然后将free_slot[bin_num]指向释放的内存,也就是将释放的内存插到链表头部
로그인 후 복사

을 곱합니다. 관련 권장 사항:

PHP7 커널 분석 8 등

PHP7 커널 분석 7 Zend 엔진 실행 프로세스

PHP7 커널 분석 6 기능

위 내용은 PHP7 커널 분석 9 메모리 관리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!