개발자 Ben Andrew가 자신의 웹사이트를 통해 malloc 함수의 실제 동작 원리를 파헤치는 글을 게시했습니다. 많은 프로그래머가 메모리 할당 요청 시 반환되는 포인터만 신경 쓰지만, 그 이면에서는 복잡한 시스템 자원 관리가 이루어지고 있습니다.

Andrew는 사용자가 malloc으로 특정 크기의 메모리를 요청하면 연속된 바이트 블록이 생성되는 것처럼 보이지만, 이는 사용 공간 프로그램이 커널에 시스템 호출을 보내는 과정이라고 설명합니다. 하지만 매번 작은 블록을 할당할 때마다 시스템 호출을 반복하기에는 비용이 너무 큽니다.

그가 제시한 측정 데이터에 따르면 빈 시스템 호출 하나에만 약 575나노초가 소요됩니다. 따라서 GNU libc 같은 표준 라이브러리는 백그라운드에서 장부 기록 작업을 수행하여 효율성을 높입니다. 이는 성능 최적화를 위한 필수적인 단계로 작용합니다.

strace 도구를 이용한 실험 결과, malloc(16)을 천 번 호출하는 루프에서도 brk 시스템 호출은 단 두 번만 발생했습니다. 첫 번째 호출은 프로그램 브레이크 위치를 확인하고, 두 번째는 힙 영역을 132 KiB만큼 확장합니다. 나머지 999번의 할당은 이미 확보된 메모리 내에서 처리됩니다.

프로세스의 주소 공간은 텍스트, 데이터, BSS 등 여러 영역으로 나뉩니다. malloc은 힙 영역을 성장시키며 프로그램 브레이크 주소를 위로 이동시킵니다. brk는 지정된 주소로 브레이크를 설정하는 시스템 호출이며, sbrk는 델타 값을 받아 이를 조정하는 편의 래퍼 함수입니다.

해커 뉴스 커뮤니티에서는 이 글에 대한 다양한 반응이 이어졌습니다. 한 이용자는 스택 전용 언어의 매력도를 언급하며 힙 할당 추상화의 복잡성을 지적했습니다. 다른 이들은 현대적인 할당자가 mmap을 활용하므로 brk 기반 설명이 구식일 수 있다고 반론을 제기하기도 했습니다.

jemalloc이나 mimalloc 같은 최신 구현체는 이러한 전통적인 방식과 차이가 있을 수 있다는 의견도 개진되었습니다. 다만 Andrew의 글은 glibc의 기본 동작을 이해하는 데 중요한 출발점이 됩니다. 저수준 메모리 관리의 기초를 다지는 자료로서 가치가 인정받고 있습니다.