..

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명까지 팀 구성 가능
  • 공지 및 수정 사항은 웹페이지를 통해 안내됩니다

시작하기

  1. malloclab-handout.tar 압축 해제
    tar xvf malloclab-handout.tar
    
  2. 수정할 파일: mm.c
  3. 실행용 드라이버: 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 등 프로파일러 활용
  • 일찍 시작하는 것이 중요