Article/Computer Graphics

[iOS][번역] iOS 메모리 심층 분석

김성인 2024. 4. 16. 01:06

[iOS][번역] iOS 메모리 심층 분석

 

 

 의역이 많이 존재하고, 녹색의 문장은 본문에 없는 내용이다.


메모리 줄이기

 

 메모리는 왜 줄이나요? 메모리를 줄인다는 것은 메모리 사용량을 줄이는 것을 의미한다.


앱 메모리 사용량을 줄여야 하는 이유

  1. 사용자(유저)에게 더 나은 경험을 제공한다는 것.
  2. 앱이 더 빠르게 실행될 뿐만 아니라 시스템 성능이 더 좋아짐.
  3. 앱이 메모리에 더 오래 유지될 수 있다.
  4. 다른 앱 또한 메모리에 더 오래 남아 있을 수 있다.
  5. 거의 모든 경우에서 안 하는 것보다 더 좋다.

클린 & 더티 페이지

 

 힙 메모리(Heap Memory)에 여러 개체를 보유할 수 있는 페이지에 제공되는 메모리와 일부 개체는 여러 페이지에 걸쳐 있을 수 있다.

 

 Heap Memory : 동적으로 할당된 메모리를 관리하는 데 사용되는 영역으로 메모리 블록을 계속해서 할당하거나 해제할 수 있다.  그리고 이것 때문에 메모리 누수가 일어날 수 있다.

 

특히 힙에서 "clean"과 "dirty"라는 용어는 메모리의 페이지 상태를 나타낸다.
  • 클린 페이지: 클린 페이지는 해당 저장소(예: 디스크)와 마지막으로 동기화된 이후 수정되지 않은 메모리의 페이지를 의미한다.
    즉, 메모리에 있는 클린 페이지의 내용은 원래 로드되었거나 쓰여진 저장소이다.
    클린 페이지는 일반적으로 데이터 손실 없이 폐기하거나 교체해도 안전한 것으로 간주된다.
  • 더티 페이지: 반면, 더티 페이지는 해당 저장소와 마지막으로 동기화된 이후 수정된 메모리의 페이지이다.
    이는 메모리에 있는 페이지의 콘텐츠가 디스크나 기타 영구 저장소에 저장된 콘텐츠와 다르다는 것을 의미한다.
    더티 페이지를 안전하게 삭제하거나 교체하려면 먼저 스토리지와 동기화(다시 쓰기)해야 한다.
    그렇지 않으면 페이지에 대한 변경 사항이 손실될 위험이 있습니다.


 각 페이지는 일반적으로 16KB이며 클린 하거나 더티 해질 수 있다.

앱의 메모리 사용량은 페이지 수에 페이지 크기를 곱한 값이다.

 

 예시 : 가득 차지 않은 4페이지로 메모리에 매핑된 50KB인 JPEG가 있는 경우 > 이것의 좋은 예는 다른 용도로 사용할 수 있도록 가득 차지 않은 4페이지로 메모리 매핑된 50KB인 JPEG가 있는 경우이다.
 이 예시는 그냥 위 그림을 보고 이해하자.


메모리 압축


 iOS에는 전통적인 디스크 스왑 시스템이 없다.  대신 메모리 압축기를 사용한다.  이는 iOS 7에서 도입되었다.

 

 디스크 스왑 시스템 : '스와핑', '페이징'이라고도 불리운다.  장치에서 사용할 수 있는 제한된 물리적 메모리(RAM)를 처리하기 위해 운영 체제에서 사용하는 메모리 관리 기술이다.  RAM이 실행 중인 프로세스와 해당 데이터로 가득 차면 운영 체제는 가장 적게 사용되거나 비활성화된 데이터 중 일부를 메모리에서 장치의 저장소(디스크)로 이동하여 더 많은 활성 프로세스를 위해 메모리 공간을 확보한다.

 

 캐싱에 사용 중인 사전(dictionary)가 5페이지를 사용하는데, 만약 이를 잠시 동안 이 사전에 액세스하지 않고 시스템이 공간을 필요로 할 경우, 시스템은 이를 한 페이지로 압축할 수 있다.  이렇게 함으로써 공간을 절약하거나 여분의 4페이지를 확보할 수 있다. 

 

 우리는 너무 많은 캐싱을 해서는 안 된다.  캐싱을 할 때 CPU는 반복 작업을 하지 않으려고 하지만, 너무 많은 캐싱을 하면 모든 메모리에를 사용하고 시스템에 문제가 발생할 수 있다. 

 

 기기에 따라 제한이 달라질 수 있음을 기억하자. 

 

 예를 들어, 4기가 바이트 장치처럼 1기가 바이트 장치에서 동일하게 많은 메모리를 사용할 수 없다.


