원문은 하기 링크에서 확인가능합니다 (블로그 이전)
[iOS] 메모리 구조 (Stack, Heap, Data, Code)
iOS에서의 메모리 구조에 대해 알아보기 (Stack Heap을 위주로)
velog.io
Memory in iOS
사용자가 프로그램 실행을 요청하게 되며, OS는 이 프로그램 정보를 읽어 메모리에 Load 하게 된다. 이렇게 HDD에 로드된 프로그램 코드는 CPU에 의해서 실행되고 메모리를 관리하게 된다.
메모리는 크게 4가지의 영역으로 나뉘게 된다.
code 영역
소스코드
가 기계어 형태로 저장된다.- CPU가 여기에 저장된 명령어를 하나씩 가져가 처리하게 된다.
- 프로그램 시작~종료까지 메모리에 있게 된다.
data 영역
global변수
,static변수
가 저장된다.- 프로그램 시작과 동시에 할당, 종료되면 메모리를 해제하게 된다.
- 조금 더 자세히 알아보면, 일반적인 메모리의 데이터 영역은 data영역과 bss영역으로 나뉘고 각기 다른 데이터가 저장된다.
- data 영역 : 초기화 된 데이터
- BSS (Block Stated Symbol) 영역 : 초기화 되지 않은 데이터
heap 영역
- heap 영역은
동적할당영역
런타임
에 크기가 결정 된다.
stack 영역
- 지역변수, 매개변수, 포인터 등이 저장됨
컴파일타임
에 크기 결정
heap 과 stack영역은 매우 중요하고 앞으로 swift 메모리 성능에 있어 계속 접하게 되는 부분이니 아래에서 조금 더 자세하게 다뤄 보겠다.
Tip ) 컴파일 타임 vs 런타임
- 컴파일타임(Compile Time): 작성한 소스코드를 기계어로 변환하는 과정(컴파일)하는 타임
- 런타임(Run Time): 컴파일이 끝난 프로그램이 사용자가 실행하여 동작하는 타임
Heap & Stack
Heap
heap 영역은 동적할당영역
런타임에 크기가 결정 된다.
아래쪽(낮은주소 -> 높은주소) 방향으로 메모리 할당
특징
- code, data, stack 중 유일하게 런타임에 결정되기 때문에
데이터의 크기가 확실하지 않을때 사용
- FIFO : 가장 먼저 생성된(할당된) 데이터가 가장 먼저 해제된다
- 프로그래머가 직접 공간을 할당, 해제
- 해제를 제대로 안하면 memory leak이 발생함
- iOS 에서는
- 할당 : 참조타입의 값 (클래스의 인스턴스, 클로저... ) 은 힙에 자동 할당된다
- 해제 : ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모없어지면 자동으로 해제함.
장점
- 메모리 크기에 대한 제한이 없다.
- 본질적인 범위가
전역
이다 -> 프로그램의 모든 함수에서 access 가능
단점 : 속도저하
- 할당/해제 작업으로 인한 속도저하
- 힙손상 (이중해제, 해제 후 사용등) 작업으로 인한 속도저하
- 힙경합 (두개이상 쓰레드가 동시에 접근하려 할때 Lock 걸림) 으로 인한 속도 저하
- 메모리를 직접 관리해야함
Stack
지역변수, 매개변수, 포인터 등이 저장됨컴파일타임
에 크기 결정
위쪽 (높은주소 -> 낮은주소) 방향으로 메모리 할당
특징
- 스택은 프로그램이 자동으로 사용하는 임시 메모리 영역이다
- CPU에 의해 관리되고 최적화 되서 속도가 매우 빠르다
- 함수 호출 시, 함수의 지역변수, 매개변수, 리턴값 등이 저장되고 함수가 종료되면 저장된 메모리를 해제한다.
- 컴파일 타임에 크키가 결정되기 때문에 무한히 할당할 수 없다
LIFO
: 먼저 생성된 변수가 가장 나중에 해제 됨
장점
- CPU가 스택메모리를 효율적으로 관리하여 속도가 매우 빠르다
- 메모리를 직접 해제 안해도 된다
단점
- 메모리 크기에 대한 제한 있음
지역변수
만 access 가능
Heap, Stack 그리고 Overflow ?
heap과 stack은 같은 메모리 영역(free-store라고 명시된 부분)을 공유하게 된다.
heap은 낮은주소 -> 높은주소 방향으로 메모리 할당하고
stack은 높은주소 -> 낮은주소 방향으로 메모리 할당하게 된다.
이러다 보면, heap이 stack의 영역을 침해 (heap overflow
) 하거나 stack이 heap의 영역을 침해 (stack overflow
) 하게 된다.
overflow 는 사전적으로 넘쳐흐른다는 뜻이다.
언제 Heap을 언제 Stack을 써야하는가?
iOS 에서는 인스턴스, 클로저 등을 자동으로 heap에 할당해주기 때문에 걱정할 필요는 없지만 혹시 직접 할당 해야하는 경우가 있으면 아래를 참고하자
Heap
- 메모리크기에 대한 제한이 없기 때문에 데이터의 크기를 모르거나 스택에 저장하기에 큰 데이터를 사용하는 경우
Stack
- 힙을 할당하는 경우 이외의 경우에
Reference
https://babbab2.tistory.com/25
https://all-young.tistory.com/17
https://gomsik.tistory.com/63
https://developpaper.com/ios-memory-overview/
'이전 블로그 > iOS Dev' 카테고리의 다른 글
🚀 iOS 네트워킹 정복하기 (2) URLSession (1) | 2022.11.02 |
---|---|
🚀 iOS 네트워킹 정복하기 (1) Kick Off (0) | 2022.11.02 |
[Swift] Struct와 Class (feat. 값타입과 참조타입) (0) | 2022.11.02 |
[SwiftUI] SwiftUI의 Data Flow (0) | 2022.11.02 |
[SwiftUI] Modifier와 적용순서 (0) | 2022.11.02 |