Memory in Swift - 1

봄이아빠·2024년 9월 15일
1

CS Study

목록 보기
2/3
post-thumbnail
post-custom-banner

Memory

메모리는 주기억장치로 컴퓨터를 구성하는 핵심 부품 중 하나로 보통 RAM을 지칭합니다. 전원이 꺼지면 저장된 정보가 사라지는 휘발성 저장장치이며, Code, Data, Heap, Stack이라는 네 가지 영역으로 구성되어 있습니다. 이후 설명은 최대한 Swift를 기준으로 작성했습니다.

Code

code 영역은 명령어가 기계어로 변환되어 저장되는 곳입니다.
컴파일 타임에 결정되며 코드가 중간에 바뀌지 않도록 Read-Only로 저장됩니다.

Data

전역 변수, static 변수, 상수, Meta Data 등이 프로그램 시작과 종료 시 할당, 해제됩니다. code와 달리 Read-Write입니다.

static let name = "Eden" //static 변수
var colorSet: [Color] //전역 변수
let country = "Korea" //상수

Heap

Heap영역은 유일하게 런타임에 할당됩니다. 따라서 데이터 크기가 불확실할 때도 사용가능합니다.
또한 개발자가 직접 메모리를 할당/해제 하며 크기가 동적(Dynamic Memory Allocation)인 영역입니다. 따라서 개발자가 메모리를 해제하지 않을 시 memory leak이 발생합니다. 추가적인 특징은 다음과 같습니다.

  • 메모리 크기에 제한이 없다.
  • 범위가 전역이기에 모든 함수에서 엑세스할 수 있다.
  • 할당, 해제 작업 / 힙손상 / 힙경합으로 인한 속도 저하가 있다.
  • 임의의 주소값에 할당되기에 주소를 찾는 오버헤드가 크다.
  • 객체의 실제값은 heap에 저장되며 heap의 주소는 stack에 저장된다.
  • class, actor와 같은 참조타입의 데이터가 저장된다.
  • 모든 thread가 공유하기 때문에 thread-safety하지 않다.
  • 메모리가 올라갔는지 아닌지 계속해서 추적하는 reference conter 또는 ARC를 통해 메모리 관리가 필요하다.
  • 속도가 Stack에 비해 느리다.
  • low memory에서 high memory로 저장하고 FIFO구조이다.

Stack


Stack컴파일 시 할당됩니다. 때문에 Heap처럼 무한히 메모리를 할당받을 수 없습니다.
그리고 CPU에서 직접 관리와 최적화를 하기 때문에 속도가 빠릅니다.
추가적인 특징은 다음과 같습니다.

  • 리턴값, 함수 내에서 생성되는 지역변수, 전달되는 매개변수 등이 저장된다.
  • 함수가 종료되는 즉시 메모리 할당이 해제된다.
  • struct, enum등과 같은 값 타입의 데이터가 저장된다.
  • high memory에서 low memory로 저장하고 LIFO구조이다.
  • 선형의 단순한 구조이면 시간복잡도가 O(1)이다.
  • thread별로 독립된 스택 영역을 받기 때문에 thread-safety하다.

Exception

  • 할당되는 값의 크기가 크다면 Heap에 할당될 수 있다.
  • 값 타입과 참조 타입이 혼합되어있다면 보통 Heap에 할당된다.
  • 컴파일 시점에서 크기를 결정할 수 없는 경우 Heap에 할당된다. 예를 들어, structProtocol을 준수하고 있거나 generic을 가진 경우.

Heap vs Stack

struct Point {
var x, y: Doublelet point1 = Point(x: 0, y: 1)
var point2 = point1
point2.x = 5

class Point { var x, y: Double
init(x: Double,
self.x = x
self. y
=
y: Double) {let point1 = Point(x: 0, y: 0)
let point = point1
point2.x = 5

여기서 refCount는 활성참조를 나타내며 이것이 0이 된다면 스위프트가 해당 영역을 재활용하기 시작합니다.

추가적으로 앞서 언급했듯 Heap과 Stack은 모두 같은 메모리에 있으며 같은 영역을 나누어 가집니다. 때문에 한쪽이 과도하게 공간을 차지하려 한다면 overflow가 발생하게 됩니다.

참조

https://www.sngular.com/insights/281/memory-management-in-swift
https://baegteun.tistory.com/9
https://varun04tomar.medium.com/open-nuts-and-bolts-of-memory-management-in-ios-swift-part-1-4927b60fccf8
https://medium.com/@ryabenko.ana/stack-vs-heap-in-swift-557c939d8cfc
https://babbab2.tistory.com/25

post-custom-banner

0개의 댓글