메모리 관리 — 가상 메모리·페이징·할당
메모리 관리 — 가상 메모리·페이징·할당
🎯 이 lesson 을 읽고 나면
이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.
- ▸✅ Stack / Heap / Code / Data 영역
- ▸✅ Paging vs Segmentation + Virtual Memory
- ▸✅ Page Fault + LRU 페이지 교체
학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.
가상 메모리 — *환상의 메모리 공간*
한 줄: 각 프로세스가 모든 메모리를 자기 것처럼 보는 환상. 실제로는 OS 가 페이지 단위로 물리 RAM 에 매핑.
왜 필요한가:
변수 접근 6단계 (예: int x = 5; printf("%d", x);):
1. 가상 주소 — &x = 0x7fff5fbff8ac (스택 영역)
2. MMU 변환 — Memory Management Unit 이 페이지 테이블 조회
3. TLB 캐시 — 자주 쓰는 매핑은 CPU 캐시에 (1-cycle hit)
4. 물리 주소 — 0x7fff5fbff8ac → 물리 RAM 0x12345678
5. 캐시 확인 — L1 → L2 → L3 → RAM (4 → 12 → 40 → 200 cycles)
6. 값 반환 — 5 가 레지스터로
> 💡 Page Fault = 페이지 테이블에 매핑 없음 → OS 가 디스크에서 로드 → 매우 느림 (수 ms).
페이징 — 4KB 단위 메모리 관리
페이지 = 4KB (Linux 표준). 가상·물리 메모리 모두 페이지 단위로 관리.
페이지 테이블 구조:
- ▸각 프로세스마다 별도 페이지 테이블
- ▸가상 페이지 번호 → 물리 페이지 번호 + 권한(r/w/x)
- ▸64bit 시스템 = 4단계 페이지 테이블 (PML4 → PDPT → PD → PT)
TLB (Translation Lookaside Buffer):
- ▸CPU 안 페이지 매핑 캐시 (보통 64-1024 항목)
- ▸히트 시 1 cycle, 미스 시 페이지 테이블 워크 (10-100 cycles)
페이징 함정:
Huge Page (2MB·1GB):
- ▸큰 메모리를 다루는 DB·JVM 에서 사용
- ▸TLB 미스 감소 → 성능 향상
- ▸Linux:
echo 1024 > /proc/sys/vm/nr_hugepages
메모리 누수 + OOM 디버깅
메모리 누수 (Memory Leak): 할당했지만 반환 안 함 → 시간 지날수록 누적 → 결국 OOM.
언어별 위험도:
누수 진단 도구:
- ▸Linux:
valgrind --leak-check=full ./app(C/C++) - ▸Java:
jmap -heap <PID>→jhat또는 VisualVM - ▸Python:
tracemalloc모듈 또는objgraph - ▸Node.js:
--inspect+ Chrome DevTools Heap Snapshot - ▸모든 언어:
top또는htop에서 RSS 가 시간 지남에 따라 계속 증가 하면 의심
OOM Killer 동작:
1. RAM + 스왑 거의 다 참
2. 커널이 oom_score 계산 (메모리 사용량·우선순위 기반)
3. 가장 점수 높은 프로세스 SIGKILL
4. /var/log/syslog 또는 dmesg 에 기록 (Out of memory: Kill process ...)
> 💡 production server 에서는 vm.swappiness=10 (스왑 최소화) + 메모리 모니터링 알람 필수.
🤖 AI 에게 이렇게 요청해보세요
이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.
- ▸"이 코드의 메모리 사용 패턴 (heap/stack) 분석해줘"
- ▸"이 프로세스의 RSS / Virtual Memory 측정 명령어 알려줘"
왜 이게 토큰을 줄이나
개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.