Jungle / WIL(Weekly I Learned)
[WIL] 7주
[주간 회고] 7주차: 가상 메모리의 심장, Malloc Lab 구현과 OS의 이해 이번 7주차는 Malloc Lab 프로젝트를 통해 C언어로 직접 동적 메모리 할당기를 구현하며 시스템 프로그래밍의 깊은 곳을 탐험한 시간이었습니다. 단순히 코드를 짜는
[주간 회고] 7주차: 가상 메모리의 심장, Malloc Lab 구현과 OS의 이해
이번 7주차는 Malloc Lab 프로젝트를 통해 C언어로 직접 동적 메모리 할당기를 구현하며 시스템 프로그래밍의 깊은 곳을 탐험한 시간이었습니다. 단순히 코드를 짜는 것을 넘어, 메모리를 어떻게 하면 더 효율적으로 관리할 것인가에 대해 치열하게 고민했던 기록들을 정리합니다.
1. 힙(Heap)의 구조와 경계 처리
메모리 할당기를 구현하기 위해 가장 먼저 힙의 물리적 및 논리적 구조를 설계했습니다.
- 정렬(Alignment)과 패딩: 데이터 접근 성능 향상을 위해 8바이트 혹은 16바이트 경계를 맞추는 패딩(Padding)의 중요성을 배웠습니다.
- 프롤로그 및 에필로그: 힙의 시작과 끝을 알리는 파수꾼(Sentinel) 블록을 두어, 메모리 순회 시 발생할 수 있는 경계 오류를 방지했습니다.
2. 가용 리스트 관리 전략: Implicit vs Explicit
가용 블록(Free Block)을 어떻게 찾아낼 것인가에 따라 할당기의 성능이 극명하게 갈리는 것을 확인했습니다.
- Implicit Free List (묵시적 가용 리스트): 구현은 단순하지만 힙이 커질수록 탐색 비용이 블록 수에 비례하여 증가하는 비확장적 자료구조임을 체감했습니다.
- Explicit Free List (명시적 가용 리스트): 가용 블록 내에 next, prev 포인터를 두어 탐색 속도를 높였습니다.
- LIFO (Last-In-First-Out): 삽입 속도가 매우 빠르지만 단편화에 취약할 수 있습니다.
- Address-Ordered: 주소 순으로 정렬하여 병합(Coalescing) 효율을 극대화하고 단편화를 방지했습니다.
3. 더 나은 성능을 위한 고도화 기법
기본적인 할당기를 넘어 실제 시스템에서 사용되는 고도화된 전략들을 학습했습니다.
- 분리 가용 리스트(Segregated Free List): 가용 블록을 크기 구간별로 여러 리스트로 나누어 관리하여 탐색 시간을 단축했습니다.
- 버디 시스템(Buddy System): 블록 크기를 2의 거듭제곱 단위로 관리하여 빠른 병합과 분할을 가능하게 하는 구조를 이해했습니다.
4. 운영체제 핵심 개념 정리
메모리 관리의 배경이 되는 커널의 동작 원리도 함께 정리했습니다.
- System Call: sbrk나 mmap을 통해 사용자 프로세스가 커널에 메모리 자원을 요청하는 인터페이스를 학습했습니다.
- 가상 메모리(Virtual Memory): 각 프로세스가 독립적인 메모리 공간을 가진 것처럼 추상화해주는 원리와 보안 및 안정성을 위한 격리의 중요성을 배웠습니다.