오늘 하루 요약

✏️오늘의 한 일
🌈오늘의 성장!
1. 가상 메모리와 힙 관리
- 힙(Heap): 프로세스 가상 메모리에서 동적 할당을 위해 사용되는 영역.
- 힙은 brk 포인터로 확장/축소 가능.
mmap, sbrk를 통해 저수준 메모리 직접 관리 가능.
- 일반적으로 malloc/free 같은 할당기를 통해 힙 사용.
2. 동적 메모리 할당기 기본 개념
- 명시적 할당기: 프로그래머가 직접
malloc, free 호출.
- 묵시적 할당기: 가비지 컬렉터가 메모리 자동 회수 (ex. Python).
3. 할당기의 요구사항
- 요청 순서 무작위 처리.
- 요청 즉시 응답.
- 힙 내부에만 메타데이터 저장.
- 정렬 보장 (8/16바이트 단위).
- 할당된 블록은 이동 금지.
4. 할당기 목표
- 처리량 극대화: 빠르게 블록 찾기 (O(n) → O(log n)).
- 메모리 이용도 최적화: 단편화 방지 및 효율적 재사용.
5. 단편화
- 내부 단편화: 블록 크기 > 실제 필요량 (정렬/최소 블록 크기 때문).
- 외부 단편화: 가용 메모리가 흩어져 연속된 공간 부족.
6. 가용 블록 관리 전략
- 묵시적 리스트: 블록 헤더 정보로만 구분, 힙 전체 순회.
- 명시적 리스트: 가용 블록만 포인터로 연결 (LIFO, 주소순 정렬).
7. 블록 배치 전략
- First Fit: 처음 맞는 블록.
- Next Fit: 이전 검색 위치 이후부터.
- Best Fit: 가장 딱 맞는 블록.
8. 블록 분할 & 병합
- 분할: 큰 가용 블록 → 필요한 만큼만 사용, 나머지는 가용 블록.
- 병합(Coalescing): 인접 가용 블록 합침 → 외부 단편화 줄임.
- 즉시 병합: free 시 바로.
- 지연 병합: 필요할 때 한번에.
- 헤더/풋터 사용해 블록 크기/할당 상태 저장.
- 풋터로 이전 블록 상태 확인 → O(1) 병합 가능.
10. 명시적 가용 리스트 vs 묵시적 가용 리스트
| 구분 | 묵시적 리스트 | 명시적 리스트 |
|---|
| 탐색 속도 | 전체 블록 O(n) | 가용 블록 O(free blocks) |
| 공간 | 헤더/풋터 | 포인터 공간 추가 필요 |
| 구조 | 연결 없음 | pred/succ 포인터 연결 |
| Free 속도 | 항상 O(1) | 정책에 따라 다름 |
- LIFO 방식: 삽입 O(1), 탐색 빠름, 단편화↑.
- 주소순 방식: 메모리 효율↑, 삽입 O(n).
11. 할당기 구현 개요
- memlib.c: 가짜 힙 제공, 실제 시스템 메모리 대신 사용.
- mm.c: 직접 구현할 할당기 (묵시적 리스트 기반).
- mm_init: 힙 초기화.
- mm_malloc: 메모리 요청 처리.
- mm_free: 블록 반환 및 병합.
12. 중요 매크로 정리
- PACK(size, alloc): 크기 + 할당 상태 결합.
- GET(p) / PUT(p, val): 메모리 값 읽기/쓰기.
- GET_SIZE(p) / GET_ALLOC(p): 블록 크기/상태 추출.
- NEXT_BLKP(bp) / PREV_BLKP(bp): 블록 이동.
13. 실전 구현 팁
- 정렬과 최소 블록 크기 항상 고려 (8/16바이트).
- Prologue/Epilogue 블록 활용으로 병합 로직 단순화.
- 힙 확장 필요시 mem_sbrk 이용.
- 테스트: 가상 힙(memlib.c) 기반으로 안전하게 테스트.
결론:
할당기는 성능과 메모리 효율의 균형을 맞추는 것이 핵심! 설계 선택에 따라 탐색 속도, 메모리 낭비가 크게 달라짐. 실전 구현 시 묵시적 리스트부터 시작해보자!
⛏오늘의 삽질

하 Segmentation Fault....
아니 이 사람 짤방러였네 ㅋㅋㅋㅋㅋㅋㅋ