iOS) 메모리 구조

유재우·2023년 2월 2일
0

iOS Developer의 길!

목록 보기
7/15

iOS 면접 질문에서 빠지지 않는 ARC에 대해 알아보기 전 기초적인 개념을 먼저 공부하자

메모리 구조

프로그램이 실행되면 운영체제(OS)는 메모리(RAM)에 이 프로그램을 위한 공간을 할당
그 공간은 Code, Data, Heap, Stack으로 총 4가지로 나누어져 있다.


코드 영역(Code)

사용자가 작성한 소스 코드가 기계어 형태로 저장

컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장

기계어란?

컴퓨터가 읽을 수 있는 가장 밑단의 언어로 0,1로만 이루어진 언어

데이터 영역(Data)

전역 변수, static 변수가 저장

프로그램 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 해제된다.

실행 도중 변수 값이 변경 될 수 있으니 Read-Write로 지정

전역 변수란?

함수 외부에서 선언되어 어디에서나 접근 가능하고 프로그램이 종료되어야만 메모리에서 사라지는 변수

staitc 변수란?

전역 변수와 지역변수의 특징을 모두 가진 변수
  • 프로그램 실행 시 할당되고, 프로그램 종료시 파괴되는 변수
  • 초기화는 최초 실행 시 단 한번만 수행
  • 전역으로 선언하면 소스파일 내의 모든 함수에서 사용이 가능
  • 함수 내부에 선언하면 함수 내에서만 사용이 가능

힙 영역(Heap)

프로그래머가 할당/해제 하는 메모리 영역
  • 프로그래머는 malloc, calloc으로 힙에 메모리를 할당할 수 있으며, 이를 '동적 할당' 이라 한다.
  • 사용하고 난 후엔 반드시 메모리 해제를 해야한다.
    (메모리 해제를 안했을 시에 memory leak이 발생)
  • Code, Data, Stack 중 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용

swift 에선 클래스 인스턴스, 클로저 같은 참조 타입의 값을 통해 힙에 할당
하지만 스위프트를 사용하면서 메모리 해제하는 작업을 한 기억이 없다.

그 이유는 ARC를 통해 힙에 할당된 메모리가 더이상 쓸모없어지면(참조되지 않으면) 자동으로 해제해준다.

장점

  • 메모리 크기에 대한 제한이 없다.
  • 본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 할 수 있다.

단점

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

스택 영역(Stack)

함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등이 저장되고, 함수가 종료되면 저장된 메모리도 해제
  • 컴파일에 결정되기 때문에 무한히 할당 할 수 없다.
  • 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
  • LIFO(Last In First Out) 데이터 구조

장점

  • CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 매우 빠름
  • 메모리를 직접 해제를 해주지 않아도 됨

단점

  • 메모리 크기에 대한 제한이 있음
  • 지역 변수만 액세스 가능

힙 vs 스택

힙이 사용될 때

데이터를 크기를 모르거나, 스택에 저장하기엔 큰 데이터의 경우

스택이 사용 될 때

위의 내용 외에 전부 스택으로 할당

(인스턴스, 클로저 등 자동으로 힙에 할당되는 것 외에 직접 할당할 경우)

스택에 너무 많은 메모리를 할당 했을 경우

스택 오버 플로우가 발생
우리에겐 문제를 해결해주는 사이트로 더욱 익숙하다
이 스택 오버 플로우는 스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과한 경우를 뜻한다.
iOS에서 스택 오버 플로우가 발생하면 어플이 죽어버린다.


힙과 스택의 메모리 관계


사실 힙과 스택은 위의 그림과 같이 같은 메모리 영역을 공유한다.

같은 메모리 공간이지만 힙 영역은 낮은 메모리 주소부토 할당 받고,
스택 영역은 높은 메모리 주소부터 할당

힙 또한 자신의 영역 외로 확장하려다 보면, 힙 오버 플로우가 발생

참고한 블로그 링크

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글