메모리의 구조
Stack
- 스택은 함수에 대한 정보를 저장한다.
- 지역 변수, 매개 변수, 리턴 값, 호출 함수 정보 등
- 함수 호출 시 스택에 해당 함수에 해당하는 공간 (Stack Frame)이 생기고, 함수 실행이 끝나면 사라진다.
- 컴파일 단계에서 생성과 해제를 알 수 있는 값 타입이 저장된다.
- 컴파일 타임에 크기가 결정된다.
- 참조 타입 중에서도 크기가 고정되어 있거나, 언제 지워야할 지 컴파일러가 미리 예측 가능한 경우 가급적 stack을 사용해 성능을 향상시킨다.
- Heap 에 비해 접근 속도가 빠르다.
힙 영역과 스택 영역이 다른 방향을 가지는 이유
스택은 항상 커널의 반대 방향으로 자라기 때문에 커널을 만나지 않는다.
스택이 아무리 커져도 접근 불가 영역인 커널을 건드리지 않는다.
힙 영역은 스택과 달리 새로운 데이터가 추가될수록 더 큰 메모리 주소를 할당받는다.
스택 영역과 힙 영역이 공유 라이브러리 영역을 가운데 두고 서로 마주보는 형태를 가지기 때문에 메모리 공간을 효율적으로 활용할 수 있다.
Memory Mapping Segment
- 공유 라이브러리 영역이라고도 불리는 곳으로, 동적 라이브러리와 공유 라이브러리의 코드가 적재되는 곳입니다.
- 공유 라이브러리는 응용 프로그램이 시작되는 순간에 메모리에 적재됩니다.
- 동적 라이브러리는 응용 프로그램이 해당 라이브러리의 내용을 필요로 할 때 적재하게 됩니다.
- 런타임에 링크/로드 됩니다.
Heap
- 힙 영역은 프로그래머가 동적으로 할당한 데이터들이 저장되는 공간이다.
- Swift에서는 직접 할당하지 않는다.
- 해제 또한 참조되지 않는 메모리를 ARC가 해제한다.
- 참조 타입의 값이 저장되는 공간이다.
- ex) Class, Closure
- 사용 후 메모리 해제를 하지 않으면 메모리 누수 (Memory Leak)이 발생한다.
- 유일하게 크기가 런타임에 결정된다.
- Stack에 비해 접근 속도가 느리다.
BSS Segment
BSS segment는 초기화 되지 않은 전역 변수 또는 Static 변수를 저장한다.
segment가 BSS / Data로 분리되는 이유
초기화된 데이터는 초기화되지 않은 변수와 다르게, 해당 값을 프로그램에 저장하고 있어야 한다.
BSS 영역은 초기화되지 않은 데이터가 저장되기 때문에 프로그램이 실행될 때 영역만 차지하고 그 값을 프로그램에 저장하고 있을 필요가 없다.
BSS 영역 변수들이 많아져도 프로그램의 실행 코드 사이즈를 늘리지 않는다.
그렇다면 BSS에 있는 전역 변수에 값을 넣어주면 Data로 이동하나..?
Data Segment
- data segment는 초기화된 전역 변수 또는 Static 변수를 저장한다.
- 프로그램 시작 시 할당되고, 종료 시 해제된다.
Code(Text) Segment
- code segment은 프로그램을 실행하기 위한 코드를 기계어 형태로 저장한다.
ex) if{...} -> ASM -> 기계어 -> code 영역에 저장
- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가 처리한다.
- 컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장된다.
'부스트캠프' 카테고리의 다른 글
Static Dispatch & Dynamic Dispatch (0) | 2024.07.22 |
---|---|
네이버 부스트캠프 웹・모바일 9기 챌린지 과정 1주차 회고 (0) | 2024.07.19 |
토크나이저, 렉서, 파서 (Tokenizer, Lexer, Parser) (0) | 2024.07.17 |
M1 맥에 우분투 가상환경 설치하고 swift 설치하기! (0) | 2024.07.16 |
Git 학습하기 (0) | 2024.07.15 |