>  기사  >  백엔드 개발  >  PHP 커널의 메모리 관리 및 캐싱 메커니즘 탐색

PHP 커널의 메모리 관리 및 캐싱 메커니즘 탐색

不言
不言원래의
2018-04-17 10:05:091553검색

이 기사의 내용은 PHP 커널의 메모리 관리 및 캐싱 메커니즘에 대한 것입니다. 이제는 모든 사람과 공유할 수 있습니다. 도움이 필요한 친구들은 이를 참조할 수 있습니다.


PHP를 실행할 때 필요한 메모리는 여러 번이 아닌 한 번만 운영 체제에 적용됩니다. 그렇다면 그는 어떻게 한꺼번에 신청했고, 그 메커니즘은 무엇이었을까요? 아래 소개를 참조하시기 바랍니다.

힙 레이어는 PHP 메모리 관리의 핵심 구현입니다.

, PHP의 최하위 레이어 메모리 관리, ZendMM의 시스템 메모리 적용은 ​​필요할 때 시스템에 즉시 적용되는 것이 아니라 다음에 의해 수행됩니다. ZendMM 맨 아래 계층(힙 계층)은 먼저 시스템의 큰 메모리 블록에 적용되고 메모리 풀과 유사한 관리 메커니즘을 설정합니다. 설정 해제 후

ZendMM은 메모리를 시스템에 즉시 반환하지 않고 단지 자체적으로 유지 관리 메모리 풀(저장 계층) 에서 사용 가능한 으로 다시 식별합니다. 장점:

1.

미리 정의된 상수 변수가 많고 수백 건의 메모리 요청이 있습니다.

시스템에서 PHP의 빈번한 메모리 응용 프로그램 작업을 방지하고 OS에 대한 요청 수를 줄입니다. 2.

실행 속도가 빨라집니다. 단점은 프로그램 실행 시간이 길어질수록

메모리 사용량이 늘어나므로 5.3에서는 새로운 가비지 수집 메커니즘이 도입됩니다.

상세 분석은 다음과 같습니다.


PHP의 메모리 관리는 계층적이라고 볼 수 있습니다. 이는
스토리지 계층(storage), 힙 계층(heap) 및 인터페이스 계층(emalloc/efree)

의 세 가지 계층으로 나뉩니다. 저장 계층은 실제로 malloc(), mmap() 등의 함수를 통해 시스템에서 메모리를 적용하고, free() 함수를 통해 요청된 메모리를 해제한다.


여기서 적용되는 대용량 메모리는 스토리지 레이어 구조에 필요한 메모리가 아니라 힙 레이어에 의한 할당이 상대적으로 큽니다. 저장소 계층 메서드를 호출하면 큰 덩어리의 메모리에 적용됩니다

저장소 계층의 기능은 메모리 할당 방법을 힙 계층에 투명하게 만드는 것입니다.

아래 그림과 같이 PHP 메모리 관리자입니다. PHP는 저장소 계층에 4가지 메모리 할당 체계를 가지고 있습니다: malloc, win32, mmap_anon, mmap_zero 기본적으로, ZEND_WIN32 매크로가 설정된 경우 Windows 버전이고 HeapAlloc이 호출되어 할당됩니다. 메모리 나머지 두 가지 메모리 구성표는 익명 메모리 맵이며 환경 변수를 설정하여 PHP의 메모리 구성표를 수정할 수 있습니다.

그림 6.1 PHP 메모리 관리자



1. 메모리 애플리케이션

힙 레이어는 PHP 메모리 관리의 핵심 구현입니다 PHP의 기본 메모리 관리는 작은 메모리 목록(free_buckets), 큰 메모리 목록(large_free_buckets) 및 남은 메모리 목록(rest_buckets)의 세 가지 목록으로 나뉩니다. 레이어로. ZendMM의 시스템 메모리 적용은 ​​필요할 때 즉시 시스템에 적용되지 않습니다. 대신 ZendMM의 하위 레이어(힙 레이어)가 큰 메모리 블록을 위해 시스템에 먼저 적용됩니다. 메모리 풀과 유사한 관리 메커니즘을 설정합니다.


프로그램이 메모리를 사용해야 할 때 ZendMM은 해당 메모리를 메모리 풀에 할당하여 사용합니다. 이것의 장점은 다음 코드와 같이 PHP가 시스템에 대해 빈번한 메모리 애플리케이션 작업을 방지한다는 것입니다.

이것은 간단한 PHP 프로그램이지만 emalloc에 ​​대한 호출 횟수를 계산해 보면 변수만 할당하는 PHP 프로그램일 뿐이지만 수백 건의 메모리 요청이 있음을 알 수 있습니다. 물론 설명하기는 매우 쉽습니다. , 왜냐하면 많은 수의 환경 변수와 내부 변수의 정의가 필요한 PHP 스크립트 실행(자세한 내용은
PHP 커널 - 라이프 사이클

참조)과 이러한 정의 자체가 메모리에 저장되어야 하기 때문입니다.


PHP 확장을 작성할 때
malloc

(운영 체제의 메모리 블록을 적용) 대신

