Skip to content

Latest commit

 

History

History
103 lines (69 loc) · 5.34 KB

RAM.md

File metadata and controls

103 lines (69 loc) · 5.34 KB

RAM

  • iOS의 메모리 구조에 대해 알아보자 👩🏻‍💻

먼저 프로그램이 실행되면 운영체제(OS)는 메모리(RAM)에 프로그램을 위한 공간을 할당해준다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 Code, Data, Heap, Stack이 있다.

스크린샷 2021-10-04 11 32 44


Code

코드(code) 영역은 실행할 프로그램의 코드 즉 프로그래머가 작성한 소스코드가 binary 형태로 저장되는 영역으로 텍스트(code) 영역이라고도 부름
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
  • 중간에 코드가 변경되지 않도록 Read-Only의 형태로 저장된다.

Data

메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
  • 프로그램 시작과 동시에 할당되고, 프로그램이 종료되면 메모리에서 해제된다.
  • 실행도중 변수 값이 바뀔 수 있으니 Read-Write로 지정된다.
struct Korean {
	// 정적(static) 변수로 데이터 영역에 할당
	static let country = "Korea"
}

// 전역변수로 데이터 영역에 할당
var name: String?
var age: Int?

Stack

스택영역은 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역
  • 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸한다.
  • 스택은 LIFO 방식으로 작동하므로 가장 늦게 저장된 데이터가 먼저 pop 된다.
  • 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
  • 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • 스택영역은 CPU에 의해 관리되고 최적화 돼서 속도가 매우 빠르다는 장점이 있다.
func add(a: Int, b: Int) -> Int {    // 매개변수 a, b 스택영역에 할당
    let result = a + b               // 지역변수 result 스택영역에 할당
    return result
}

func someFunc1(c: Int) {
  int d = 30;	
  // 매개변수 c와 지역변수 d가 스택영역에 할당
}

func someFunc2(e: Int) {
  int f = 40;	
  // 매개변수 e와 지역변수 f가 스택영역에 할당
}

Heap

메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역, 클래스 인스턴스(Class Instance), 클로저 같은 참조 타입의 값을 Heap에 저장함
  • 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • 사용하고 난 후에는 반드시 메모리 해제를 해줘야하지만 스위프트는 ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모 없어지면(참조되지 않으면) 자동으로 해제해준다.
  • 힙 영역은 스택과 반대로 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • 유일하게 런타임 시에 크기가 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.

Stack vs Heap

스크린샷 2021-10-04 11 45 52

위의 HEAP과 STACK영역은 사실 같은 공간을 공유한다.

  • HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다.
  • 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭한다.
  • Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아진다.
  • 스택영역은 CPU가 효율적으로 메모리를 구성하기에 최적화가 되어있어 속도가 빠르고 메모리를 직접 해제하지 않아도 된다.
  • 반면 힙 영역은 메모리를 개발자가 직접 관리해야하므로 메모리 누수의 위험성이 있고 할당/해제 작업으로 인해 속도가 스택에 비해 느리다.
  • 스택영역은 메모리 크기에 대한 제한이 있지만 힙 영역은 메모리 크기에 대한 제한이 없다.

Code & Data vs Stack & Heap

Code & Data

  • Code, Data 영역은 메모리 사용량에 변동이 없다. 앱이 실행되는 동안에 Xcode 상에서 작성한 코드와 변수들이 변할 일은 그냥 없다고 보면 된다. 앱이 종료될 시에 이 부분은 메모리에서 해제된다.

Stack & Heap

  • 반대로 Stack, Heap 영역은 가변적이다. 스택이나 힙 영역이 거대해져 서로의 영역을 침범할 수 있다. 이 때 스택이 힙을 침범하는 것을 스택 오버플로우(Stack Overflow), 반대의 경우를 힙 오버플로우(Heap Overflow)라고 한다. 예를들면 for 문을 무한히 돌리게 되면 스택 오버플로우가 발생하게 될 것이고, ARC 에 의해서 관리되지 못한 강한 순환 참조와 같은 문제들로 인해서 힙 오버플로우 현상이 발생할 수 있다.