mem_init
中可以看出整个分配器是在一大段已经分配好的连续的内存中进行的mem_sbrk
进行扩展时也是连续扩展,模拟堆的向上增长malloc
也是八字节对齐,所以可以满足强制八字节对齐的要求traces
测试用例来测试理解逻辑后,接下来将实现自己的版本
typedef unsigned int word;
typedef char byte;
// mark the front and tail pos
void *front_p = NULL;
void *tail_p = NULL;
bp == front_p
则 PREV(bp)
内的值无效,tail_p
同理size
均应在传入之前对齐,均不包含头尾部大小#debug
对于 segmentation fault
使用 gdb
获取头尾块的 size
发现尾部异常值 0xcdcdcd
,在代码中使用 print
跟踪 trail_p
变量,发现在__coalesce_next
处没有及时更新#bug1
若记录的 size
是有效载荷的 size
,合并和分割时应注意增减 DSIZE
#bug2
每次合并都需要判断 tail_p
是否改变,特别是 __coalesce_next
的情况Results for mm malloc:
trace valid util ops secs Kops
0 yes 99% 5694 0.007579 751
1 yes 100% 5848 0.006639 881
2 yes 99% 6648 0.010560 630
3 yes 100% 5380 0.008016 671
4 yes 100% 14400 0.000102140762
5 yes 92% 4800 0.006677 719
6 yes 92% 4800 0.005988 802
7 yes 55% 12000 0.141468 85
8 yes 51% 24000 0.274197 88
9 yes 33% 14401 0.128358 112
10 yes 50% 14401 0.002138 6734
Total 79% 112372 0.591722 190
Perf index = 47 (util) + 13 (thru) = 60/100
realloc
的优化 v1new_size <= old_size
则不分配而是切割new_size
则合并realloc
的优化 v22022.12.29 ~ 2022.12.30