..
malloc-lab 정리
- malloc-lab/traces 폴더 — 워크로드(작업 시나리오) 모음
이 폴더에는 .rep 확장자의 트레이스 파일이 들어 있습니다. 각 트레이스는 “malloc/free/realloc 요청의 순서와 크기”를 텍스트로 기록한 시나리오이며, 드라이버가 이를 읽어 여러분의 mm.c 구현을 자동으로 호출·검증합니다. - 트레이스 세트는 정확성(올바른 동작), 공간 효율(이용률), 처리량(ops/s)을 두루 확인하도록 구성됩니다. 예를 들어 짧은 short.rep는 빠른 디버깅에, realloc-.rep는 realloc 처리 로직을 집중 점검하는 용도로 쓰입니다
- 기본적으로 드라이버는 기본 트레이스 디렉터리(보통 config.h의 TRACEDIR 값, 대개 traces/)를 사용하며, 옵션으로 다른 디렉터리나 단일 파일을 지정할 수도 있습니다(아래 #2 참고).
- 요약: traces/는 여러 가지 사용 패턴을 흉내 낸 입력 세트를 모아둔 폴더이며, 드라이버가 이 파일들을 읽어 여러분의 할당기(mm.c)를 체계적으로 두들겨 봅니다
- malloc-lab/ 루트(= mdriver.c가 있는 폴더) — 테스트 드라이버와 지원 도구
- 이 폴더에는 드라이버 프로그램 mdriver.c가 있습니다. 드라이버는 traces/에 있는 시나리오를 읽어 mm_init / mm_malloc / mm_free / mm_realloc을 호출하고, 정확성·공간 이용률·처리량을 측정해 점수(또는 지표)를 출력합니다. make로 빌드하고 ./mdriver로 실행하는 전형적인 구조입니다.
- 드라이버는 테스트 중에 메모리 시스템 시뮬레이터(memlib.c/h)를 사용합니다. 예를 들어 mem_sbrk로 힙을 확장하는 등, 운영체제 없이도 힙 동작을 흉내 내게 해줍니다
- 드라이버는 각 트레이스를 여러 번 읽어 처리량을 안정적으로 측정하기도 하며, 출력에는 이용률(최대 사용 바이트 / 힙 크기), 처리량(ops/s, libc 대비 비율) 등 지표가 포함됩니다. 설계 목표는 두 지표를 균형 좋게 끌어올리는 것입니다
- 요약: malloc-lab/ 루트는 mdriver.c와 빌드 스크립트(예: Makefile), 지원 라이브러리들이 있는 테스트 실행 본부입니다. 여기서 빌드·실행·디버깅을 수행하고, -t/-f 옵션으로 어떤 트레이스를 돌릴지 제어합니다.
소개
이 과제에서는 C 언어용 동적 메모리 할당기를 직접 구현합니다.
즉, malloc
, free
, realloc
루틴을 직접 설계하고 작성해야 합니다.
목표는 다음과 같습니다:
- 올바른 동작 (Correctness)
- 효율적인 메모리 사용 (Space Utilization)
- 빠른 처리 속도 (Throughput)
팀 구성
- 최대 2명까지 팀 구성 가능
- 공지 및 수정 사항은 웹페이지를 통해 안내됩니다
시작하기
- malloclab-handout.tar 압축 해제
tar xvf malloclab-handout.tar
- 수정할 파일: mm.c
- 실행용 드라이버: mdriver.c
make ./mdriver -V
최종 제출 시 mm.c 파일 하나만 제출합니다.
구현해야 할 함수
int mm_init(void);
void *mm_malloc(size_t size);
void mm_free(void *ptr);
void *mm_realloc(void *ptr, size_t size);
- mm_init: 힙 초기화
- mm_malloc: 최소 size 바이트 블록 할당 (8바이트 정렬 보장)
- mm_free: 블록 해제
- mm_realloc: 블록 크기 조정
힙 일관성 검사기
int mm_check(void);
확인할 항목 예시:
- free 리스트에 있는 모든 블록이 실제로 free 상태인가
- 인접 free 블록이 병합되지 않고 남아 있지 않은가
- free 리스트의 포인터가 올바른 힙 주소를 가리키는가
- 블록이 겹치지 않는가
지원 루틴 (memlib.c)
- void *mem_sbrk(int incr): 힙 확장
- void *mem_heap_lo(void): 힙 시작 주소 반환
- void *mem_heap_hi(void): 힙 끝 주소 반환
- size_t mem_heapsize(void): 힙 크기 반환
- size_t mem_pagesize(void): 페이지 크기 반환
드라이버 프로그램 (mdriver.c)
드라이버는 trace 파일에 기록된 할당/재할당/해제를 실행하며 성능과 정확성을 평가합니다.
주요 옵션:
- -t <\dir>: trace 파일 위치 지정
- -f
: 특정 trace 파일만 실행 - -l: libc malloc과 비교 실행
- -v: 성능 요약 출력
- -V: 디버깅용 상세 출력
프로그래밍 규칙
- mm.c 인터페이스 변경 금지
- malloc, calloc, free, realloc, sbrk 등 시스템 호출 금지
- 전역 배열/구조체/리스트 선언 불가 (정수, 포인터 등 스칼라 변수는 가능)
- 항상 8바이트 정렬된 포인터 반환
평가 기준
- 정확성 (20점): 드라이버 테스트 통과 여부
- 성능 (35점)
- 메모리 활용도 (Space Utilization)
- 처리량 (Throughput)
- 성능 지수:
P = wU + (1-w)min(1, T/Tlibc)
(기본 w = 0.6, Tlibc ≈ 600Kops/s)
- 스타일 (10점)
- 코드 구조, 주석, 일관성 검사기 품질
제출
최종적으로 mm.c 파일 하나만 제출합니다.
제출 방법은 강의 사이트 지침에 따릅니다.
힌트
- 작은 trace 파일(short1.rep, short2.rep)로 디버깅 시작
- -v, -V 옵션 활용
- gcc -g로 컴파일 후 gdb 디버깅
- 교재의 암시적 free list 기반 malloc 구현 이해
- 포인터 연산은 매크로로 캡슐화
- 단계별 구현: malloc/free 먼저, realloc은 나중에
- gprof 등 프로파일러 활용
- 일찍 시작하는 것이 중요