iOS 메모리 구조: 공간 분배

고라니·2024년 1월 2일
0

TIL

목록 보기
55/67

iOS 메모리 구조에 대해 간단하게 정리해보려고 한다.

메모리 구조

iOS는 앱이 실행되면 메모리에 특정 목적을 기준으로 영역을 나누어 공간을 할당한다.
대표적으로 4가지의 공간으로 나뉘어진다.(Code, Data, Heap, Stack)
iOS 메모리 구조의 주요 영역에 대해 살펴보자

코드 영역(Code Segment)

  • 앱의 기계어 코드를 정장하는 곳
    : 기계어는 우리가 작성한 코드를 0,1 로 컴퓨터가 이해 가능한 언어를 뜻한다.
  • 실행 가능한 명령어들이 위치하는 영역으로, 읽기 전용(Read-Only)이다.
  • 컴파일 타임에 결정된다.

데이터 영역(Data Segment)

  • 전역변수와 정적(static)변수가 저장되는 곳
  • 앱이 실행되면서 상태를 유지해야 하는 데이터들이 저장 됨
  • 프로그램이 시작되면 할당되고 프로그램이 종료되어야 해제 됨
  • 읽기 쓰기(Read-Write) 가능

힙 영역(Heap)

  • 동적으로 할당된 메모리를 저장하는 영역이다.
  • 개발자가 직접 메모리를 할당하고 해제할 수 있는 '동적 할당'이 가능한 메모리 영역이다.
  • 앱의 실행 중에 필요한 추가적인 메모리를 확보한다.
  • 개발자가 명시적으로 메모리를 할당하고 해제하는데 사용된다. 사용후 메모리를 해제하지 않으면 memory leak이 발생한다.
  • 유일하게 런타임시점에 결정되기 때문에 데이터 크기가 확실하지 않을 때 사용한다.

스택 영역(Stack)

  • 함수 호출과 관련된 로컬 변수, 매개변수, 함수 호출 정보 등을 저장
  • 함수가 호출될 때마다 새로운 스택 프레임이 추가 되고, 함수가 종료되면 해당 프레임 제거 된다.
  • FILO 구조를 가지고 있다.
  • 스택은 런타임 중 크기가 동적으로 조절된다.
  • 프로그램이 자동으로 사용하는 임시 메모리 영역이다.

임시 메모리 영역?

스택 영역을 임시 메모리 영역이라고 표현하는 이유는 뭘까?

  • 주로 스택 영역에 저장되는 데이터 함수 호출의 일시적인 목적으로 사용되기 때문
  • 각 함수 호출은 새로운 프레임을 생성하고, 함수가 종료되면 해당 프레임은 제거되고 메모리가 회수된다.
  • 프레임에는 함수의 로컬변수, 매개변수 등이 저장된다.
  • LIFO 구조를 가지고 있어 가장 최근에 추가된 데이터가 가장 먼저 제거되는 특성을 갖음
  • 스택의 데이터는 자동으로 메모리에서 해제되기 때문에, 개발자가 명시적으로 메모리를 해제할 필요가 없다. 메모리 관리 부담을 줄이고 안정성을 높여준다.

이러한 특징으로 인해 스택은 프로그램의 임시 메모리 영역으로 사용되는 것이다.

스택 오버플로우(Stack Overflow)와 힙 오버플로우(Heap Overflow)

일반적으로 코드 영역 -> 데이터 영역 -> 힙 영역 -> 스택 영역 순으로 낮은 메모리 주소를 가지고 있다. 그리고 힙과 스택영역은 사실 하나의 영역으로 서로 각각의 영역까지 침범하게 되어 오버플로우가 발생할 수 있다.

  • 스택 오버플로우(Stack Overflow)
    스택은 함수 호출에 관련된 데이터를 저장하고, 제한된 크기를 가지고 있기 때문에, 호출이 너무 깊게 이루어지거나 과도하게 중첩될 경우 스택 오버플로우가 발생할 수 있다.

  • 힙 오버플로우(Heap Overflow)
    힙 오버플로우도 스택 오버플로우처럼 할당된 데이터의 범위를 넘어서는 경우, 메모리 할당을 관리하는 데 오류가 있는경우, 할당된 메모리 영역을 벗어나 데이터를 쓰는 경우 발생 가능하다.

  • 방지하는 방법
    스택 오버플로우와 힙 오버플로우는 주로 프로그램의 버그나 잘못된 메모리 관리로 인해 발생할 수 있다. 메모리 관리를 유의하여 코드를 작성하고 메모리 할당과 해제를 신중하게 관리해야 한다.

profile
🍎 무럭무럭

0개의 댓글