Article/OS - Deep Dive
스택과 힙, 힙의 단편화
조금씩 차근차근
2025. 4. 15. 02:37
최근 즐겨보는 유튜브 채널에서 재밌는 면접 질문을 보았다.
웹 백엔드 개발자를 위한 주제는 아닌것 같긴 한데, 주제가 상당히 흥미롭고 재밌어서 작성해본다. GC에 대한 이해도를 높힐 수 있어 좋은 시간이었다.
스택과 힙의 차이
멀티스레딩 환경에서의 스택과 힙의 차이
- 스택
- 해당 스레드용
- 메모리의 수명 파악 가능
- 코드의 깊이로
- 지나치게 깊은 스택은, 코드의 가독성을 떨어트린다.
- 힙
- 멀티스레드 환경에서의 전역변수 역할
- 고수준 언어에서, 스택과 힙은 반드시 필요하다.
메모리 단편화
네이티브 메모리 할당의 문제점
- malloc은 느리다.
- 시스템 콜이 필요함
- 이는 nio의 native memory 할당에도 같이 적용된다.
- 따라서, 메모리 할당과 해제에 신중해져야 한다.
- 할당받은 native 메모리를, 직접 쪼개가며 재사용해야 할 수도 있다!
메모리를 직접 쪼개 쓸 때의 문제
- 메모리 할당을 어떻게 할 것인가?
- Dynamic Storage Allocation Problem
- 운영체제에서 고민하던 문제가, 개발자의 구현으로 넘어온다!
- 메모리 단편화 문제
- 연속적인 메모리 할당이 불가능해지는 문제
- 원하는 크기의 연속된 빈 메모리 공간이 없는 문제
- 50% rule
- 최초 적합의 경우
- 통계적으로 N개의 블록이 할당되었을 때, 0.5N개의 블록은 사용할 수 없게 된다는 규칙.
해결 방법
- 메모리 풀 사용
- 메모리 사용 패턴이 정해져 있을 때
- 페이지 단위로 관리 → 위 Dynamic Storage Allocation Problem 참고.
- 메모리의 사용 패턴이 정해져 있을 때 유용하다.
- 메모리의 사용 패턴이 불규칙할 경우, 사용하기 어려워진다.
- 메모리 compaction 구현