17P by baeba 2일전 | ★ favorite | 댓글과 토론

1. 프로젝트 개요 및 목적

Eta Labs는 리눅스용 C/POSIX 표준 라이브러리 구현체들을 기능성과 경량성(“bloat”) 중심으로 비교했다. 비교 대상은 musl, uClibc, dietlibc, glibc이며, 향후 bionic 및 BSD libc들도 추가될 예정이다.

2. 메모리 사용 및 경량성 비교 (Bloat)

  • musldietlibc는 매우 가볍고 작은 실행 파일을 만들 수 있다 (static hello: 13k vs glibc의 662k).
  • glibc는 전체 .so 크기가 7.9M에 달해 가장 무겁지만, iconv 등 많은 기능을 포함한다.
  • uClibc는 선택적 기능을 많이 포함한 상태로 테스트됨.

3. 리소스 부족 상황 대응

  • musl은 실패를 명확히 보고하고 비정상 종료 없이 처리하는 경우가 많다.
  • glibcuClibc는 메모리 부족 시 abort하거나 예외를 제대로 처리하지 못하는 경우가 있다.
  • dietlibc는 일부 기능이 아예 구현되지 않았거나, 매우 미약한 처리 수준이다.

4. 성능 비교

  • glibc는 메모리 연산(strchr, memset 등)과 I/O(putc/getc)에서 최상의 성능을 보임.
  • musl은 균형 잡힌 성능과 낮은 오버헤드를 보이며 경쟁력 있음.
  • dietlibc는 strstr, putc/getc, thread 관련 연산에서 압도적으로 느림.

5. ABI 안정성 및 버전 호환성

  • muslglibc는 ABI의 안정성과 호환성을 제공하지만, glibc만 심볼 버전 관리를 지원한다.
  • dietlibcuClibc는 전반적으로 ABI 호환성과 버전 호환성에서 미흡하거나 비공식적이다.

6. 알고리즘 및 내부 구현

  • muslglibc는 고급 substring 검색(twoway), DFA 기반 정규표현식, 성능 중심 malloc 사용.
  • dietlibc는 naive quicksort와 backtracking regex 등으로 성능 및 안정성에서 취약하다.
  • 정렬과 메모리 할당 알고리즘은 glibc가 introsort, ptmalloc 등으로 고급화되어 있음.

7. 기능/표준 지원 범위

  • glibc는 거의 모든 C99/C11 및 POSIX 기능을 지원하며, 로케일, 아이콘브(iconv), 디버깅 기능까지 폭넓다.
  • musl은 필수 기능을 준수하면서도 작은 크기로 구현됨.
  • dietlibc는 대부분 기능이 불완전하거나 미비하며, POSIX 호환도 낮다.

8. 아키텍처 및 빌드 환경 지원

  • musl은 대부분의 주요 아키텍처(x86, ARM, MIPS 등)를 폭넓게 지원하고, non-MMU 환경까지 고려함.
  • glibc는 전통적으로 가장 광범위한 지원을 하며, 배포가 널리 되어 있음.
  • dietlibc는 최소 아키텍처만 지원하며, 이식성과 빌드 유연성이 떨어진다.