런타임 메모리구조
+------------------------+ ← 높은 주소 (큰 숫자)
| 스택(Stack) | ← 아래로 자람 (주소값 작아짐)
| 함수 호출, 지역 변수 |
+------------------------+
| 빈 공간 (여유분) |
| (heap과 stack 사이 여유) |
+------------------------+
| 힙(Heap) | ← 위로 자람 (주소값 커짐)
| malloc(), new 등으로 |
| 동적으로 할당한 메모리 |
+------------------------+
| BSS (초기화X 전역변수)|
+------------------------+
| 데이터(Data) (전역변수)|
+------------------------+
| 코드(Code) 영역 | ← 낮은 주소 (작은 숫자)
| 함수, 명령어 등이 저장 |
+------------------------+
7장에서 배웠던 목적파일안에 있는 .data, .bss섹션과 런타임 메모리 data, bss영역은 연결된다
운영체제가 프로그램을 실행시키면 실행파일을 런타임 메모리 구조에 맞게 배치
[ 코드 영역 ] ← 목적파일의 `.text` 섹션 [ 데이터 영역 ] ← 목적파일의 `.data` 섹션 [ BSS 영역 ] ← 목적파일의 `.bss` 섹션 [ 힙 (위로 자람) ] [ 스택 (아래로 자람) ]
추가적인 가상메모리를 런타임에 획득할 필요가 있을때 동적 메모리 할당기( dynamic memory allocator )를 사용
동적메모리 할당기는 힙(프로세스의 가상 메모리 영역)을 관리
힙: 프로그램이 실행될때 거기서 "필요한 만큼" 메모리를 꺼내서 쓰는 공간. 무요구 메모리영역(필요할 때만 만들어지는 비어있는(0으로 초기화된) 메모리 공간) 각각의 프로세서에 대해 커널은 힙의 꼭대기를 가리키는 변수 brk를 사용(힙이 어디까지 자랐나)
malloc()
free()
힙 안의 구조: 블록(block) 단위
힙은 그냥 빈 공간이 아님
우리가 malloc()을 호출할 때마다
힙 안에서는 "블록(block)"이라는 단위로 공간을 만들어줌
allocated: 이미 누가 쓰고있는 블록(malloc 한 상태)
free: 아직 아무도 안쓰고 있어서 나중에 줄 수 있는 블록
ex)
malloc(20) → free 블록에서 20바이트짜리 블록을 찾아서 할당
그 블록의 상태가 Free → Allocated로 바뀜
나중에 free(ptr)을 하면 → 다시 Free 상태로 바뀜
이 블록은 메모리 할당기(allocator) 가 이 블록들을 관리
할당기는:
힙을 블록으로 쪼개고
어떤 블록이 Free인지, 어떤 게 Allocated인지 기억하고
malloc()이나 free()가 호출될 때 필요한 작업을 해줌
+------------+-------------+--------------+
| 사용 중 | 비어있음 | 사용 중 |
| 64 bytes | 200 bytes | 128 bytes |
+------------+-------------+--------------+
블록 단위로 힙은 쪼개져있음
1. 빈칸중에 100이상 있나?
64바이트 → 너무 작음
200바이트 → 가능!
나머지 100바이트는 다시 빈 칸으로 남겨둬 (Free)
+------------+------------+-------------+--------------+
| 사용 중 | 사용 중 | 비어있음 | 사용 중 |
| 64 bytes | 100 bytes | 100 bytes | 128 bytes |
+------------+------------+-------------+--------------+
→ 메모리 재사용
+------------+------------+--------------+-------------+
| 사용 중 | 사용 중 | 사용 중 | 사용 중 |
| 64 bytes | 128 bytes | 32 bytes | 100 bytes |
+------------+------------+--------------+-------------+
↑
brk
→ 힙확장
나중에 다른 malloc()에서 재사용 가능하게 됨
| 구분 | 설명 | 예시 언어 |
|---|---|---|
| 명시적 할당기 (Explicit) | 내가 직접 malloc하고 free까지 다 해야 함 | C, C++ |
| 암시적 할당기 (Implicit) | 할당은 내가 하지만, 정리는 컴퓨터가 알아서 함 | Java, Python |
썸네일 현아언니 해주세요