CS
메모리 구조
아란정
2024. 9. 22. 15:00
코드
- CPU가 실행할 코드가 기계어 상태로 저장 > Read-Only
데이터
- static, 전역 변수 저장
스택
- 자료 구조: 프로세스의 메모리 공간 관리
힙
- 배열 등 크기가 정해지지 않은 메모리 사용 시 반드시 해제해주어야 leak이 일어나지 않는다.
[ 높은 주소 ]
[0xFFFF]
| Stack | <- 스택은 높은 주소에서 시작하여 아래 방향(낮은 주소)으로 할당됩니다.
| |
| |
| 빈 공간 | <- 힙과 스택은 이 공간을 공유하며 서로 반대 방향으로 확장됩니다.
| |
| Heap | <- 힙은 낮은 주소에서 시작하여 위 방향(높은 주소)으로 할당됩니다.
[ 낮은 주소 ]
[0x1000]
스택은 컴파일 타임에 크기가 결정되며 지역 변수, 매개 변수를 저장하는 공간이다.
스택 영역은 메모리의 높은 주소에서 낮은 주소로 할당되기 때문에 LILO 방식으로 가장 나중에 들어온 데이터가 먼저 인출된다.
- 데이터를 PUSH 저장하고 POP으로 인출한다.
스택 영역이 힙 영역을 침범하는 상황을 스택 오버플로우라고 하는데, 낮은 주소(나중 데이터)가 힙 영역을 침범되는 상황을 생각하면 후입선출이 이해된다.
[0xFFFF]
| |
| |
| |
[0x7000] <- 스택의 현재 끝 위치
| 빈 공간 |
| |
| |
[0x6000] <- 힙의 현재 끝 위치 (힙이 할당되어 증가함)
| 힙 공간 |
[0x1000] <- 힙의 시작 주소
[0xFFFF]
| |
| |
[0x6000] <- 스택이 계속 확장됨 (낮은 주소로 확장)
| 충돌 지점 |
[0x6000] <- 힙이 확장됨 (높은 주소로 확장)
| 힙 공간 |
[0x1000] <- 힙의 시작 주소
힙은 런타임에 크기가 결정되며 사용자가 직접 공간을 할당, 해제하는 영역이다.
힙은 낮은 메모리 주소에서 높은 메모리 주소로 공간을 할당하기 때문에 높은 메모리 주소가 스택을 침범하지 않도록하는 FIFO 방식을 이용한다.
- 메모리 할당은 ```malloc```, ```new``` 를 이용한다.