malloc은 대체 무슨 일을 할까?

2 hours ago 1

malloc은 커널에서 큰 메모리 영역을 확보한 뒤 사용자 공간에서 나눠 할당해 시스템 호출 비용을 줄임. glibc에서 malloc(16)을 1,000번 호출한 실험은 첫 호출에서만 brk를 두 번 실행함 각 할당에는 크기를 기록하는 청크 헤더가 있으며, 해제한 공간은 재사용함. 빈 청크를 분할하거나 인접한 청크끼리 병합해 요청을 처리함 가상 메모리 확보와 실제 RAM 사용은 다름. 실험에서는 페이지에 처음 쓸 때 물리 메모리가 붙었으며, 사용한 메모리를 free해도 할당자가 커널에 반환하지 않으면 RAM에 남음 힙 끝을 낮추는 방식은 힙 최상단의 빈 공간만 반환할 수 있지만, 큰 블록을 mmap으로 따로 할당하면 주변 할당과 무관하게 munmap으로 반환 가능함 glibc는 크기별 빈 목록과 스레드별 캐시로 빠르게 처리하는 대신 메모리를 보유함. 비교 실험에서 캐시를 끄면 전체 해제 후 메모리 사용량은 크게 줄었지만, 단계당 실행 시간은 1.5배로 늘어남 작은 할당마다 시스템 호출을 하지 않는 이유 malloc 은 요청한 크기의 연속된 바이트 영역을 가리키는 void 포인터를 반환하고, free는 같은 포인터로 메모리를 해제함 glibc에서 malloc(16)을 1,000번 호출하고 strace로 관찰하면, 전체 루프에서 brk 시스템 호출은 두 번만 발생함 첫 호출은 힙 끝 주소인 프로그램 브레이크(program break)를 조회하고, 두 번째는 힙을 132 KiB 확장함 둘 다 첫 malloc에서 실행되며, 나머지 999회는 확보해 둔 영역에서 할당함 brk 는 프로그램 브레이크를 지정한 주소로 설정하는 시스템 호출이고, sbrk는 증감량을 받아 브레이크를 이동시키는 libc 래퍼임 주소 공간과 단순한 범프 할당자 프로세스의 주소 공간에는 실행 코드인 text, 초기화된 전역 변수인 data, 초기화되지 않은 전역 변수인 bss, 힙, 공유 라이브러리, 스택 등의 영역이 있음 예제에서 주소는 실행 파일 코드부터 전역 변수, 힙, libc, 스택 순으로 높아짐 프로그램 브레이크와 libc의 printf 주소 사이는 23.4 TiB로, 시스템 RAM 15.6 GiB의 약 1,530배였음 그 사이 대부분은 매핑되지 않은 공간이므로 물리 메모리를 소비하지 않음 범프 할당자(bump allocator) 는 요청 크기를 정렬한 뒤 sbrk로 브레이크를 올리고 이전 끝 주소를 반환하는 방식으로 구현할 수 있음 요청...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