Article/OS - Deep Dive

스택과 힙, 힙의 단편화

조금씩 차근차근 2025. 4. 15. 02:37

최근 즐겨보는 유튜브 채널에서 재밌는 면접 질문을 보았다.

웹 백엔드 개발자를 위한 주제는 아닌것 같긴 한데, 주제가 상당히 흥미롭고 재밌어서 작성해본다. GC에 대한 이해도를 높힐 수 있어 좋은 시간이었다.

스택과 힙의 차이

멀티스레딩 환경에서의 스택과 힙의 차이

  • 스택
    • 해당 스레드용
    • 메모리의 수명 파악 가능
      • 코드의 깊이로
    • 지나치게 깊은 스택은, 코드의 가독성을 떨어트린다.
    • 멀티스레드 환경에서의 전역변수 역할
  • 고수준 언어에서, 스택과 힙은 반드시 필요하다.

메모리 단편화

네이티브 메모리 할당의 문제점

  • malloc은 느리다.
    • 시스템 콜이 필요함
  • 이는 nio의 native memory 할당에도 같이 적용된다.
  • 따라서, 메모리 할당과 해제에 신중해져야 한다.
    • 할당받은 native 메모리를, 직접 쪼개가며 재사용해야 할 수도 있다!

메모리를 직접 쪼개 쓸 때의 문제

  • 메모리 할당을 어떻게 할 것인가?
  • 메모리 단편화 문제
    • 연속적인 메모리 할당이 불가능해지는 문제
    • 원하는 크기의 연속된 빈 메모리 공간이 없는 문제
  • 50% rule
    • 최초 적합의 경우
    • 통계적으로 N개의 블록이 할당되었을 때, 0.5N개의 블록은 사용할 수 없게 된다는 규칙.

해결 방법

  • 메모리 풀 사용
    • 메모리 사용 패턴이 정해져 있을 때
    • 페이지 단위로 관리 → 위 Dynamic Storage Allocation Problem 참고.
    • 메모리의 사용 패턴이 정해져 있을 때 유용하다.
    • 메모리의 사용 패턴이 불규칙할 경우, 사용하기 어려워진다.
  • 메모리 compaction 구현