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``` 를 이용한다.