iOS)메모리 구조의 이해

김재우·2025년 3월 17일

프로세스

  • 실행중인 프로그램의 인스턴스를 의미합니다.
  • iOS에서는 실행되는 앱을 프로세스 라고 이해.
  • 앱이 실행되면, 운영 체제는 앱의 실행을 관리하기 위해서 프로세스를 생성합니
    다.
  • 프로세스는 자신만의 메모리 영역을 할당받고, 앱의 실행상태를 관리합니다.

메모리 구조

  • 앱을 실행하면 운영체제(iOS)가 메모리에 영역을 설정해 줍니다
  • 메모리 영역에는 크게 4가지 영역이 존재하며 Code, Data, Heap, Stack 영역이 존재합니다

1. 스택(Stack)

  • 역할:

    • 함수 호출과 관련된 지역 변수, 매개변수, 반환 주소 등을 저장합니다.
    • LIFO(Last-In-First-Out) 구조로 동작합니다.
  • 특징:

    • 메모리 할당과 해제가 빠릅니다.
    • 크기가 고정되어 있으며, 런타임에 동적으로 크기를 조절할 수 없습니다.
    • 스택 오버플로우(Stack Overflow)가 발생할 수 있습니다.
  • 예시:

func example() {
    let localVariable = 10 // 지역 변수는 스택에 저장됨
    print(localVariable)
}

2. 힙(Heap)

  • 역할:

    • 동적으로 할당된 메모리를 관리합니다.
    • 클래스 인스턴스, 배열, 딕셔너리 등 참조 타입(Reference Type)이 힙이 저장됩니다.
  • 특징:

    • 메모리 할당과 해제가 스택보다 느립니다.
    • 런타임에 동적으로 크기를 조절할 수 있습니다.
    • 메모리 누수(Memory Leak)가 발생할 수 있습니다.
  • 예시:

class MyClass {
    var value: Int
    init(value: Int) {
        self.value = value
    }
}

let object = MyClass(value: 10) // 객체는 힙에 저장됨

3. 데이터 영역(Data segment)

  • 역할:

    • 전역 변수(Global Variables), 정적 변수(Static Variables), 상수(Constants) 등을 저장합니다.
  • 구성:

    • BSS 영역: 초기화되지 않은 전역 변수가 저장됩니다.
    • Data 영역: 초기화된 전역 변수와 정적변수가 저장됩니다.
  • 특징:

    • 프로그램 시작 시 할당되며, 종료 시, 해제됩니다.
    • 런타임 중 크기가 변하지 않습니다

4. 코드 영역(Text Segment)

  • 역할:

    • 프로그램의 실행 코드(기계어)가 저장됩니다.
  • 특징:

    • 읽기 전용(Read-Only)이며, 수정할 수 없습니다.
    • 프로그램 시작 시 할당되며, 종료 시 해제됩니다.

고찰

  1. 프로세스와 메모리 구조의 관계:

    • 프로세스는 운영체제가 관리하는 실행 단위이며, 각 프로세스는 독립된 메모리 공간을 가집니다.
    • iOS에서는 앱이 실행될 때마다 새로운 프로세스가 생성되며, 이 프로세스는 Code, Data, Heap, Stack 영역을 할당받습니다.
  2. 스택과 힙의 차이:

    • 스택은 함수 호출과 관련된 데이터를 저장하며, 빠르지만 크기가 제한적입니다.
    • 힙은 동적으로 할당된 데이터를 저장하며, 크기가 유연하지만 관리가 복잡하고 메모리 누수의 위험이 있습니다.
  3. 메모리 관리의 중요성:

    • iOS는 ARC를 통해 메모리를 자동으로 관리하지만, 개발자는 여전히 순환 참조와 메모리 누수를 주의해야 합니다.
    • 특히, 힙 영역에서 발생하는 메모리 누수는 앱의 성능을 저하시키고, 심각한 경우 앱이 종료될 수 있습니다.
  4. 메모리 최적화:

    • 불필요한 메모리 사용을 줄이고, 큰 데이터는 필요할 때만 로드하는 것이 중요합니다.
    • 이미지 리소스는 적절한 크기로 리사이징하여 사용하고, 백그라운드 상태에서 불필요한 메모리를 해제하는 것이 좋습니다.
  5. 가상 메모리 시스템:

    • iOS는 가상 메모리 시스템을 사용하여 물리적 메모리를 효율적으로 관리합니다.
    • 메모리 압축 기술을 통해 메모리 사용을 최적화하며, 메모리 경고를 통해 앱이 메모리를 정리하도록 유도합니다.

결론

iOS의 메모리 구조와 프로세스 관리 방식을 이해하면, 더 효율적이고 안정적인 앱을 개발할 수 있습니다. 특히, 스택과 힙의 차이, 메모리 누수의 원인 및 해결 방법을 명확히 이해하는 것이 중요합니다. 이를 통해 메모리 사용을 최적화하고, 사용자에게 더 나은 경험을 제공할 수 있습니다.


참고

https://developer.apple.com/kr/videos/play/wwdc2024/10173/

profile
iOS 스타터 6기

0개의 댓글