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

a.very·2022년 5월 22일
3

iOS Development

목록 보기
1/2

Memory in iOS

사용자가 프로그램 실행을 요청하게 되며, OS는 이 프로그램 정보를 읽어 메모리에 Load 하게 된다. 이렇게 HDD에 로드된 프로그램 코드는 CPU에 의해서 실행되고 메모리를 관리하게 된다.

메모리는 크게 4가지의 영역으로 나뉘게 된다.

code 영역

  • 소스코드가 기계어 형태로 저장된다.
  • CPU가 여기에 저장된 명령어를 하나씩 가져가 처리하게 된다.
  • 프로그램 시작~종료까지 메모리에 있게 된다.

data 영역

  • global변수, static변수가 저장된다.

  • 프로그램 시작과 동시에 할당, 종료되면 메모리를 해제하게 된다.

  • 조금 더 자세히 알아보면, 일반적인 메모리의 데이터 영역은 data영역과 bss영역으로 나뉘고 각기 다른 데이터가 저장된다.
    - data 영역 : 초기화 된 데이터
    - BSS (Block Stated Symbol) 영역 : 초기화 되지 않은 데이터

heap 영역

  • heap 영역은 동적할당영역
  • 런타임에 크기가 결정 된다.

stack 영역

  • 지역변수, 매개변수, 포인터 등이 저장됨
  • 컴파일타임에 크기 결정

heap 과 stack영역은 매우 중요하고 앞으로 swift 메모리 성능에 있어 계속 접하게 되는 부분이니 아래에서 조금 더 자세하게 다뤄 보겠다.

Tip ) 컴파일 타임 vs 런타임

  • 컴파일타임(Compile Time): 작성한 소스코드를 기계어로 변환하는 과정(컴파일)하는 타임
  • 런타임(Run Time): 컴파일이 끝난 프로그램이 사용자가 실행하여 동작하는 타임

Heap & Stack

Heap

  • heap 영역은 동적할당영역
  • 런타임에 크기가 결정 된다.
  • 아래쪽(낮은주소 -> 높은주소) 방향으로 메모리 할당

특징

  • code, data, stack 중 유일하게 런타임에 결정되기 때문에 데이터의 크기가 확실하지 않을때 사용
  • FIFO : 가장 먼저 생성된(할당된) 데이터가 가장 먼저 해제된다
  • 프로그래머가 직접 공간을 할당, 해제
    - 해제를 제대로 안하면 memory leak이 발생함
  • iOS 에서는
    • 할당 : 참조타입의 값 (클래스의 인스턴스, 클로저... ) 은 힙에 자동 할당된다
    • 해제 : ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모없어지면 자동으로 해제함.

장점

  • 메모리 크기에 대한 제한이 없다.
  • 본질적인 범위가 전역이다 -> 프로그램의 모든 함수에서 access 가능

단점 : 속도저하

  • 할당/해제 작업으로 인한 속도저하
  • 힙손상 (이중해제, 해제 후 사용등) 작업으로 인한 속도저하
  • 힙경합 (두개이상 쓰레드가 동시에 접근하려 할때 Lock 걸림) 으로 인한 속도 저하
  • 메모리를 직접 관리해야함

Stack

  • 지역변수, 매개변수, 포인터 등이 저장됨
  • 컴파일타임에 크기 결정
  • 위쪽 (높은주소 -> 낮은주소) 방향으로 메모리 할당

특징

  • 스택은 프로그램이 자동으로 사용하는 임시 메모리 영역이다
  • CPU에 의해 관리되고 최적화 되서 속도가 매우 빠르다
  • 함수 호출 시, 함수의 지역변수, 매개변수, 리턴값 등이 저장되고 함수가 종료되면 저장된 메모리를 해제한다.
  • 컴파일 타임에 크키가 결정되기 때문에 무한히 할당할 수 없다
  • LIFO : 먼저 생성된 변수가 가장 나중에 해제 됨

장점

  • CPU가 스택메모리를 효율적으로 관리하여 속도가 매우 빠르다
  • 메모리를 직접 해제 안해도 된다

단점

  • 메모리 크기에 대한 제한 있음
  • 지역변수만 access 가능

Heap, Stack 그리고 Overflow ?

heap과 stack은 같은 메모리 영역(free-store라고 명시된 부분)을 공유하게 된다.

heap은 낮은주소 -> 높은주소 방향으로 메모리 할당하고
stack은 높은주소 -> 낮은주소 방향으로 메모리 할당하게 된다.

이러다 보면, heap이 stack의 영역을 침해 (heap overflow) 하거나 stack이 heap의 영역을 침해 (stack overflow) 하게 된다.

overflow 는 사전적으로 넘쳐흐른다는 뜻이다.

언제 Heap을 언제 Stack을 써야하는가?

iOS 에서는 인스턴스, 클로저 등을 자동으로 heap에 할당해주기 때문에 걱정할 필요는 없지만 혹시 직접 할당 해야하는 경우가 있으면 아래를 참고하자

Heap

  • 메모리크기에 대한 제한이 없기 때문에 데이터의 크기를 모르거나 스택에 저장하기에 큰 데이터를 사용하는 경우

Stack

  • 힙을 할당하는 경우 이외의 경우에

Reference

https://babbab2.tistory.com/25
https://all-young.tistory.com/17
https://gomsik.tistory.com/63
https://developpaper.com/ios-memory-overview/

profile
🚚chanhee-jeong.tistory.com 🚀 github.com/chaneeii/iOS-Study-Log

0개의 댓글