From cc75799cf6b5098dcef482a58c7226d62ec33946 Mon Sep 17 00:00:00 2001 From: AquaOH <2863896505@qq.com> Date: Thu, 21 Dec 2023 22:12:15 +0800 Subject: [PATCH] update --- mdriver | Bin 31888 -> 38888 bytes mm.c | 381 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- mm.o | Bin 1924 -> 13268 bytes 3 files changed, 355 insertions(+), 26 deletions(-) diff --git a/mdriver b/mdriver index e7a57c7fbfe3eba7b58a6f84054e9885739bb252..36aaaf021b31700ec4dff6e1fd04f1e8ed44bcb2 100755 GIT binary patch delta 15323 zcmaib349b)^8b5%%@rn-`yh}B1PDha2LWLXnn2WW2$66^R6iSRw%^PBi*$-{PuO5>AIVt}3f^&bk$Nk&4^3^x_q8lP% z5;~&6JRJg{g!hH%?Z849CjDBRp@Z-;wL-{N9~V-il7?6=SKkp*-J3$jprddahgdBc zf`1ccPyYLd;M^hhj}Fm)6sET`rZ$La?n6Ut#)jEYA6E{+sY9@TNc&fY;2(zIkO-%t5-L)I@PbFAJos~m(+)q1#ZST zGq47DwdpNgNwp>kwY9?-Q`lx5M`>7QztwSqh9&lU9lyBwHwt4S z`;(4snqFWp12go`ge>X~0q8VNr&DygNT+Lb+N#rgbo!u9x9ao_ou1Pv&kp*J(rJQD zp8$1J$2)bwA9dQN)8d?9!-YCsrqfED*6Q?Lop$O})#<}J-J{bZI{i_n@wpg31(1~+ z?C2Vu&eiD>oo>|WCY|1|(>|TPrPD(?{aB|z=rnF}(EoUyX6tmyWaOU$xK0;1b=soS zcAY+?(KI3?J@GM(P3 zQ?E|%*Xf^i`l?R9(CMhD!S+*iTBK9+V>SodlREuHrw>l;US@ehdcpR4k^iJV z8FN5*b$EAU?Co6ON$S7iZp;}A=f0LB?LWFwI$y*H81wdf&P4cHjV1mG=K}%HK3n^b zEvNggIYK)BU*goY@wW&y3F-&&^Z2dZqZ1Z!;fDluUE&q|g!+79g?0T;S|j*a;{PR9 zwI}5pY#6csjcBzpsYLL`sxKvNO#C7S-CloSe9J*};MvWuTwuIor@uE&ou52UcsEYn znmk6hEn3~1JV}@l-F+_EDGi@`E)XaSw8r`~!7K~3Ci>ICc=OWzDcx&Q{emF|`;q@` zle%J5hVY_Ay>HZfp~#{h8)X-A&D|GAanA4G@ylpYa6~^a?(Iny53@n*sXY=1_yy#ry34mHUCQb8 zoVP`Ge2SJmw4Zs-+ao*PCnRX7AhM&6kci91^BZuD?D#VYFl7*6^M&B|B#?swG>hz@ zKzfv*0EUqr9@;5;P%qR5!L_#b;7R~Nwbu4vgC<}HxVgt11O)&KdQd8)*#I!J2R8!* z&}-|I9wbcz0&C6avFbo#t;2gzx0=StTCF*~)WF6f-T$Z8(`(zS*GeZ1f|YuA`wA}l zno(Ov%Q_I%p2vM zBk36Wy-P}c^U@>yFMUV;-YP<+6kgO^s=ox>fn~lZ-x{g?T~`tcbBfPL?!B=a`(|qX zZd$&#x(n4D(MO46fat)dl2M;@w=VL=`wAuROo_CZ=&r>}|9&wL2rTjbTF%{OoI#k99PpYxUl-nV{wKkYTJk?l0Y zKOIavu#>wM@M8=8SHPuj)`0gsIosotVtl1E49_P6yx&_CGvF&7xDjCdVXt&0?8s`b z_lSQN^5#8q)AI6LLRqfv>Xasz_`ih0=Z3>$n!| zKZuSD)axe$zIibhISs^H6g3d)t!x?kEBqh*A!AyHYc>BAv*r^H`@Qa27rjN|fcMC9 zzv)uL>aL}we$%%!Uum;2|7UEsmiecn+OfL5S^;b_pl|gAFfO%(Z{6J@MaZc~wD&LE14<;l4R-5ysOS~VH`r0mf_m+6R9PoGk8(BYJHvU`B z`N*{~-T}`6?xmq#Ie?kainL!7xgnc8fb@7vE_xT)Nc)w5w$)w!=g{rO-J@qRwiFfY zO2@_-dC%Jj#q*1?wa~La((}c@694-buq-?SQSNfzUuoFBluhl&Ta2fReZ$+2yJiMw zYx=iM{oZdeIZF|-Rt$T)kg`{8bfZg;^>Po5`|or)Jz5)?rm_oV9`Cek7dcn^NngJ$~XfMw<12J?-5QH6{xDMin| zo72;g89PSW)Hy5iWdzNUCdOve^IG$0+=3wT`bv$I5`W-(P@^X+ZlTy#C)=M0j62y@$qrA?II9 z{M~Q>BGUKz^3$$U={h+;f$BS+FZH?>fBAGYt**4t3?%1V{ zosh~uSFfEgayIF`Qo3gD*_X06xFL4_9phq;lXAx{T=sU+#K8OGgpf9S`@3z4e9x8S zk*&3Q<94afO>hWou6lApy5^KhuJe^~njdQ9@$=AjpgEZ+lXtC@zoJ-!1E6bHso(q! zt;A7Rt8*p}A9Lh*AW-6e=OaBm*kASesfOi0{zaCbT&3POF=N;(6kOaLE=<wDigQ)G|jVe^c#nJQL}k ziwP@A&+slvpLAr{8MPp54Bx6&XFUng7DkK;XtQprVpn1^>T} zs!_S|e7l;Fd%f}S7v$;e73!V2*9i9=QTOFe7Zw~*10b!6Mb7$F_L&Ve6%8yWJ2!XAl*0vL2VJ7Dr{hdTdTg_rRP8 z?mmc3U^+&bu`du{*m0-r4+PRdi$P0p2V#6T5I6&yY3~IB(;#mHZ3Hbl6bRU{@f$w~ z1WtfX104X(K$Kp81v(A14fGi3XP_T~4uJYWBXBQN{AnPN0a^oE0NMt+ z2-FYi0v!Oo7u1LhZZ%_@O9ZnEf(+1opf#Wapj$xGaX(dzSy%+x23iAZ#KdkVic)zK zG!gV8&@#{g&>GMP+&&6S`4}q^k&clplvsR@q?ikH*J1o0<;J83~0tz zfj}Z|+loQ6LEFAY0H8gf8$ioWBVf>)Gl9S)+|gxVjsM!JK63r2xY&beLhG%_V6=k} zZ&%;Besp}qzCZw3)s8$|Yj6%6RL%3Ja;6r}{}azv&&~fEPgkE?FkGI7$^Sy#U7DVN0B(BkMV*w8tk7!o2#c%{*IJE>%zLfU4VDGCvSO(EVYdr*x9N5rLZLOnBQCMp zuC+!ihq1A6zg3!LnHyq@Eb~Kbp=GwNM{Qw;WBDk$LvVH#{o0|^c5=2!yw+;#kY-t9 zJ+d&{n&`B~E`tXf{6-Y^!T)PkX^y4Hnpk2@5oTEv3$3wphU({%ez`Tact|^RQ-t$H z1+}#mtKb;`>UdLd6!WbqGp+VwtF6qM(yB45&FGYZ?z2jTmRU%N4)9}yrWY{)39D#+ zxStMjmeuBwuC>O_wc03u5eQxLP-I!EBR4rjBT9DxR+x>JA~~6-2h$-Il9MuPEV9uU z?qnvyNV!gnZml(Cmd30L>xAw?*n{x-EPN)CPaITAJ0a_V>>zA*7QPa#w-oqY_-o)`N9}?k!6-yH%JF>opg<6t92QR()|YRX;^en7#Wa# z7$&1|@*z6}*>W;MkF{n>En~EwmqC|^eVcgFl^{vvrx9}d(LhW9cG{7GEA2!nN7ed8 z$xD6*whryI=MAW+4Lz3CK!*KCJ4i;GRuyDe!Gp4oAX@<$3R^p}as3{$n~$m=E^;Ut zXkT+wjb1!fSp>H3sCw1n3CZ_>J%dJMOb0F3EszE zv1@4u4b29S4H@1vXv1vKhe>;5S(q(_oDbQeA+i$4N`}a)Ae%Qt)@Ei4STTg5v{C+l z4Z|YH;;3_NrI*s;W~AE*9oY}nWk5&!@4VycAD4_(`oZoxt{wxM0@wSFtIE=`Ba6Wr zPXq$P$uTBxDZEl%RzPk$q0U*FJ8}z|;8*5XL6ZU(ObWp7f;{`A`pD9&l<&d*`lR~d z(v>FKiSzK&^QyL^RhG?AUV-Gn54)c%dqGr7mPbU>%TjGFktyu9ta!Rwzx*n0QlDF% zWqJ^v@ZN~ksh=;;N;-quz&#qZVEv$v0OQ?3gHzocF>yy(xom!Y4r8z4e0`3(vZ~2V zC59hU9Knjt9?#edp(26wAuK1EaZNd51_UFttbqx)9EKp6^iBfa9WhZdB%^zgD_;}h z#*c{zh6zDkTu}F^CY0UuQg@^z*Ven3Xp~ow(rB;|kz^-Gs$`;@1CtLIds?h$HN6GS z9F0rlMqHTL4J#Y5lC`!fheZ)3FVGWhkundi4aJ&7Dc zl0cqg=+7GqxKar|Qw#bAZo9<|GiIV?oD5Td4~h0-hYI8Hs#M3Ho>j z>{B=;8uQd(q<;n5jgvnLAJMdCV;=_`!Lxx&G@m4;B#hvRlmzz)=&58i*Qr6*XMsHd&!rT!;lsQeG{G(kV3-Iq9x_0T>w7Lsc)1bX3Rd=21fl6(wwoFtUmXGju* zL5Vc5+1N#>WRo|5p?W%qh=Or2{_sSMpS1j`kl9(??8h)OlV0|gabWba$2jn-^(jSs zzcv7V4dOPKHGx(EQ)mpEwfUN=P5A@buEr9Eqh+&JHQAHU|1*GmD{U7v!7W+?dVE`g zGoqHYY71s1zzUp+lpPge@CY<(KLn)B%WCLu!S37;NYXldi1vg|I(Ia?H%tGEX z(-Os_m9jK`qr5at;P4O=3SJvFb{q!}r6EljmlWlOeL>>-B(jaW)Z3*L#nVvk=1CN2 zf`eb36l{+1j7ypwL*0d%Ck_U&IDta2EKQ3bw@DVh7;}*v%n3<`I}mQLsXN$piZ*E& z-iRnZ#u{T0Q-`OLfej5u>XV3@^;9Gs>9tecrNwZIB{)mubCfnvebTN@%1^>QO&+^0 zCTKyKOAogo!59q3P2;gpQH(PB-IAvzf7)OoX;fue zOjzd*Ml)J(4K7PeemAx*8F%c9Xv^UI0+tX6b^?YIOe*#ZlpId%ZEP`4fu{)|1+Ui*{Sg9s);qTCzZ!ns|nK8n$9{HH^h!2Xw0| zbR#m!((Lks_E#z5M|a&Fnx1$Bzf_J-lX<3Hj?c%K`Bri7`g>I@pTz%PMjedaaFSB{!KP2JYQDGv1oBnQeyHc z+?E5IEDL|G8m=PNC8v?3-WD)BZ% ze1+1|(kk0%Dq>(~?2rwj8RHjXW8z|9iL5*Z`KFd_k0T+xOqN9_m-#K#vRQ0Ey2Yq6 zMLfX=lWjsUS7M3Crc^YWaictpTsY)mcDjnn3J;>2XSdtIi>-4!bF~r?l^HYULXiNI z;bmalw9IgOD1LYsEwh-II0(h{&tfqBRwE?QM#L1CR zDmTKAW|JDskgZ&qBTGuIW@J?+$kJR&xooJOLm_$HoGQ|dBxv*Lnlr?&2_{$~;!ms$ zeQcvXl*iC=kLD#(5!><=(ukYgJO-nWk|VZZNr+FO6(tpSVO)-GfrTTO-eBE(V}Js3X(E~MA74PGGz(SX0$`w9;YQp zP)gu24gzD2R*70IEYNkL$)VM=yqW4*P_lISJV}t$L3N~pL=S4(I#(dGiU6j8y)pCTw;lV7n-`Ry`5#j}bRzntKT)g{Ea;i9JO@A%WE{563 zL|vmB+@W#qa#pNnmCf$j^-k7|OSy}YsJ>#gldWD|URz)5V&&yk&Sn>Du4!m;*<0$H zYgg4ftL*fu5yI{F$P*GV|(OeT!*EZC%dS{!fyrQnIp%T$HH&rrVXMGiohz&+uSyR!(s+@IB zm$SUC79*-gpXJpUVTD_>T-(r8)y(RsC+#xWlE#W`tPb`7uDZ$TM5k-%0eY3wH4okv zR981UDOoF9YU^CJ_2v3khhhH6O=FX@RgVttXyPz`l?@e0BHSR(CTB3@U^>dFjheb5 z&JCTTl4Z3tH)Yk`lzk0byhiQ$bSvwRaMUFAOoi)cCIGIUBmLVG-cM-U&XfLE`jbM zLWk64{@E;SmZVP03l`9j98}tEe&5VXr1#CAn-iNOO#{gV&8%Q<`Y8H?*@lT3oW;j% zlRiiLl+BVdS~CDM)WQwdTP*Oi#j@S7{bv+yO-eU?r{!?dXQl92Ma`7{M| z+U&vowe%SL@e6fiH#fXAlbb8{s7p0S6E11K~@-jK{#d6a}-fP5M$e zBcS(hgnof9)NG^;LI;UDgo6UVK@+*9M}-|E+ac^EGl{`yqhM&fLvs>z4Vm$jkurYD z=rv0s2$Spjn9+pl+j}n3brAqQkUsTQ$j0?rpY!lTYM}rdP(RW5&c2q2_tux zN+;kO0Z=0$dz*B~^sz~s1;nJxLu<{^(G*L`1lyUhyCjDIFBwlhFJ<>97QJSlS~4?UDD(K>Ouy34JU7Na#oT zJfZXQFF-+0`c?W;^ht6f%fSrzBvndmW=(9=S~iOE*~~@(OiNKnt4dp>)MnP)<|b82 z$fQlN1CD~JW_4Kd|1UoF%kRm0XYa{Ju;P zJMno5)BC)%kCL)adR>y6@ge;v1^(p!Am(Kz0- z>;n$HaU=a(z@hiVgx?EGi^R?a=p`wA1QTliH86co6T&|M)2A~b9N^l6RWP;Wz<~ET zp@T5J^W2`z*dHOJ4wHcC3zU$9F~Ib7Ob{oqiNN$VN=TmzT#|#=PI~)EP&C3Gn=uBM zfcK?t#x}s|kiNnV2cd&TTnqeJm;rsk@lhCF3w#7PID$lW5AeY-{r$k9gZym)?wyJkX%JEd zp8)p5-Udul9Q8B=#&wqjFQ}i_q$>38ch@r2T$}7Z0Jf|?=##TJ_6{|e7wRL5eMb6* zkUpNB2i}ku{3B>IdTc^U8ZiO%j*xHw`p`jto{GVX)eV#JehfV6M*=ra!yn&**v%$E z5IU&AY~awla%xZ-rnf`i09-IKnB!={%9bMMtPv*;J0`sy`o=80eFLWUYFK;nzvD8D z0{OoX>_UX}LVy~)3A{m{)F|ZeY)=`>|uuU;Rlx9(V($q(aBJ!1{r| zJb){@B+&3;!up)rkfD`B^lOITdxqdg!>}E$o(1kl09dYCK-yQ|;I%i;6hI#gB)!8Z zA%PttTo5d>D6FPWflJ^Z7Pd5^Z-7GwwKtGw{UDq;1UrCBrr@Gbbl6a&cMZ|sgaB<=C0LnShYyp!;L?D$19xG{+@U#p zafpMrfCsA-9UKKN!O&ht8Pf>pPZgnqM*I`mV<)1&_LJU-eW4#6bm*A=kPv#kPx=(v zHzwl;A{0P21h!l_(i=vi;!X9kZb1faChd!3#Y0d#zd1Ga{tEQ#?Hb+&h+S=-f`5*Giw(iGUoxH(O z?6wp5o@Cg%RGGdQc|^@wH(I7|NzSM@f~&&>)~Or8(bpyqs!y%kAqaB vcN(kdE^h{A$YL1|nf_|zz_l?Y;ksOTqFfeRPoapCJXsCe{*T6#tN5YLc6$HnHXz^!eq!-?=+$wmW>g zzxkbW=FH4FGjnGz%3HGgj^wsYGBz=-Ff9tvR#t+i*jaUq@OM69_Js($u5`A9GF7&0ISCW z_<#7>lNTj`X9U>46rlgaPj6$4*9AS`Iu&3u#m|QNm=(a|0{D19`$GZzMgaftU-=^} zKfvKX{J0IqoBbL@qF&+0X@LL6SLl+Z)3w55AFV?fw3U=rr;J$ zFS9>_Q;Eu8%m}mzoaRLrD;9!kfjb30C$LN4et`!BUJ@uh?D*}53{+GZr0u_OVnO?tX0_O{SOyC+qTI`#IV7I`R z1->fqyudMmR|Vb_sL%9vG)-W>K!?C$fn@@>3v2_rC?_uo!EXf~7Wk#WuLN4MydA{~ z%oaFb;6{P32<#QuC-AVqD+0gBVlHh_80}uiR)Jdtb_)EJz*hyH5O`YPZGk!2UOx*3 zmI{1RV81|Tt=F!!mVX!WOIH|{k{rp{6=aSu6I@DTY)If&kP}~xaT6+a*creQY8S!S zRe=#m2=NNyv5X}U2W};9U~DdNpek?$;tKvK`y&}7F_w)rDNkl>IT_%rZbpZ)jj^u? z!x&4)JmqA@b`k0rJ1o$Qc@f{A?Wqjgr{jGl-9gK5gQPF`Ym-jOr(-?!(La^s$Y_2e zW_9-LXvR9WkG9=zOzb>_SuocAb?bFg#}1=YiNC9=twWZ!+uN@V7mt!oITFR6ihW!@ z8pY4WE|n@gQ{ze{SwD$4Tjxlp`0uUj%v-+I8o|dZrP9J}lM8}vh@$d-1m7^(DPM@- zf0(?}x)6csSa$Nk?IY-*^<8P+a^o|vD( zR@byokYJPh`@h!fiNiXqFNdVuQ&qKXptr9HPmRWyPB#hLV_wHaqW1ug%}SOo@!45Z z7WYBWu1nR-TZa+{y%XCf{thfkT?V-E0F zvNGj~CH${hshZQl&K<0?f4b&}8nr5tFSweMhxFuKo6eUs*6%0bUa8#uCq+G~h|jer zOdGkRs!rwI&%BFq$hgMmXA>;n)-2B~;7{Ar!;jM7VxDP4=JxjUx9nEwC_ia$NhEnC z0_D|Z59G&?uI$XXL#QJo2=-umfj2OS;{d;qog|g=Z?lu7 zejb;T8FdnN!+LT=rR^`h{k$y49zud=S9Zhf)<%_eCnue0-4`vyp(1SbQYziI=4v5osY36E5LG{TbObUY;`$Uk#mczjD5_dIkD0nZk@BtIDCyf zeNw=;%_)|j9^;4R_c7T!q%w)Ydev-LY-1ZQHu7TkAI1Ha0ZWHH0$e zQI~{Eu07bZIheV9NL5dw?l_^U*MUx;H5m7$Gpc%s^>R1KHmZ37{J|0vrL} z13Ip%YC4Y9Dxd@C#;$DwjsV@0QK`pyb{5$3g{l^q&_GeuZWF(_EG4FN1bxFbD+)H+ z093EyktI`Omm*)7rB-tBy&0dp5BQRj*^-0rEO|?+=h@5uBvtbp%M0RB$7h#i#GgX-8#E$gDwNuB$Smji(`7jZD^kAsJU>{L<|;z90Go?e z9u=BzIb?Z|%_0HjQzzzL4|$cJEsdG>(2oOTw4cfYWVE+R17z4|am)#!FPM}A+H^}t zd2M-Y%GaopI)=u9b))uW^Q463vTwYuGuw>+K zRAz;^(E=AewwZrcnKfC#icnRxju!IQz&+r&F4b-1drc4Zmao-^zPE(2`HShp*H<@q z+|L%t^!rCEI(Ab%jHdLor==!g4G)3SO~l7P0H-^Gk6)m!M4|Rq0=NR+_Yh-m!bWCh zb_<-Iw7&M(b1p{L0Iwj9>2Y||W7lV3qC*{*e_DCuKo3Pd?2$?gFpkAT?}q*tLLU#s zWJKMxLlg(9#3{HmXR z3HZ1lUjaS}?wx>@RXQOU@iV9a_Z4#3KzjVT*bN~?;2CfQ_Ox3lMZ3U_&ENAE_?4Z> zt}aNAmV5n3+G`=7Pa677bszNQ_zgxyVlnJ@;MzMVO%lnDk-knN(8sc~;BNc|%7rKj zqnMA~--5)_!9x53wHF2VSQooN4e;xV4gxZm0B^wwa7=K6?*!L49DzF?#7F37`sr%w+&js*bgXbq}&C%Y>`uy}M5WnxoX+)QG zNTeMd(A21dt1z%(K)$5jp#}(grO?YriW_{L;93(zmo-#?vb z0C+zcV6elF+n{eFj%A5Ws||R!pPt(Hfa}DniIn5m8^j&nRTYV>^n+Jn0@0%Vur0vB zcmTi2SF}xXRpEF_!_h`Dil@Fsp)NB5_&jhYmH~AUi8(t0^gjZ(Vn0){U>%kP=yNdw z3pN6})cR{MAW5`sC>Jz`W;E#WOHyZmgV(^nUx!w95ZsB8zKw-S6F3rJKLYN?0Yr~A z(qADxj)La|zhOZCEm$Q8fM)Q&Flg}`KnTtX8{VgUEA(dKND@8O$YBDw1IyY<9Lq8X zyhogfv=ir&9`BrJ&i5+rYUWr>EyV3Y`TXlqkIA z*$@2)X1Iws2KWZJ9Rr};6Mq}rf%wy1fcUCoeh#U_bKpJ5F@s~8!9{Qj9E6Alp9k1~ z8^9y+bg0kt#6EvS^4w|UQNJ*4qoaFb**=o!T#{q?65$}9CL4UOtdx5|4@>FZ+ NQwZ&SOYiz1`v28&Y0Cfr diff --git a/mm.c b/mm.c index 0f4b275..1136b44 100644 --- a/mm.c +++ b/mm.c @@ -44,61 +44,390 @@ team_t team = { #define SIZE_T_SIZE (ALIGN(sizeof(size_t))) + +/* Basic constants and macros */ +#define WSIZE 4 /* Word and header/footer size (bytes) */ +#define DSIZE 8 /* Double word size (bytes) */ +#define CHUNKSIZE (1<<12) /* Extend heap by this amount (bytes) */ + +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +/* Pack a size and allocated bit into word */ +#define PACK(size, alloc) ((size) | (alloc)) + +/* Read and write a word at address p */ +#define GET(p) (*(unsigned int *)(p)) +#define PUT(p, val) (*(unsigned int *)(p) = (val)) + +/* Read and write a pointer at address p */ +#define GET_PTR(p) ((unsigned int *)(long)(GET(p))) +#define PUT_PTR(p, ptr) (*(unsigned int *)(p) = ((long)ptr)) + +/* Read the size and allocated fields from address p */ +#define GET_SIZE(p) (GET(p) & ~0x7) +#define GET_ALLOC(p) (GET(p) & 0x1) + +/* Given block ptr bp, compute address of its header and footer */ +#define HDRP(bp) ((char *)(bp) - WSIZE) +#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE) + +/* Given block ptr bp, compute address of next and previous blocks */ +#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE))) +#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE))) + + +/* 每个free list中块的大小范围 */ +#define SIZE1 (1<<4) +#define SIZE2 (1<<5) +#define SIZE3 (1<<6) +#define SIZE4 (1<<7) +#define SIZE5 (1<<8) +#define SIZE6 (1<<9) +#define SIZE7 (1<<10) /* 1 KB */ +#define SIZE8 (1<<11) +#define SIZE9 (1<<12) +#define SIZE10 (1<<13) +#define SIZE11 (1<<14) +#define SIZE12 (1<<15) +#define SIZE13 (1<<16) +#define SIZE14 (1<<17) +#define SIZE15 (1<<18) +#define SIZE16 (1<<19) +#define SIZE17 (1<<20) /* 1 MB */ + +#define LISTS_NUM 18 /* free list 的数量 */ + +/* Globe var */ +static char *heap_listp; + +/* 函数声明 */ +static void *extend_heap(size_t words); +static void *coalesce(void *bp); +static void *find_fit(size_t asize); +static void place(void *bp, size_t asize); +static void insert_list(void *bp); +int getListOffset(size_t size); +void delete_list(void *bp); + /* * mm_init - initialize the malloc package. */ int mm_init(void) { - return 0; + char *bp; + int i; + + if ((heap_listp = mem_sbrk((LISTS_NUM + 4) * WSIZE)) == (void *)-1) { + return -1; + } + PUT(heap_listp + LISTS_NUM * WSIZE, 0); + PUT(heap_listp + (1 + LISTS_NUM) * WSIZE, PACK(DSIZE, 1)); + PUT(heap_listp + (2 + LISTS_NUM) * WSIZE, PACK(DSIZE, 1)); + PUT(heap_listp + (3 + LISTS_NUM) * WSIZE, PACK(0, 1)); + + for (i = 0; i < LISTS_NUM; i++) { + PUT_PTR(heap_listp + WSIZE * i, NULL); + } + + /* Extend the empty heap with a free block of CHUNKSIZE bytes */ + if ((bp = extend_heap(CHUNKSIZE / WSIZE)) == NULL) { + return -1; + } + + return 0; +} + +/* + * 扩展heap的大小 + */ +void *extend_heap(size_t words) +{ + char *bp; + size_t size; + + /* Allocate an even number of words to maintain alignment */ + size = (words % 2) ? ((words + 1) * WSIZE) : (words * WSIZE); + if ((long)(bp = mem_sbrk(size)) == -1) { + return NULL; + } + + /* Initialize free block header/footer and the epilogue header */ + PUT(HDRP(bp), PACK(size, 0)); /* Free block header */ + PUT(FTRP(bp), PACK(size, 0)); /* Free block footer */ + PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1)); /* New epilogue header */ + + /* Coalesce if the previous block was free */ + return coalesce(bp); +} + + +/* + * 合并free block + */ +void *coalesce(void *bp) +{ + size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp))); + size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp))); + size_t size = GET_SIZE(HDRP(bp)); + + if (prev_alloc && next_alloc) { /* 前后都分配了 */ + bp = bp; + } else if (prev_alloc && !next_alloc) { /* 前分配, 后未分配 */ + delete_list(NEXT_BLKP(bp)); + size += GET_SIZE(HDRP(NEXT_BLKP(bp))); + PUT(HDRP(bp), PACK(size, 0)); + PUT(FTRP(bp), PACK(size, 0)); + } else if (!prev_alloc && next_alloc) { /* 前未分配, 后分配 */ + delete_list(PREV_BLKP(bp)); + size += GET_SIZE(HDRP(PREV_BLKP(bp))); + PUT(FTRP(bp), PACK(size, 0)); + PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0)); + bp = PREV_BLKP(bp); + } else { /* 前后都未分配 */ + delete_list(NEXT_BLKP(bp)); + delete_list(PREV_BLKP(bp)); + size = size + GET_SIZE(HDRP(PREV_BLKP(bp))) + + GET_SIZE(HDRP(NEXT_BLKP(bp))); + PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0)); + PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0)); + bp = PREV_BLKP(bp); + } + + insert_list(bp); + return bp; } /* - * mm_malloc - Allocate a block by incrementing the brk pointer. - * Always allocate a block whose size is a multiple of the alignment. + * mm_malloc - Allocate a block by searching the free list. + * Always allocate a block whose size is a multiple of the alignment. */ void *mm_malloc(size_t size) +{ + size_t asize; /* Adjusted block size */ + size_t extendsize; /* Amount to extend heap if no fit */ + char *bp; + + /* Igore spurious requests */ + if (0 == size) { + return NULL; + } + + /* Adjusted block size to include overhead and alignment reqs */ + if (size <= DSIZE) { + asize = 2 * DSIZE; + } else { + asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE); + } + + /* Search the free list for a fit */ + if ((bp = find_fit(asize)) != NULL) { + place(bp, asize); + return bp; + } + + /* No fit found. Get more memory and place the block */ + extendsize = MAX(asize, CHUNKSIZE); + if ((bp = extend_heap(extendsize / WSIZE)) == NULL) { + return NULL; + } + place(bp, asize); + return bp; +} + + +/* + * getListOffset - 得到大小为size的块应该在哪个list中 + */ +int getListOffset(size_t size) +{ + if (size <= SIZE1) { + return 0; + } else if (size <= SIZE2) { + return 1; + } else if (size <= SIZE3) { + return 2; + } else if (size <= SIZE4) { + return 3; + } else if (size <= SIZE5) { + return 4; + } else if (size <= SIZE6) { + return 5; + } else if (size <= SIZE7) { + return 6; + } else if (size <= SIZE8) { + return 7; + } else if (size <= SIZE9) { + return 8; + } else if (size <= SIZE10) { + return 9; + } else if (size <= SIZE11) { + return 10; + } else if (size <= SIZE12) { + return 11; + } else if (size <= SIZE13) { + return 12; + } else if (size <= SIZE14) { + return 13; + } else if (size <= SIZE15) { + return 14; + } else if (size <= SIZE16) { + return 15; + } else if (size <= SIZE17) { + return 16; + } else { + return 17; + } +} + +/* + * insert_list - 将free block插入到相应大小的free list中, 插入位置为表头 + */ +void insert_list(void *bp) +{ + int index; + size_t size; + size = GET_SIZE(HDRP(bp)); + index = getListOffset(size); + + if (GET_PTR(heap_listp + WSIZE * index) == NULL) { + PUT_PTR(heap_listp + WSIZE * index, bp); + PUT_PTR(bp, NULL); + PUT_PTR((unsigned int *)bp + 1, NULL); + } else { + PUT_PTR(bp, GET_PTR(heap_listp + WSIZE * index)); + PUT_PTR(GET_PTR(heap_listp + WSIZE * index) + 1, bp); /* 修改前一个位置 */ + PUT_PTR((unsigned int *)bp + 1, NULL); + PUT_PTR(heap_listp + WSIZE * index, bp); + } +} + +/* + * delete_list - 删除链表结点 + */ +void delete_list(void *bp) +{ + int index; + size_t size; + size = GET_SIZE(HDRP(bp)); + index = getListOffset(size); + if (GET_PTR(bp) == NULL && GET_PTR((unsigned int *)bp + 1) == NULL) { + /* 链表中唯一结点 */ + PUT_PTR(heap_listp + WSIZE * index, NULL); + } else if (GET_PTR(bp) == NULL && GET_PTR((unsigned int *)bp + 1) != NULL) { + /* 链表中最后一个结点, 不是唯一一个 */ + PUT_PTR(GET_PTR((unsigned int *)bp + 1), NULL); + } else if (GET_PTR(bp) != NULL && GET_PTR((unsigned int *)bp + 1) == NULL){ + /* 链表中第一个结点, 不是唯一一个 */ + PUT_PTR(heap_listp + WSIZE * index, GET_PTR(bp)); + PUT_PTR(GET_PTR(bp) + 1, NULL); + } else if (GET_PTR(bp) != NULL && GET_PTR((unsigned int *)bp + 1) != NULL) { + /* 链表中的中间结点 */ + PUT_PTR(GET_PTR((unsigned int *)bp + 1), GET_PTR(bp)); + PUT_PTR(GET_PTR(bp) + 1, GET_PTR((unsigned int*)bp + 1)); + } +} + +/* + * find_fit - Search the free list for a fit + */ +void *find_fit(size_t asize) { - int newsize = ALIGN(size + SIZE_T_SIZE); - void *p = mem_sbrk(newsize); - if (p == (void *)-1) + int index; + index = getListOffset(asize); + unsigned int *ptr; + + /* 小的class内找不到就到大的class内找 */ + while (index < 18) { + ptr = GET_PTR(heap_listp + 4 * index); + while (ptr != NULL) { + if (GET_SIZE(HDRP(ptr)) >= asize) { + return (void *)ptr; + } + ptr = GET_PTR(ptr); + } + index++; + } + return NULL; - else { - *(size_t *)p = size; - return (void *)((char *)p + SIZE_T_SIZE); - } } /* - * mm_free - Freeing a block does nothing. + * place - place the requested block at the beginning of the free block + */ +void place(void *bp, size_t asize) +{ + size_t csize = GET_SIZE(HDRP(bp)); + delete_list(bp); + if ((csize - asize) >= (2 * DSIZE)) { + PUT(HDRP(bp), PACK(asize, 1)); + PUT(FTRP(bp), PACK(asize, 1)); + bp = NEXT_BLKP(bp); + PUT(HDRP(bp), PACK(csize - asize, 0)); + PUT(FTRP(bp), PACK(csize - asize, 0)); + insert_list(bp); + } else { + PUT(HDRP(bp), PACK(csize, 1)); + PUT(FTRP(bp), PACK(csize, 1)); + } +} + +/* + * mm_free - Freeing a block. */ void mm_free(void *ptr) { + size_t size = GET_SIZE(HDRP(ptr)); + + PUT(HDRP(ptr), PACK(size, 0)); + PUT(FTRP(ptr), PACK(size, 0)); + coalesce(ptr); } + /* - * mm_realloc - Implemented simply in terms of mm_malloc and mm_free + * mm_realloc - 直接用malloc和free组合实现 */ void *mm_realloc(void *ptr, size_t size) { - void *oldptr = ptr; - void *newptr; - size_t copySize; - - newptr = mm_malloc(size); - if (newptr == NULL) - return NULL; - copySize = *(size_t *)((char *)oldptr - SIZE_T_SIZE); - if (size < copySize) - copySize = size; - memcpy(newptr, oldptr, copySize); - mm_free(oldptr); - return newptr; -} + size_t asize; + void *oldptr = ptr; + void *newptr; + /* free */ + if (0 == size) { + free(oldptr); + return NULL; + } + if (size <= DSIZE) { + asize = 2 * DSIZE; + } else { + asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE); + } + if (asize == GET_SIZE(HDRP(oldptr))) { + return oldptr; + } + + /* 缩小空间 */ + if (asize < GET_SIZE(HDRP(oldptr))) { + newptr = mm_malloc(size); + memmove(newptr, oldptr, size); + mm_free(oldptr); + return newptr; + } + + + newptr = mm_malloc(size); + if (NULL == newptr) + return NULL; + memmove(newptr, oldptr, size); + mm_free(oldptr); + + return newptr; +} diff --git a/mm.o b/mm.o index ec88a7a65d510a6f4f28cdf545e51a98774628cc..6f2a8c704b98f0602aac874656f6cc2f9d02b11b 100644 GIT binary patch literal 13268 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 M`n||iLg$kI2haSm{{R30 literal 1924 zcma)6L2nyH6dpTnae_5*f)7QFge6R6AYFN*2o)3wZ(KVOgd`$$dx+ZY+F6pwUOTea z$Uz7M3nfvo)Dt%@{Dz8iBq#7EIP}ONhjR0wlKH;fon}>#;7M=3`QCf;&CJ`ezb>y; zVzHP|784WVk_qugBFHTIkQXx|?dK=M1^Vf5@Z<)`;8%`!xBh%S9*@5n#zDM`^og6B z8&syfr=v|j;hm+u(b!EN7re8CcbeROFdVoy#A7i16y$|kAo{p^?|s`G>L zKUCj2&JX&@lgjA*^XbaDcahk$TioR@b#ft#DKC`BeXE zVL>Y_z8!`|2J2|CFFqBqFO#wBsYK!k%}ygW=Vt`EAJ`J00B5cU7luqeiW@TJO{~kg zk7agMrazjJsoO)DG=7tb%Bv-rDuo2)Tz3H9gsbnlgZX#xhj7lR`8_p%m@s7eQNoZJ z@5;KI-;jk>nXSs4A@hcuH+)*2k{M$t)7UI!{Ekh}gH1EoG+l}WgS{`P4-219Kq8|$ zQ&98QIFdpS_;@aD!tZ>PPrit-U$dx}K-DYqYnSC>Ha;n|2xr~xm-r{(s#jcJ1%C)< zpU62^#`U`);WwQTuL$8dS{;MA-`aPHj@4|o>%uhqx8BosZPz@go94AXh&)6#h$n4SUA1Q{XiG3Y>NP e#?(^1!&Iz-G&u=PosVxSTDJs&pH&f1)%^_(@(!*5