이미지


 이미지의 경우 가장 중요한 점은 메모리 사용이 '파일의 크기'가 아닌 '이미지의 크기'와 관련이 있다는 것이다.

 길이가 2048이고 너비가 1536이고 이미지 크기가 590KB인 이미지가 있다면 이것은 메모리에 590KB로 할당되지 않는다.


 실제로 얼마나 많은 메모리를 사용할까? 10MB!, 그렇다.  10MB는 엄청나게 크다. 이 10MB는 어떻게 계산할 수 있을까? 2048픽셀 X 1536픽셀 X 픽셀당 4바이트 


iOS에서 이미지는 어떻게 작동하나요?

 

 로드, 디코딩 및 렌더링 단계가 있다.

 로드 : 압축된 이 590킬로바이트 JPEG 파일을 메모리에 올린다.
 디코딩 : 해당 JPEG 파일을 GPU가 읽을 수 있는 형식으로 변환한다.  이제 압축을 풀어 10MB로 만들어야 한다.


왜 4바이트인가?

 이제 SRGB 형식으로 디코딩이 되어 픽셀당 4바이트이다. 

 

 이것은 일반적인 그래픽 이미지의 기본 형식이다.  픽셀당 4바이트이므로 빨간색에 1바이트, 녹색에 1바이트, 파란색에 1바이트, 알파 1바이트로 되어 있다.


UIImage와 ImageIO 비교


UIImage는 크기 조정에 비용이 많이 든다.
 - 원본 이미지를 메모리에 압축 해제한다.
 - 내부 좌표 공간 변환에 비용이 많이 든다.

 

ImageIO는 메모리를 더럽히지 않고 이미지 크기와 메타데이터 정보를 읽을 수 있다.
ImageIO는 크기가 조정된 이미지의 비용으로 이미지 크기를 조정할 수 있다.

 

ImageIO : 이미지 처리 작업을 수행하는 라이브러리로 다양한 이미지 형식을 지원하고 사용하기 쉬운 API를 제공한다.


요약


 1. 메모리는 유한하고 공유되는 리소스이다.
 2. Xcode를 이용하여 실행할 때 메모리 사용을 모니터링하자.
 3. iOS에서 이미지 형식을 선택하도록 한다.
 4. 이미지 다운 샘플링을 위해 ImageIO를 사용하자.
 5. 화면 밖에 있는 대용량 리소스는 언로드하자.
 6. 메모리 그래프를 사용하여 메모리 사용량을 더 이해하고 줄여보자.


추가 - iOS 7의 메모리 관리에 대한 개선 사항 도입 내용

  1. 압축된 메모리 : 비활성 메모리 페이지를 디스크로 이동하기 전에 압축하여 기존 스와핑이나 페이징의 필요성을 줄이는 것을 목표로 하는 "압축 메모리"라는 기능이 도입되었다. 이는 디스크 공간을 절약하고 스와핑이 성능에 미치는 영향을 줄이는 데 도움이 된다.
  2. 더욱 스마트해진 메모리 관리 : 운영 체제의 메모리 관리 알고리즘이 향상되어 비활성 메모리를 더욱 효율적으로 식별하고 처리할 수 있게 되었다. 이를 통해 iOS는 활성 프로세스의 우선순위를 지정하고 메모리 리소스를 보다 효과적으로 할당할 수 있다.
  3. 향상된 멀티태스킹 : 멀티태스킹 기능이 향상되어 앱이 시스템 리소스를 절약하면서 백그라운드에서 더 효율적으로 실행될 수 있다. 여기에는 메모리 사용량 최적화가 포함되어 백그라운드 프로세스가 활발하게 사용되지 않을 때 최소한의 메모리를 소비하도록 보장한다.

 

본문 링크 : https://mattsaedi.medium.com/deep-dive-into-ios-memory-db0b685e7905

 

Deep Dive into iOS Memory

why reduce memory? And when we want to reduce memory, really, we’re talking about reducing our memory footprint. So we’ll talk about that.

mattsaedi.medium.com

더티 이미지 관련 : https://brewagebear.github.io/fundamental-os-page-cache/

'Article > Computer Graphics' 카테고리의 다른 글

[HARDWARE] 논리회로(Logic gate, Logic Circuit)  (0) 2023.12.15
[HARDWARE] Mobile Device의 특징  (0) 2023.12.14
GPGPU  (0) 2023.12.14
[HARDWARE] CPU와 GPU의 비교  (0) 2023.12.14
[HARDWARE] GPU의 구조와 작동  (0) 2023.12.14