这次我上的一门关于computer system的课的project是写malloc这个C的built-in function。实际上这是一个被研究了很久问题,如何有效快速的分配内存。其实我们也不是说把这个project整个重新写一遍,我们是根据教授提供的malloc的代码改进。这次project评分就是根据这个改进的malloc的performance。既有空间使用量的评测,也有时间的评测。
昨天跟我的partner把alignment从16bytes改成8bytes,performance提高了2分,我们着实激动。alignment的意思其实就是free memory中各个block的基本单位。在32bit的machine上,16bytes的alignment的确有些浪费是因为很少有需要allocated的memory可以接近16bytes,甚至8个bytes都不到,16bytes的alignment就会有很多wasted space。导致接下来的operation效率降低。
这个memory allocator由4个主要的function组成,mm_init, mm_malloc, mm_free, mm_realloc。这些function都定义在一个叫mm.c的source file里。也就是说这个assignment已经给了我们一个基于implicit free list, first fit placement,boundary tag coalescing的memory allocator。 关于什么是implicit free list, first fit placement,boundary tag coalescing,这个会在整个project讨论完后加以阐述。这个function就是我们可以modify的。
mm_init是首先要被call,来initialize比如说initial heap area. 这个mm_init还一定要可以reinitialize这个allocator。这个mm_malloc是来分配memory空间的。这个mm_malloc会return一个pointer到一个分配好的memory block。大小是size。这个memory space一定要在heap里面而且不能与其他memory block重叠。这个还是比较intuitive的。这个mm_free还是比较好理解的,就是去free一个已经分配好的block,由这个ptr指着。这个ptr一定要是这个mm_mallocreturn的。这样才能保证那个block还没有被free。最后一个function就是mm_realloc。这个跟mm_malloc有点像,但是会有一些限制。这里面有点tricky的一点,就是这个分配的new block不一定是原来的那个block。这个跟新分配的空间有关。这个malloc很tricky是因为这里面有很多的untyped pointer,所以我们要写一个heap checker来看一下一致性。这个heap checker 在 debug的时候很有用。在这个mm.c 里面有一个function叫checkheap。
我们可以来稍微看一下这个lib。有5个function在lib里面是挺重要的。首先第一个就是mem_sbrk。这个function就是从free memory里面拉一部分memory放到haep里面,然后把pointer指到这一段memory的开头。这个mem_heap_lo会找到指向这个heap开头的pointer。这样对于需要搜寻整个heap的function,pointer就很容易移动。mem_heap_hi会找到整个heap最后一个pointer。mem_heapsize会找到整个heap的size。mem_pagesize会把这个系统page size告诉你。