메모리 구조

문인범·2023년 11월 23일

iOS

목록 보기
1/2

보통 프로그램을 만드면 메모리 관리를 잘 해야 한다고 말합니다.
전 아직 그렇게 큰 프로그램을 만들어 본 적이 없어 잘은 모르지만 미래를 대비해 미리 알고 있어야 하지 않을까요??
메모리 구조에 대해 한번 공부해 봅시다.

우리가 프로그램을 실행하게 되면 OS에서 프로그램에 대한 메모리를 할당해줍니다.

그 공간은 크게 4가지로 구성되어 있습니다.

  • Code
  • Data
  • Heap
  • Stack

이런 식으로 구성이 되어있습니다.

하나씩 한번 살펴 봅시다.

1. 코드 영역

텍스트 영역이라고도 하며 우리가 작성한 코드들이 저장되는 공간입니다.
코드 변경을 막기 위해 Read-Only 형태로 저장이 됩니다.

2. 데이터 영역

우리가 작성한 코드에서 전역 변수, 정적(static) 변수 가 저장됩니다.
얘들은 보통 프로그램이 시작됨과 동시에 할당되며 프로그램이 종료될 때 까지 메모리에 남아있습니다.

3. 힙 영역

사용자가 사용하며 관리하는 영역입니다.
사용자가 직접 메모리를 할당, 해제 할 수 있으며, 이를 동적 할당 이라고 부릅니다.
(동적 할당: 런타임 도중에 사용할 메모리를 할당하는 것)

보통 스위프트에서는 Class 나 Closure 같은 참조 타입(reference type) 선언시 자동으로 힙에 할당됩니다.

비교적 낮은 메모리 주소 → 높은 주소로 할당이 진행됩니다.
주의할 점은, 제때 메모리를 해제하지 않을 시 메모리 누수(memory leak)가 발생할 수 있습니다.
이를 위해서 다양한 언어들은 Java의 GC(Garbage Collection) 처럼 알아서 정리를 해주는데 스위프트에서는 ARC(Automatic Reference Counting)으로 관리가 됩니다.

4. 스택 영역

함수를 호출 할 때에 발생하는 함수의 매개변수, 지역변수, 반환 값 등등이 저장되는 공간입니다.
함수가 종료되면 메모리가 해제됩니다.

이름 그대로 Stack 형식으로 FILO(First In, Last Out) 방식으로 작동되어 가장 최근에 저장된 데이터가 먼저 인출됩니다.
함수를 재귀 호출할 때에 스택 영역에 계속 메모리가 쌓이게 되는데 깊게 진행이 되면 기존에 할당된 스택 영역을 넘어서게 되어 오류가 발생하게 되는데 이게 많이 듣던 Stack Overflow 입니다.

스택 영역은 힙과 반대로 높은 주소 → 낮은 주소로 메모리가 할당됩니다.

힙은 낮은 주소 → 높은 주소 이고 스택은 높은 주소 → 낮은 주소 이므로 서로에 영역을 침범할 수가 있는데 이때 Stack Overflow, Heap Overflow가 발생하게 됩니다.

Stack vs Heap

Stack의 경우에는 CPU가 효율적으로 관리하고 있기 때문에 속도가 매우 빠르고 메모리를 직접 해제할 필요가 없습니다.

하지만 메모리 크기에 제한이 있어 메모리 할당을 무한히 하기가 힘드며 큰 데이터를 저장하는데 적합하지 않습니다.

이와 반대로 Heap은 메모리 크기에 제한이 없어 다양한 데이터를 담을 수 있습니다. 하지만 직접 메모리를 관리하여야 하기 때문에 속도면에서 스택 영역보다 느리고, 제대로 관리를 하지 않을 시 메모리 누수가 발생할 수 있습니다.

profile
월클 개발자를 향한 도전일지

0개의 댓글