microsoft/mimalloc

mimalloc is a compact general purpose allocator with excellent performance.

13,168
GitHub 스타
1,132
포크
C
언어
MIT
라이선스
2026.07.08
최근 푸시
2026.05.25
별표한 날

AI 분석

설치 난이도: 쉬움
큐레이터 노트
성능이 중요한 C/C++ 프로젝트에서 malloc 대체재로 적극 고려할 가치가 있음. 특히 저지연 서버, 게임, 임베디드 시스템 등에 적합.

강점

  • 뛰어난 성능: jemalloc, tcmalloc 등 주요 할당자보다 벤치마크에서 우수한 성능을 보이며 메모리 사용량도 적음.
  • 드롭인 대체: 코드 변경 없이 LD_PRELOAD 등을 통해 기존 프로그램에서 바로 사용 가능.
  • 작고 일관된 코드베이스: 약 10k LOC로 통합 및 포팅이 용이하며 다양한 OS 지원.
  • 보안 모드 제공: 가드 페이지, 암호화된 자유 목록 등으로 힙 취약점 방어 가능.
  • 일급 힙 지원(v3): 모든 스레드에서 힙에 할당 가능하며 힙 단위 파괴 지원.

약점

  • 버전 분기(v1/v2/v3)로 인해 사용자가 적절한 버전 선택 필요.
  • 보안 모드 사용 시 평균 10% 성능 저하 발생.
  • 일부 특수 환경(예: 매우 이전 GCC, arm32 pre v7)에서 빌드 이슈 가능성.

주의사항

  • v3는 최신 개발 버전으로 안정성이 v2보다 낮을 수 있음.
  • 보안 모드 활성화 시 성능 영향을 고려해야 함.
  • THP(Transparent Huge Pages) 관련 설정(MIMALLOC_ALLOW_THP)이 기본적으로 활성화되어 있어 특정 환경에서 예상치 못한 동작이 발생할 수 있음.

