Heap &lip~

전두엽힘주기·2025년 4월 25일

Computer System

목록 보기
8/13

런타임 메모리구조

+------------------------+ ← 높은 주소 (큰 숫자)
|      스택(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()가 호출될 때 필요한 작업을 해줌

ex)프로그램 안에서 malloc(100)을 하면?

+------------+-------------+--------------+
|  사용 중   |    비어있음  |   사용 중     |
|  64 bytes  |   200 bytes |   128 bytes  |
+------------+-------------+--------------+

블록 단위로 힙은 쪼개져있음
1. 빈칸중에 100이상 있나?
64바이트 → 너무 작음

200바이트 → 가능!

  1. 가능하면 거기서 잘라서 100바이트 줌
    200바이트 중 100바이트는 네가 쓰게 하고 (Allocated)

나머지 100바이트는 다시 빈 칸으로 남겨둬 (Free)

+------------+------------+-------------+--------------+
|  사용 중   |  사용 중       |    비어있음   |   사용 중     |
|  64 bytes  | 100 bytes  | 100 bytes   | 128 bytes    |
+------------+------------+-------------+--------------+

→ 메모리 재사용

빈블록이 없다면?

  1. brk를 올려서 새로운 메모리 확보 운영체제한테 "나 힙 좀 더 늘려줘요~" 하고 요청해서
    brk를 올리고,새로운 블록을 만들어서 사용자한테 줌!
+------------+------------+--------------+-------------+
|  사용 중   |  사용 중   |   사용 중    |  사용 중    |
|  64 bytes  | 128 bytes  | 32 bytes     | 100 bytes   |
+------------+------------+--------------+-------------+
                                              ↑
                                             brk

→ 힙확장

나중에 다른 malloc()에서 재사용 가능하게 됨

명시적 vs 암시적 할당기

구분설명예시 언어
명시적 할당기 (Explicit)내가 직접 malloc하고 free까지 다 해야 함C, C++
암시적 할당기 (Implicit)할당은 내가 하지만, 정리는 컴퓨터가 알아서 함Java, Python

2개의 댓글

comment-user-thumbnail
2025년 4월 26일

썸네일 현아언니 해주세요

1개의 답글