>  기사  >  백엔드 개발  >  PHP 커널--메모리 관리 및 캐싱 메커니즘에 대한 자세한 그래픽 설명

PHP 커널--메모리 관리 및 캐싱 메커니즘에 대한 자세한 그래픽 설명

黄舟
黄舟원래의
2017-03-09 09:47:011672검색

머리말:

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

힙 계층은 PHP 메모리 관리의 핵심 구현입니다., PHP의 기본 메모리 관리인 ZendMM은 system 메모리 애플리케이션은 필요할 때 시스템에 즉시 적용되지는 않지만 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. 기본적으로 malloc은 메모리 할당에 사용됩니다.
ZEND

_WIN32 매크로가 설정된 경우 Windows 버전이고 HeapAlloc입니다. 나머지 두 가지 메모리 체계는 익명 메모리 매핑이며, PHP의 메모리 체계는 환경 변수를 설정하여 수정할 수 있습니다.



그림 6.1 PHP 메모리 관리자


1. 메모리 활용

힙 계층은 PHP 메모리 관리의 핵심 구현입니다. PHP의 기본 메모리 관리는 작은 메모리 목록(free_buckets), 큰 메모리 목록(large_free_buckets) 및 나머지 메모리 목록을 중심으로 이루어집니다. (rest_buckets) 계층적 처리를 수행하기 위한 세 개의 목록입니다. ZendMM이 시스템에 적용한 메모리 적용은 ​​필요할 때 즉시 시스템에 적용되지 않고, 대신 ZendMM의 하위 계층(힙 계층)이 시스템에 적용됩니다. 위의 세 가지 목록을 채워서 큰 블록을 먼저 메모리에 저장합니다. 메모리 풀과 유사한 관리 메커니즘을 설정합니다.


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

<?php
  $tipi = "o_o\n";
  echo $tipi;
?>

간단한 PHP 프로그램이지만 emalloc에 ​​대한 호출 횟수를 계산해 보면 변수 할당만 하는 PHP 프로그램일 뿐인데 메모리에 대한 요청이 수백 건에 달하는 것으로 나타났습니다. 물론 이것은 설명하기 매우 쉽습니다. PHP 스크립트를 실행하려면 수많은 환경 변수와 내부 변수에 대한 정의가 필요하기 때문입니다(자세한 내용은 PHP 커널-라이프 사이클 참조). 이러한 정의 자체는 메모리에 저장되어야 합니다.

PHP Extension 작성시 emalloc 사용을 권장합니다 (zend의 메모리 블록 신청) _mm_storage 레이어 ) 대신 malloc(운영 체제의 메모리 블록에 적용), 실제로는 PHP의 ZendMM을 대신 사용하는 것입니다. 시스템 수준 메모리 관리를 직접 수동으로 호출합니다.


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->캐시.

메모리 소멸 과정에는 참조 카운팅과 가비지 컬렉션(GC)도 포함되는데 이에 대해서는 다음 섹션에서 설명하겠습니다. PHP 커널 - 메모리 누수 및 새로운 가비지 수집 메커니즘


참조 3. 캐시

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

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

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

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

· 캐시 초기화

·캐시 내용 가져오기

·캐시 쓰기

캐시를 해제하거나 캐시 목록을 삭제하세요

캐시 자체도 스토리지 레이어에서 적용한 메모리에 저장되어 있는데, 메모리가 부족할 경우 캐시를 반드시 삭제해야 합니다. 석방되다.

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


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

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