시작 가이드

  • 공식 문서(https://microsoft.github.io/mimalloc)를 읽고 API 및 설정 옵션 숙지.
  • 자신의 환경에 맞는 버전(v3 권장)을 선택하여 빌드 및 테스트.
  • LD_PRELOAD 또는 정적 링크를 통해 기존 프로젝트에 적용하여 성능 측정.
  • 보안 모드가 필요한 경우 MI_SECURE 옵션을 활성화하여 빌드.

README 한국어 번역

이 번역은 AI가 원문 README를 옮긴 것입니다. 원문이 항상 우선합니다.

mimalloc ("me-malloc"로 발음)은 뛰어난 성능 특성을 가진 범용 할당자입니다. 처음에는 Daan Leijen이 KokaLean 언어의 런타임 시스템을 위해 개발했습니다.

최신 릴리스: v3.3.2 (2026-04-29) 권장. 최신 v2 릴리스: v2.3.2 (2026-04-29) 안정. 최신 v1 릴리스: v1.9.10 (2026-04-29) 레거시.

mimalloc은 malloc의 드롭인 대체재이며 코드 변경 없이 다른 프로그램에서 사용할 수 있습니다. 예를 들어, 동적으로 링크된 ELF 기반 시스템(Linux, BSD 등)에서는 다음과 같이 사용할 수 있습니다:

> LD_PRELOAD=/usr/lib/libmimalloc.so  myprogram

또한 Windows에서 기본 할당자를 동적으로 재정의하는 방법도 포함되어 있습니다. 설계의 주목할 만한 측면은 다음과 같습니다:

  • 작고 일관됨: 라이브러리는 약 10k LOC이며 단순하고 일관된 데이터 구조를 사용합니다. 이는 다른 프로젝트에 통합 및 적용하기 매우 적합합니다. 런타임 시스템의 경우 단조로운 heartbeat 및 지연 해제(참조 카운팅의 최악의 경우 시간 제한)를 위한 훅을 제공합니다. 단순성 덕분에 mimalloc은 많은 시스템(Windows, macOS, Linux, WASM, 다양한 BSD, Haiku, MUSL 등)으로 포팅되었으며 동적 재정의를 훌륭하게 지원합니다. 동시에 수천 대의 머신에서 (매우) 대규모 분산 서비스를 실행하며 최악의 경우 지연 시간이 우수한 산업용 강도 할당자입니다.
  • 자유 목록 샤딩: 하나의 큰 자유 목록(크기 클래스당) 대신 "mimalloc 페이지"당 더 작은 여러 목록을 사용하여 단편화를 줄이고 지역성을 높입니다. 시간적으로 가깝게 할당된 것들은 메모리에서도 가깝게 할당됩니다. (mimalloc 페이지는 하나의 크기 클래스 블록을 포함하며 64비트 시스템에서 일반적으로 64KiB입니다.)
  • 자유 목록 다중 샤딩: 큰 아이디어! 자유 목록을 mimalloc 페이지별로 샤딩할 뿐만 아니라 각 페이지에 대해 여러 자유 목록이 있습니다. 특히, 스레드 로컬 free 작업을 위한 하나의 목록과 동시 free 작업을 위한 다른 목록이 있습니다. 다른 스레드에서의 해제는 이제 스레드 간의 정교한 조정 없이 단일 CAS로 수행될 수 있습니다. 수천 개의 개별 자유 목록이 있으므로 경합은 자연스럽게 힙에 분산되며 단일 위치에서 경합할 가능성은 낮습니다. 이는 스킵 리스트와 같은 무작위 알고리즘과 매우 유사하며, 무작위 오라클을 추가하면 더 복잡한 알고리즘의 필요성이 제거됩니다.
  • 적극적인 페이지 제거: "페이지"가 비어지면(자유 목록 샤딩으로 인해 확률 증가) 메모리는 OS에 사용되지 않음으로 표시되어(리셋 또는 해제) 실제 메모리 압력과 단편화를 줄입니다. 특히 장기 실행 프로그램에서 그렇습니다.
  • 보안: mimalloc은 보안 모드로 빌드할 수 있으며, 가드 페이지, 무작위 할당, 암호화된 자유 목록 등을 추가하여 다양한 힙 취약점으로부터 보호합니다. 성능 저하는 일반적으로 벤치마크 평균 약 10%입니다.
  • 일급 힙: 여러 힙을 효율적으로 생성 및 사용하여 다른 영역에 할당할 수 있습니다. 힙은 각 객체를 개별적으로 해제하는 대신 한 번에 파괴할 수 있습니다. 새로운 기능: v3는 모든 스레드에서 힙에 할당할 수 있는 진정한 일급 힙을 제공합니다.
  • 제한됨: blowup [1]을 겪지 않으며, 최악의 경우 할당 시간(wcat)이 제한되고(OS 기본 요소까지), 공간 오버헤드가 제한되며(~0.2% 메타데이터, 낮은 내부 단편화), 원자 연산만 사용하여 내부 경합 지점이 없습니다.
  • 빠름: 벤치마크(아래 참조)에서 mimalloc은 다른 주요 할당자(jemalloc, tcmalloc, Hoard 등)를 능가하며 종종 더 적은 메모리를 사용합니다. 좋은 특성은 다양한 벤치마크에서 일관되게 잘 작동한다는 것입니다. 또한 대규모 서버 프로그램을 위한 훌륭한 거대 OS 페이지 지원이 있습니다.

문서는 API의 전체 개요를 제공합니다. 기술 보고서에서 mimalloc의 설계에 대해 더 읽을 수 있으며, 자세한 벤치마크 결과도 포함되어 있습니다.

즐기세요!

버전

mimalloc의 세 가지 유지 관리 버전이 있습니다. OS 메모리 처리 방식을 제외하고는 대부분 동일합니다. 새로운 개발은 주로 v3에서 이루어지며, v1과 v2는 보안 및 버그 수정으로 유지 관리됩니다.

  • v3: 권장: 이전 버전의 잠금 없는 설계를 단순화하고 스레드 간 메모리 공유를 개선합니다. 특정 대규모 워크로드에서 이 버전은 (훨씬) 적은 메모리를 사용할 수 있습니다. 또한 진정한 일급 힙(모든 스레드에서 할당 가능)을 지원하며 더 효율적인 힙 워킹(예: CPython GC용)을 제공합니다. (릴리스 태그: v3.x, 개발 브랜치 dev3).
  • v2: 안정적인 mimalloc 버전. 스레드 로컬 세그먼트를 사용하여 단편화를 줄입니다. (릴리스 태그: v2.x, 개발 브랜치 dev2main)
  • v1: 레거시 버전: mimalloc의 초기 설계 (릴리스 태그: v1.9.x, 개발 브랜치 dev). 가능하면 이 버전에 대해 PR을 보내주세요.

릴리스

  • 2026-04-29, v1.9.10, v2.3.2, v3.3.2: LLM 감사(@Zoxc)를 통한 다양한 버그 및 보안 수정. allow_thp가 2로 설정된 경우에만 최소 제거 크기를 자동으로 증가시킵니다. 모든 플랫폼에서 큰 OS 정렬을 활성화합니다(Windows에서 OS 큰 페이지 수정). Linux/macOS에서 커밋된 메모리 계정 수정. C 모드 사용 시 MSVC 원자 구현 업데이트. Emscripten 수정 업스트림. 적절한 원자적 do-once 구현.
  • 2026-04-20, v1.9.9, v2.3.1, v3.3.1: 다양한 버그 및 보안 수정. Windows 종료 개선에 도움을 준 @jinpzhanAMD, @res2k, @GoldJohnKing, 그리고 다양한 문제를 찾아준 @Zoxc에게 특별히 감사드립니다.
  • 2026-04-15, v1.9.8, v2.3.0, v3.3.0: github (바이너리) 릴리스 초기 지원, 수집 중 전체 페이지 방문 수정(성능), THP 정렬 수정(성능), Windows에서 arm64 크로스 컴파일 수정, 디버그 모드에서 가드 페이지 활성화, 항상 아레나 사이에 커밋되지 않은 영역 사용(보안), 정적 CRT로 Windows에서 malloc 등의 정적 오버로딩 활성화(@Noxybot), Windows에서 TLS 슬롯 누수 수정(v3), 정적으로 링크된 mimalloc으로 깔끔한 DLL 로드/언로드 활성화(v3), miheapdestroy에서 경쟁 조건 수정(v3), 기본적으로 할당된 객체와 별도로 페이지 메타 정보 배치(v3, 보안), emscripten용 C++ 재정의 수정. DeepTest에서 발견된 다양한 버그: miheapreallocaligned의 오프셋 수정, mi(w)dupenvs 버퍼 크기 수정, 크기 옵션의 잠재적 오버플로우 수정, mireallocarr(ay)의 오류 코드 수정.
  • 2026-02-03, v3.2.8 (rc3): macOS에서 스레드 재초기화 문제 수정. 이전 GCC 버전에서 SIMD 코드 생성 버그 수정. Windows TLS 슬롯 제한을 64에서 1088로 확장. 커밋 통계를 더 정확하게 보고. 아레나에서 자유 페이지 검색 문제 수정.
  • 2026-01-15, v1.9.7, v2.2.7, v3.2.7 (rc2): OS 할당된 블록의 0 초기화 수정. v3의 다양한 버그 및 성능 수정. Debian 32비트 컴파일 수정.
  • 2026-01-08, v1.9.6, v2.2.6, v3.2.6 (rc1): 중요한 버그 수정. v3에 대한 많은 개선 사항: 모든 스레드에서 힙에 할당할 수 있는 진정한 일급 힙, 힙별 통계 추적. MIMALLOCALLOWTHP 옵션 추가. 기본적으로 Android를 제외하고 활성화됩니다. v3에서 THP가 감지되면 mimalloc은 잠재적인 THP 거대 페이지를 분할하지 않도록 MIMALLOCMINIMALPURGESIZE를 2MiB로 설정합니다. v3는 Windows에서 더 빠른 TLS 액세스를 사용하며 micalloc 및 정렬된 할당의 성능이 향상되었습니다. 이전 v3의 드문 경쟁 조건 수정, 디버그 통계의 잠재적 버퍼 오버플로우 수정, 할당 및 해제 시 할당된 크기 반환 API 추가.
  • 2025-06-13, v3.1.5: 메모리가 항상 올바르게 커밋되지 않았던 버그 수정 릴리스(이슈 #1098).
  • 2025-06-09, v1.9.4, v2.2.4, v3.1.4 (베타): 몇 가지 중요한 버그 수정, OS 메모리가 항상 완전히 해제되지 않았던 경우 포함. v3 성능 개선, XBox 빌드, Android 빌드 수정, 이전 macOS 버전에 대한 interpose 지원, macOS에서 MADVFREEREUSABLE 사용, 항상 커밋 성공 확인, Windows 고정 TLS 오프셋에 대한 더 나은 지원 등.
  • 2025-03-28, v1.9.3, v2.2.3, v3.0.3 (베타): 다양한 작은 버그 및 빌드 수정: arm32 pre v7 빌드 수정, mingw 빌드 수정, 런타임 통계 가져오기, 통계 커밋 수 개선, BMI1이 없는 x64 시스템에서 실행 수정.
  • 2025-03-06, v1.9.2, v2.2.2, v3.0.2-beta: 다양한 작은 버그 및 빌드 수정. mioptionsprint, miarenasprint, 실험적인 mistatgetmistatgetjson 추가. mithreadsetinthreadpoolmiheapsetnumaaffinity 추가(v3만). vcpkg 포트 파일 추가. mimalloc-redirect를 v1.3.2로 업그레이드. MIOPT_ARCH는 이제 기본적으로 꺼져 있지만 빠른 원자 연산을 위해 arm64에서 여전히 armv8.1-a를 가정합니다. QNX 지원 추가.
  • 2025-01-03, v1.8.9, v2.1.9, v3.0.1-alpha: 중간 릴리스. Windows arm64 지원. 객체 뒤에 OS 가드 페이지를 배치하여 버퍼 오버플로우를 즉시 포착할 수 있는 새로운 guarded 빌드. 많은 작은 수정: Windows arm64, cygwin, riscV, dragonfly 빌드; 스레드 로컬 소멸자(Rust/C++)를 고려한 Windows 정적 라이브러리 초기화 수정; macOS 태그 변경; macOS TLS 슬롯 수정; 통계 개선; Windows에서 일관된 mimalloc.dll (mimalloc-override.dll 대신); Win11 H2에서 mimalloc-redirect 수정; 카나리에 0바이트 추가; CPython 수정 업스트림;.bss 크기 감소; 성능 향상을 위해 Windows에서 고정 TLS 슬롯 허용.
  • 이전 릴리스 노트

특별 감사:

  • 메모리 커밋 감소에 기여한 Sergiy Kuryata - 특히 Windows 스레드 풀을 사용하는 Windows에서 (현재 v3에 구현됨).
  • 많은 기여와 Haiku, Dragonfly 등 덜 일반적인 운영 체제에서 mimalloc이 더 잘 작동하도록 만든 David Carlier (@devnexen).
  • mimalloc을 TSAN 검사 가능하게 만들고 [genMC] 모델 검사기를 사용하여 메모리 모델 버그를 찾은 Mary Feofanova (@mary3000), Evgeniy Moiseenko, Manuel Pöter (@mpoeter).
  • 초기 mimalloc 지원 및 대규모 서비스 배포로 많은 개선을 이끈 Weipeng Liu (@pongba), Zhuowei Li, Junhua Wang, Jakub Szymanski.
  • 대규모 워크로드 및 서버 환경에서 철저한 테스트를 수행하고 (초기 버전의) mimalloc에서 복잡한 버그를 찾은 Jason Gibson (@jasongibson).
  • 버려진 세그먼트 회수에서 ABA 동시성 문제를 찾은 Manuel Pöter (@mpoeter) 및 Sam Gross (@colesbury). Sam은 내부적으로 mimalloc을 사용하는 no GIL Python 포크를 만들었습니다.

[genMC]: https://plv.mpi-sws.org/genmc/

사용법

mimalloc은 다양한 대규모 저지연 서비스에서 사용됩니다.

원본 저장소: microsoft/mimalloc

라이선스: MIT

게재 제외를 원하시면 삭제 요청을 보내주세요.