📱 Mobile/🌠 iOS

[iOS] iOS 메모리 구조

exception_log 2021. 5. 11. 09:42

<!-- iOS 개발자로 성장하고 있는 제 Github 스터디 레포지토리로 놀러오세요 -->

 

b1ctory/Exception-Study

Contribute to b1ctory/Exception-Study development by creating an account on GitHub.

github.com

iOS 메모리 구조 (Code, Data, Stack, Heap)

  1. 메모리 구조프로그램이 실행되면 운영체제는 메모리(RAM)에 프로그램을 위한 공간을 할당해 준다.
    1. 코드영역
      • 작성한 소스코드가 기계어 형태로 저장된다.
      • 컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only의 형태로 저장된다.
    2. 데이터 영역
      • 전역 변수, static 변수가 저장된다.
      • 프로그램 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 해제된다.
      • 실행 도중 변수 값이 변경될 수 있으니 Read-Write로 저장된다.
    3. 힙 영역
      • 프로그래머가 할당/해제하는 메모리 영역
      • 프로그래머는 malloc, calloc으로 힙에 메모리를 할당할 수 있으며, 이를 '동적 할당'이라고 부른다.
      • 사용한 후에는 메모리 해제를 반드시 해주어야 한다. 그렇지 않으면 메모리 누수가 발생한다. (Memory leak)
      • Code, Data, Stack 중 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.
      • Class instance, Closure 같은 "참조 타입"의 값들은 모두 힙에 자동 할당 된다.
        • 그러나 우리는 위의 값들을 사용하고도 메모리 해제를 해준 적은 없다.
        • 왜?
        • Swift의 ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모없어지면 (참조되지 않으면) 자동으로 해제해주기 때문이다.
      • 장점 :
        • 메모리 크기에 대한 제한이 없다.
        • 본질적 범위가 전역이기 때문에 프로그램의 모든 함수에서 엑세스 가능하다.
      • 단점 :
        • 할당, 해제 작업으로 인한 속도 저하
        • 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
        • 힙 경합 (이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
        • 메모리를 직접 관리해야 함 (해제해주지 않으면 메모리 누수 발생)
    4. 스택 영역
      • 함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등이 저장되고 함수가 종료되면 저장된 메모리도 해제된다. 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.
      • 스택은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
      • 스택 영역은 Last in First out 데이터 구조이고 CPU에 의해 관리되고 최적화되어 속도가 매우 빠르다.
      • 직접 메모리를 해제해 줄 필요가 없다.
      • 메모리 크기에 대한 제한이 있다. / 지역 변수만 엑세스할 수 있다.
  2. 그리고 그 공간은 총 4가지 코드영역, 데이터 영역, 힙 영역, 스택 영역으로 구분할 수 있다.
  3. 힙 VS 스택
    1. 언제 힙을 쓰고 언제 스택을 쓰나?
      1. 스택은 메모리가 한정되어 있기 때문에 데이터의 크기를 모르거나 스택을 저장하기에는 큰 데이터의 경우에는 힙에 할당하고 그 외엔 스택에 할당하면 된다.
      2. 스택에 너무 많은 메모리를 할당하게 되면 Stack overflow가 발생한다.
        • 스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과한 경우
    2. 힙과 스택의 메모리 관계
      1. 힙과 스택은 같은 메모리 영역을 공유한다.
      2. 힙은 낮은 메모리 주소부터 할당받고, 스택 영역은 높은 메모리 주소부터 할당받는다.
      3. 따라서 힙 또한 자신의 영역 외로 확장하려다 보면 힙 오버 플로우가 발생한다.

 

Reference : https://babbab2.tistory.com/25

함께 읽어보면 좋을만한 자료 : https://babbab2.tistory.com/26?category=831129

반응형