안녕하세요 🐶
빈 지식 채우기의 비니🙋🏻♂️ 입니다.
오늘은 메모리구조에 대해 알아보는 시간을 가지겠습니다.
1. 개요
운영체제(OS)는 메모리에 공간을 할당을 해줍니다. 대표적으로 아래와 같이 4가지로 나뉘어져 있습니다.
오늘은 위의 총 4가지 메모리 영역에 대해 각각이 어떤 역할을 하는지 알아보겠습니다. :)
2. 메모리 구조
2-1. 코드(Code) 영역
1. 우리가 작성한 소스 코드가 기계어 형태로 저장된다.
2. 컴파일 타임에 결정되고, Read-Only의 형태로 저장된다.
기계어라고 하면은 컴퓨터가 이해할 수 있는 언어로 0, 1 로 이루어진 이진법 언어입니다.
2-2. 데이터(Data) 영역
1. 전역변수, Static 변수가 저장된다.
2. 프로그램 시작과 동시에 할당되고, 프로그램이 종료 되어야 메모리에서 해제된다.
3. Read-Write의 형태로 저장된다.
실제 소스를 통해 확인해보겠습니다.
struct Person {
static let home = "Seoul" // (1)
}
// (2)
var name: String?
var age: String?
- Static 변수(상수)로 데이터 영역에 할당됩니다.
- 전역 변수로 데이터 영역에 할당됩니다.
2-3. 힙(Heap) 영역
1. 개발자가 직접 할당/해제하는 메모리 영역이다.
2. 개발자는 malloc, calloc 을 통해 메모리 할당 => 동적할당
3. 직접 할당 해제가 필요하기 때문에 적절한 시기에 해제를 하지 않으면 메모리 누수 발생한다.
4. 런타임시 할당되고, 데이터의 크기가 확실하지 않을 때 사용한다.
우리는 언제 어디서나 힙 영역에 메모리 할당을 해주고 있습니다.
바로 클래스, 클로저 같은 참조 타입의 값! => 이러한 값들은 자동으로 힙 영역에 할당됩니다.
위 3번의 설명대로 개발자는 직접 메모리 해제를 해주지 않으면 메모리 누수가 발생합니다.
다만 우리는 release 나 free를 사용해본 적이 없을 것이라 생각합니다.
왜냐?! :-)
스위프트에서는 ARC를 통해 힙 영역에 할당된 메모리가 더 이상 참조를 하지 않으면 자동으로 해제를 해주기 때문입니다.
ARC 관련 포스팅은 참고해주세요
여튼 힙 영역에 대해 큰 특징을 확인하였습니다. 그에 따른 장단점은 아래와 같습니다.
장점 | ∙ 메모리 크기에 대한 제한이 없습니다. ∙ 프로그램 모든 함수에서 엑세스가 가능합니다. |
단점 | ∙ 개발자가 직접 할당 해제를 하기 때문에 속도면에서 저하가 일어날 수 있습니다. ∙ 메모리를 직접 관리를 해줘야 합니다. ( 메모리 누수 발생 위험 ) |
확실한 단점은... 네 그렇습니다 바로 속도입니다
2-4. 스택(Stack) 영역
1. 함수 호출 시 지역변수, 매개변수, 반환 값들이 스택 영역에 저장이 된다.
2. 함수가 종료되면 저장된 메모리도 해제가 된다.
3. 컴파일 타임에 결정이 된다.
스택은 프로그램이 자동으로 할당 해제을 해주는 임시 메모리 영역 같은 느낌입니다.
func getName(age: String) -> String { // (1)
let name = self.name // (2)
print("내 이름은 \(name)이고, 나이는 \(age)입니다.")
return name
}
- 매개변수 및 파라미터는 스택 영역에 할당됩니다.
- 지역 변수로 스택 영역에 할당됩니다.
- getName 함수가 끝나는 시점에 스택에 저장된 메모리는 자동 메모리 해제가 됩니다.
힙과 마찬가지로 스택 영역 또한 장단점이 존재합니다.
장점 | ∙ CPU가 스택 메모리 효율을 구성하기 때문에 속도가 매우 빠릅니다. ∙ 메모리를 직접 해제를 안해줘도 됩니다. |
단점 | ∙ 메모리 크기 제한이 있습니다. ∙ 지역 변수만 엑세스 가능합니다. |
스택은 메모리 크기 제한이 있기 때문에 무한정 할당이 불가능합니다.
3. Stack vs Heap
힙 ( Heap) | ∙ 데이터의 크기를 모르는 경우 ∙ 스택에 저장하기엔 큰 데이터의 경우 ∙ 힙 또한 자신의 영역 외로 확장하면 Heap Over Flow 발생 |
스택 ( Stack ) | ∙ 힙에 저장되어야 할 이외의 경우 ∙ 빠른 속도를 원하는 경우 ∙ 스택에 너무 많은 메모리 할당하면 Stack Over Flow 발생 |
4. 정리
오늘은 4가지의 메모리 영역에 대해 알아보았습니다.
우리가 개발을 하다가 내용을 몰라도(?) 자연스럽게 다양한 메모리 영역을 쓰고 있다는 것을 알 수 있는데요.
나 진짜 개념 몰랐음...:(
오늘 포스팅의 가장 중요한 것은 힙(Heap) 과 스택(Stack) 입니다.
적절한 메모리 영역에 할당해야 프로그램 성능도 좋아지니깐요 ㅎㅎ
이상으로 메모리 구조 ( Code, Data, Stack, Heap ) 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~
참고
'iOS 🖥️ > Common' 카테고리의 다른 글
[ iOS ] GCD 4편 - GCD ( Grand Central Dispatch ) (0) | 2023.01.19 |
---|---|
[ iOS ] GCD 3편 - Serial vs Concurrent (0) | 2023.01.18 |
[ iOS ] GCD 2편 - Sync vs Async (2) | 2023.01.12 |
[ iOS ] GCD 1편 - 프로세스(Process) vs 쓰레드(Thread) (0) | 2023.01.11 |