CSE 351: The Hardware/Software Interface

Spring 2012 Course Website Return home »

Lab 5: Writing a Dynamic Storage Allocater

Assigned Wednesday, May 23, 2012
Due Date Friday, June 1, 2012 at 5:00p
Files lab5.tar.gz

Overview

In this lab you will be writing a dynamic storage allocator for C programs, i.e., your own version of the malloc and free routines.

Instructions

Start by extracting lab5.tar.gz to a directory on attu in which you plan to do your work, by typing:

wget cs.washington.edu/education/courses/cse351/12sp/labs/5/lab5.tar.gz
tar xzvf lab5.tar.gz

This will cause a number of files to be unpacked in a directory called lab5. The only file you will modify and turn in is mm.c.

(In the following instructions, we will assume that you are executing programs in your local directory on attu. For this lab, you can work anywhere there's a C compiler and make, but make sure your allocator works on attu, where we'll be testing it.)

Your dynamic storage allocator will consist of the following three functions (and several helper functions), which are declared in mm.h and defined in mm.c:

int   mm_init(void);
void* mm_malloc(size_t size);
void  mm_free(void* ptr);

The mm.c file we have given you partially implements an allocator using an explicit free list. Your job is to complete this implementation by filling out mm_malloc() and mm_free(). The three main memory management functions should work as follows:

We will compare your implementation to the version of malloc supplied in the standard C library (libc). Since the libc malloc always returns payload pointers that are aligned to 8 bytes, your malloc implementation should do likewise and always return 8-byte aligned pointers.

Provided Code

We define a BlockInfo struct designed to be used as a node in a doubly-linked explicit free list, and the following functions for manipulating free lists:

In addition, we implement mm_init and provide two helper functions implementing important parts of the allocator:

Finally, we use a number of C Preprocessor macros to extract common pieces of code (constants, annoying casts/pointer manipulation) that might be prone to error. Each is documented in the code. You are welcome to use macros as well, though the ones already included in mm.c are the only ones we used in our sample solution, so it's possible without more. For more info on macros, check the GCC manual.

Memory System

The memlib.c package simulates the memory system for your dynamic memory allocator. In your allocator, you can call the following functions (if you use the provided code for an explicit free list, most uses of the memory system calls are already covered).

The Trace-driven Driver Program

The driver program mdriver.c in the lab5.tar.gz distribution tests your mm.c package for correctness, space utilization, and throughput. Use the command make to generate the driver code and run it with the command ./mdriver -V (the -V flag displays helpful summary information as described below).

The driver program is controlled by a set of trace files that are posted on attu (if you want to work on another computer, you can copy these files and then update the TRACEDIR path in config.h). Each trace file contains a sequence of allocate and free directions that instruct the driver to call your mm_malloc and mm_free routines in some sequence. The driver and the trace files are the same ones we will use when we grade your submitted mm.c file.

The mdriver executable accepts the following command line arguments:

Programming Rules

Evaluation

Your grade will be calculated (as a percentage) out of a total of 60 points as follows:

Hints

Heap Consistency Checker

Dynamic memory allocators are notoriously tricky beasts to program correctly and efficiently. They are difficult to program correctly because they involve a lot of untyped pointer manipulation. In addition to the usual debugging techniques, you may find it helpful to write a heap checker that scans the heap and checks it for consistency.

Some examples of what a heap checker might check are:

Your heap checker will consist of the function int mm_check(void) in mm.c. Feel free to rename it, break it into several functions, and call it wherever you want. It should check any invariants or consistency conditions you consider prudent. It returns a nonzero value if and only if your heap is consistent. This is not required, but may prove useful. When you submit mm.c, make sure to remove any calls to mm_check as they will slow down your throughput.

Submitting Your Work

Submit your mm.c file to the Catalyst Drop Box for this assignment.