성능 집약적 중요 경로가있는 응용 프로그램이있을 때마다 메모리 처리 방법에 대해 염려해야합니다. 대부분의 최종 사용자 클라이언트 측 응용 프로그램은 기본 이벤트 중심이며 대부분의 이벤트는 사용자와의 상호 작용에서 비롯되며 성능 제약이 많지 않기 때문에이 범주에 속하지 않습니다.
그러나 많은 백엔드 소프트웨어는 메모리 처리 방법에 중점을 두어야합니다. 많은 소프트웨어가 더 많은 수의 클라이언트, 더 많은 수의 트랜잭션, 더 많은 데이터 소스를 처리하도록 확장 할 수 있기 때문입니다. 한계를 뛰어 넘어 상상할 수있는 사용 사례를 처리하기 위해 작성된 완전히 일반적인 메모리 할당 자에 의존하기보다는 소프트웨어 사용자 메모리를 분석하고 소프트웨어에 맞는 사용자 지정 할당 체계를 작성하는 방법을 분석 할 수 있습니다.
몇 가지 예를 들자면 ... 첫 번째 회사에서 프로세스 제어 데이터의 수집 / 저장 / 보관을 담당하는 소프트웨어 인 Historian 패키지 (공장, 원자력 발전소 또는 수백만 개의 센서를 갖춘 정유소, 해당 데이터를 저장합니다). 우리는 역사가가 더 많은 데이터를 처리하지 못하게하는 성능 병목 현상을 분석 할 때마다 대부분 메모리 처리 방식에 문제가있었습니다. 우리는 malloc / free가 절대적으로 필요한 경우가 아니라면 호출되지 않도록 많은 노력을 기울였습니다.
현재는 감시 비디오 디지털 레코더 및 분석 패키지를 사용하고 있습니다. 30fps에서 각 채널은 33 밀리 초마다 비디오 프레임을 수신합니다. 판매하는 하드웨어에서 100 채널의 비디오를 쉽게 녹화 할 수 있습니다. 따라서 중요한 경로 (네트워크 호출 => 캡처 구성 요소 => 레코더 관리 소프트웨어 => 저장소 구성 요소 => 디스크)에 동적 메모리 할당이 없는지 확인하는 또 다른 경우입니다. 고정 크기의 버퍼 버킷을 포함하고 LIFO를 사용하여 이전에 할당 된 버퍼를 재사용하는 사용자 지정 프레임 할당자가 있습니다. 600Kb의 저장 공간이 필요한 경우 공간을 낭비하는 1024Kb 버퍼가 생길 수 있지만 각 할당이 매우 수명이 짧은 용도에 맞게 조정되었으므로 버퍼가 사용되기 때문에 잘 작동합니다.
필자가 설명한 응용 프로그램 유형에서 (A에서 B로 많은 데이터를 이동하고 많은 수의 클라이언트 요청을 처리하는) 힙으로 돌아가는 것은 CPU 성능 병목 현상의 주요 원인입니다. 힙 조각화를 최소한으로 유지하는 것이 보조 이점이지만, 대부분의 최신 OS가 이미 조각화가 적은 힙을 구현하고 있다고 말할 수 있는 한 (최소한 Windows는 알고 있지만 다른 사람들도 그렇게하기를 바랍니다). 개인적으로 이러한 유형의 환경에서 12 년 이상 일하면서 힙과 관련된 CPU 사용 문제를 자주 보았지만 실제로 조각난 힙으로 고통받는 시스템을 본 적이 없었습니다.