동적 메모리 할당 (힙, sbrk, malloc ,free)
운영체제와 시스템 프로그래밍을 공부할 때 빠질 수 없는 주제 중 하나가 바로 동적 메모리 할당(Dynamic Memory Allocation)인데요. 이번 글에서는 동적 메모리 할당과 관련된 핵심 개념들인 힙(Heap), sbrk, malloc, free에 대해 정리해 보겠습니다.
동적 메모리 할당이란?
- 정의: 프로그램 실행 도중에 필요한 메모리 크기를 결정하고, 이를 운영체제로부터 요청하여 사용하는 것
- 필요성
- 컴파일 시점에 데이터 크기를 알 수 없는 경우
- 프로그램 실행 중 데이터 구조(배열, 연결 리스트 등)의 크기가 가변적인 경우
- 대표 예시
malloc
,calloc
,realloc
,free
함수 사용
힙(Heap) 영역
- 정의
- 프로그램 메모리 영역 중 하나로, 동적 할당을 위해 사용되는 공간
- 스택(Stack)과 반대 방향(아래에서 위로)으로 메모리가 확장된다
- 특징
- 명시적으로 할당(malloc)하고 해제(free)해야 한다
- 메모리 누수(leak)와 단편화(fragmentation) 문제가 발생할 수 있다
sbrk와 brk
sbrk(intptr_t increment)
:- 힙 영역의 끝 주소를 증가시키는 시스템 호출
- 전통적인 메모리 할당 방법
- increment만큼 프로그램 데이터 세그먼트(힙)의 크기를 늘린다
sbrk(0)
은 현재 프로그램 브레이크(힙의 끝)를 반환한다
brk(void *end_data_segment)
:- 브레이크 포인터를 직접 지정하는 시스템 호출. (보통
sbrk
보다 사용이 덜 일반적임)
- 브레이크 포인터를 직접 지정하는 시스템 호출. (보통
참고로, 현대 시스템에서는 sbrk 대신 mmap을 활용하여 메모리를 관리하는 경우도 많은데요. 특히 대규모 메모리 요청 시에 이를 많이 활용하게 됩니다.
malloc과 free
malloc
malloc(size_t size)
- 기능:
size
바이트만큼 힙에서 메모리를 할당하고 그 포인터를 반환 - 실패 시 NULL 반환
- 내부 동작
- 필요한 크기의 블록을 찾아 반환하거나
- 적절한 블록이 없으면 sbrk로 힙을 확장
int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
// 메모리 할당 실패 처리
}
free
free(void *ptr)
- 기능:
malloc
등으로 할당한 메모리를 해제. - 주의사항
- 이미 해제된 메모리를 다시 해제(double free)하면 안 됨
- 해제한 후 해당 포인터를 사용하면 use-after-free 에러 발생
free(arr);
arr = NULL; // 습관적으로 NULL로 초기화하면 좋음.
추가로 알아두면 좋은 것들
calloc
: 초기화를 0으로 채운 후 메모리를 할당하는 함수realloc
: 이미 할당된 메모리 블록의 크기를 조정하는 함수- 메모리 단편화 문제
- 많은 할당/해제 작업 후 힙이 조각나게 되면 메모리 낭비가 발생할 수 있음
- 메모리 누수
malloc
으로 할당한 메모리를free
하지 않으면 프로그램 종료 전까지 해제되지 않아 리소스가 낭비됨
'크래프톤 정글 > CS기초(키워드, 개념정리)' 카테고리의 다른 글
[CS기초] 메모리 할당 정책 (Memory Allocation Policies) (0) | 2025.04.28 |
---|---|
[CS기초] 메모리 단편화(Memory Fragmentation) (0) | 2025.04.28 |
[CS기초] 가상 메모리(Virtual Memory)와 페이징(Paging) (0) | 2025.04.26 |
[중간정리] 6주차 - C언어(포인터), 이진탐색트리/RB트리/AVL트리 (0) | 2025.04.23 |
[CS기초] 6주차 개념 정리 (0) | 2025.04.22 |