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
的优化 v2realloc
的优化 v3Results for mm malloc:
trace valid util ops secs Kops
0 yes 99% 5694 0.007401 769
1 yes 100% 5848 0.006883 850
2 yes 99% 6648 0.011138 597
3 yes 100% 5380 0.008327 646
4 yes 100% 14400 0.000092156013
5 yes 92% 4800 0.006244 769
6 yes 92% 4800 0.005888 815
7 yes 55% 12000 0.142196 84
8 yes 51% 24000 0.277304 87
9 yes 50% 14401 0.018129 794
10 yes 86% 14401 0.000132108933
Total 84% 112372 0.483734 232
Perf index = 50 (util) + 15 (thru) = 66/100
next fit
fitted_p
并且需要在多处维护:初始化,分配,合并best fit
next_fit
会降低内存利用率,而 best_fit
会降低吞吐率,但我们可以进行一个折衷,即在 fitted_p
后部分首次适配,而在 fitted_p
前部分最佳适配_next_fit
Results for mm malloc:
trace valid util ops secs Kops
0 yes 91% 5694 0.001803 3158
1 yes 92% 5848 0.001315 4446
2 yes 97% 6648 0.003706 1794
3 yes 97% 5380 0.003602 1494
4 yes 100% 14400 0.000085169213
5 yes 91% 4800 0.004207 1141
6 yes 90% 4800 0.003837 1251
7 yes 55% 12000 0.057487 209
8 yes 51% 24000 0.029497 814
9 yes 50% 14401 0.054370 265
10 yes 70% 14401 0.000116124684
Total 80% 112372 0.160025 702
Perf index = 48 (util) + 40 (thru) = 88/100
2022.12.29 ~ 2022.12.30