[Swift] 메모리 구조

Youngwoo Lee·2021년 11월 20일
1

스위프트 문법

목록 보기
4/4
post-thumbnail
post-custom-banner

WWDC Understanding Swift Performance 영상을 보다가, 이제껏 알고 있던 Swift 메모리 구조 관련 지식이 맞는지 확인하는 바 기록해본다!!

메모리 구조

프로세스가 실행되면 OS에서는 메모리 공간을 할당해주는데, 그 공간은 모두 다 알다시피 총 4가지 (Code, Data, Heap, Stack) 으로 나누어진다. 그럼 각 공간들이 어떤 특징들을 가지고 있는지 알아보자!!


Code 영역

  • 우리가 작성한 소스 코드가 기계어 형태로 저장되어 있다
  • 컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장된다.

Data 영역

  • 전역 변수, static 변수가 저장된다
  • 프로그램 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 해제된다.
  • 실행 도중 변수 값이 변경될 수 있으니 Read-Write로 지정된다
var kane: Person = Person(name: "kane") // 전역 변수로 데이터 영역에 할당 됨
var age: Int = 27

enum Style {
	static let defaultNumber: Int = 123
}

Heap 영역

ARC에 의해서 Reference Counting이 관리되는 영역이다. Code, Data, Stack, Heap 중에서 유일하게 런타임에 결정되기 때문에 데이터 크기가 확실하지 않은 가변적인 데이터 타입들이 Heap 영역에 할당된다.

Swift에서는 Class의 인스턴스, Closure, 그리고 가변적인 String, Array 같은 타입들이 Heap영역에 저장되는 것으로 알려져 있다

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

Stack 영역

  • 함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등등이 저장되고,
  • 함수(코드 블록)가 종료되면 저장된 메모리도 해제된다
  • 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

메모리를 단순히 Stack 포인터가 가리키고 있는 곳을 단순히 줄임으로써 필요한 메모리를 할당할 수 있다. 그리고 함수가 끝나면, Stack 포인터를 줄이기 전에 있던 곳으로 증가시킴으로써 그 메모리 할당을 해제할 수 있다. 할당/해제 과정이 매우 단순하기 때문에 효율적이다

But, 스택 오버플로우가 발생할 수 있다. 스택에 너무 많은 메모리를 할당하게 되면 App이 죽게 된다. 이 문제의 원인은 무한 루프, 재귀함수 등이 있다.


Heap과 Stack의 관계

힙과 스택은 같은 메모리 공간을 사용하는데,

힙 영역은 낮은 메모리 주소부터 할당 받는 것,
스택 영역은 높은 메모리 주소부터 할당 받는 것이다

참고

개발자 소들이 - 메모리 구조(Code, Data, Heap, Stack)
naljin - Value Type이 Heap영역에 할당될 수가 있다고?

profile
iOS Developer Student
post-custom-banner

0개의 댓글