emalloc

  • (

    zend
  • _mm_storage 레이어의 메모리 블록을 적용)
    을 사용하는 것이 좋습니다
사실, 즉, 시스템 수준의 메모리 관리를 직접 호출하여 수동으로 대체하려면 PHP의
Zend

MM을 사용하세요.

ZendMM은 메모리 할당을 위해 _zend_mm_alloc_int 함수를 사용합니다. 프로세스는 다음과 같습니다. 위에서 볼 수 있듯이 할당, PHP의 메모리 할당은 PHP 사용을 기반으로 설계되었습니다. PHP는 일반적으로 웹 응용 프로그램의 데이터 지원에 사용됩니다. 단일 스크립트의 실행 주기는 일반적으로 비교적 짧습니다(최대 몇 초). 할당을 위해 인접하지 않은 주소를 더 이상 복잡하게 사용 가능한 메모리 병합하지 않고 시스템에 다시 중앙 집중식으로 요청합니다. 이것의 장점은 더 빠르게 실행된다는 것입니다. 단점은 프로그램의 실행 시간이 길어질수록 메모리 사용량이 "점점 더 많아진다"는 것입니다(PHP5.2 및 이전 버전). 따라서 PHP5.3 이전 버전은 데몬 프로세스로 장기간 운영하기에 적합하지 않습니다. (물론, 이를 해결하는 다른 방법도 있으며 PHP5.3에는 새로운 GC 메커니즘이 도입되었습니다. 자세한 내용은 다음 섹션을 참조하세요PHP 커널--메모리 누수 및 새로운 가비지 수집 메커니즘)


2. 기억의 파괴

ZendMM은 메모리 소멸 처리 시 메모리 애플리케이션과 동일한 전략을 채택합니다. 프로그램이 변수를 설정 해제하거나 다른 릴리스 동작을 수행할 때 ZendMM은 메모리를 직접 반환하지 않습니다. 시스템은 재식별만 합니다. 자체적으로 유지 관리되는 메모리 풀(스토리지 계층) 에서 사용 가능한 으로, 메모리 크기(소형, 대형, 무료)에 따라 위에서 언급한 세 가지 목록으로 정리하여 사용합니다. 다음 메모리 애플리케이션.


메모리 파괴의 최종 구현 함수는 _efree입니다. _efree에서는 메모리가 파괴되면 먼저 캐시에 다시 넣을지 여부를 결정해야 합니다. 메모리 크기가 ZEND_MM_SMALL_SIZE를 충족하고 캐시가 시스템 설정 ZEND_MM_CACHE_SIZE를 초과하지 않은 경우 현재 메모리 블록 zend_mm_block이 mm_heap->cache에 다시 저장됩니다.

메모리 소멸 프로세스에는 참조 카운팅 및 가비지 수집(GC)도 포함되며 이에 대해서는 다음 섹션에서 설명합니다. PHP 커널 - 메모리 누수 및 새로운 가비지 수집 메커니즘


3을 참조하세요. Cache


Wikipedia에 다음과 같은 설명이 있습니다. Every 속도에 위치한 상당히 다른 두 가지 유형의 하드웨어 간의 데이터 전송 속도 차이를 조정하는 데 사용되는 구조를 캐시라고 할 수 있습니다. 프로세서와 메모리 사이의 초기 캐시부터 시작하여 데이터 액세스 속도를 CPU의 처리 속도에 적응시키는 것이 모두 메모리 내 "프로그램 실행 및 데이터 액세스의 로컬 동작"을 기반으로 합니다. . 마찬가지로 PHP 메모리 관리의 캐시도 "프로그램 실행 및 데이터 액세스의 로컬 동작" 원칙을 기반으로 합니다. 캐시를 도입하는 목적은 작은 메모리 블록에 대한 쿼리 수를 줄이고(쿼리하기 전에 캐시에 적중할 수 있는지 확인) 최근에 액세스한 데이터에 더 빠른 액세스를 제공하는 것입니다.

PHP는 메모리 관리 메커니즘에 캐싱을 추가하고 다음을 수행합니다.

·캐시와 캐시의 크기 제한, 즉 캐시를 사용할 시기를 식별하고 경우에 따라 최소한의 노력으로 캐시를 비활성화할 수 있습니다. 수정

·캐시의 저장 구조, 즉 캐시의 저장 위치, 구조 및 저장 논리

·캐시 초기화

·캐시에 있는 콘텐츠 가져오기

·캐시 쓰기

캐시 해제 또는 캐시 목록 지우기

캐시 자체도 저장 계층에서 요청한 메모리에 저장됩니다. 메모리가 부족하면 캐시를 해제해야 합니다. 힙 메모리가 오버플로되면 프로그램은 zend_mm_free_cache를 호출하여 캐시를 해제합니다. 전체 릴리스 프로세스는 배열 순회입니다. 각 배열 요소에 대해 프로그램은 연결된 목록에서 이전 요소를 순회하고 메모리 병합 작업을 수행하며 힙 구조에서 캐시 측정 수를 줄입니다.

관련 추천:

PHP 커널 SAPI 탐색 예제 공유


위 내용은 PHP 커널의 메모리 관리 및 캐싱 메커니즘 탐색의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.