힙 할당 실패

힙 할당 실패 (Heap Allocation Failure)

많은 프로그래밍 언어는 힙 할당 실패라는 가능성을 무조건 크래시로 처리하는 쪽을 택해요. 하지만 Zig 프로그래머들은 관례상 이 방식이 그다지 만족스러운 해결책이 아니라고 봐요. 그래서 Zig에서는 error.OutOfMemory가 힙 할당 실패를 나타내고, 힙 할당 실패 때문에 어떤 연산을 끝까지 완료하지 못했다면 라이브러리들이 바로 이 에러 코드를 돌려줘요.

출처: Zig Documentation

본문

혹자는 이렇게 주장하기도 해요. Linux 같은 일부 운영체제는 메모리 오버커밋(overcommit)을 기본으로 켜 두니까, 힙 할당 실패를 처리하는 건 의미가 없다고요. 그런데 이 reasoning에는 문제가 꽤 많아요.

  • 오버커밋 기능이 있는 운영체제는 일부뿐이에요.
    • Linux는 기본으로 켜져 있지만, 설정으로 바꿀 수 있어요.
    • Windows는 오버커밋을 하지 않아요.
    • 임베디드 시스템은 오버커밋이 없어요.
    • 취미용 운영체제(Hobby OS)는 오버커밋이 있을 수도 있고 없을 수도 있어요.
  • 실시간 시스템의 경우 오버커밋 자체가 없을 뿐 아니라, 보통 애플리케이션 하나당 최대 메모리 양을 미리 정해 둬요.
  • 라이브러리를 작성할 때 핵심 목표 중 하나는 코드 재사용이에요. 코드가 할당 실패를 올바르게 처리하도록 만들어 두면, 그 라이브러리는 더 많은 상황에서 재사용할 자격을 얻게 돼요.
  • 오버커밋이 켜진 환경에 의존하도록 자란 소프트웨어도 있긴 하지만, 그 존재 자체가 수많은 사용자 경험 재앙의 원인이 돼요. Linux를 기본 설정으로 쓰는 것처럼 오버커밋이 켜진 시스템이 메모리 고갈에 가까워지면, 시스템은 잠기고(lock up) 쓸 수 없는 상태가 돼요. 이 시점에 OOM Killer가 휴리스틱(heuristics)에 기반해 죽일 애플리케이션을 고르는데, 이 비결정적인 선택은 중요한 프로세스가 죽는 결과로 이어지는 경우가 많고, 시스템을 정상 작동 상태로 되돌리지 못하는 경우도 잦아요.

더 알아보기

  • 힙 할당 실패를 error.OutOfMemory로 표현하고 라이브러리가 이 에러를 돌려준다는 관례를 기억해 두세요.
  • 오버커밋에 의존하는 설계가 왜 문제인지, 그리고 실시간 시스템·라이브러리 재사용 측면에서 왜 할당 실패 처리가 의미 있는지가 이 섹션의 핵심이에요.