From f8b538c213683ae351bdcf8e3a706111a6ee894b Mon Sep 17 00:00:00 2001 From: GentleCold <1952173800@qq.com> Date: Thu, 29 Dec 2022 22:34:04 +0800 Subject: [PATCH] mm malloc v1 - 66 --- labs/malloclab_lab/Makefile | 2 +- labs/malloclab_lab/mdriver | Bin 32528 -> 42816 bytes labs/malloclab_lab/mm.c | 254 +- labs/malloclab_lab/mm.o | Bin 2160 -> 17584 bytes labs/malloclab_lab/solve_note.md | 64 + labs/malloclab_lab/traces/amptjp-bal.rep | 5698 ++++++ labs/malloclab_lab/traces/binary-bal.rep | 12004 +++++++++++++ labs/malloclab_lab/traces/binary2-bal.rep | 24004 +++++++++++++++++++++++++ labs/malloclab_lab/traces/cccp-bal.rep | 5852 ++++++ labs/malloclab_lab/traces/coalescing-bal.rep | 14404 +++++++++++++++ labs/malloclab_lab/traces/cp-decl-bal.rep | 6652 +++++++ labs/malloclab_lab/traces/expr-bal.rep | 5384 ++++++ labs/malloclab_lab/traces/random-bal.rep | 4804 +++++ labs/malloclab_lab/traces/random2-bal.rep | 4804 +++++ labs/malloclab_lab/traces/realloc-bal.rep | 14405 +++++++++++++++ labs/malloclab_lab/traces/realloc2-bal.rep | 14405 +++++++++++++++ 16 files changed, 112686 insertions(+), 50 deletions(-) create mode 100644 labs/malloclab_lab/solve_note.md create mode 100644 labs/malloclab_lab/traces/amptjp-bal.rep create mode 100644 labs/malloclab_lab/traces/binary-bal.rep create mode 100644 labs/malloclab_lab/traces/binary2-bal.rep create mode 100644 labs/malloclab_lab/traces/cccp-bal.rep create mode 100644 labs/malloclab_lab/traces/coalescing-bal.rep create mode 100644 labs/malloclab_lab/traces/cp-decl-bal.rep create mode 100644 labs/malloclab_lab/traces/expr-bal.rep create mode 100644 labs/malloclab_lab/traces/random-bal.rep create mode 100644 labs/malloclab_lab/traces/random2-bal.rep create mode 100644 labs/malloclab_lab/traces/realloc-bal.rep create mode 100644 labs/malloclab_lab/traces/realloc2-bal.rep diff --git a/labs/malloclab_lab/Makefile b/labs/malloclab_lab/Makefile index 3d5dc9e..d1b3f36 100644 --- a/labs/malloclab_lab/Makefile +++ b/labs/malloclab_lab/Makefile @@ -6,7 +6,7 @@ VERSION = 1 HANDINDIR = /afs/cs.cmu.edu/academic/class/15213-f01/malloclab/handin CC = gcc -CFLAGS = -Wall -O2 -m32 +CFLAGS = -Wall -Werror -O3 -g -DDRIVER -std=gnu99 -Wno-unused-function -Wno-unused-parameter -m32 OBJS = mdriver.o mm.o memlib.o fsecs.o fcyc.o clock.o ftimer.o diff --git a/labs/malloclab_lab/mdriver b/labs/malloclab_lab/mdriver index ae6a5a14bebff45ac102afbde85f960ec7fe4446..ad53776447e3269d6d32a02499f755db016475b5 100644 GIT binary patch delta 18097 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 C2{i`* diff --git a/labs/malloclab_lab/mm.c b/labs/malloclab_lab/mm.c index a482a43..710f1e0 100644 --- a/labs/malloclab_lab/mm.c +++ b/labs/malloclab_lab/mm.c @@ -24,11 +24,11 @@ ********************************************************/ team_t team = { /* Team name */ - "ateam", + "team", /* First member's full name */ - "Harry Bovik", + "GentleCold", /* First member's email address */ - "bovik@cs.cmu.edu", + "1952173800@qq.com", /* Second member's full name (leave blank if none) */ "", /* Second member's email address (leave blank if none) */ @@ -37,74 +37,230 @@ team_t team = { /* single word (4) or double word (8) alignment */ #define ALIGNMENT 8 - /* rounds up to the nearest multiple of ALIGNMENT */ -#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7) +#define ALIGN(size) (((size) + (ALIGNMENT - 1)) & ~0x7) + +// My define +#define WSIZE 4 +#define DSIZE 8 +#define FSIZE 16 +#define CHUNK 1 << 10 + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define PARSE(v) ((v) & ~0x7) +#define PACK(v, a) ((v) | (a)) + +#define HEAD(bp) ((byte *)(bp) - WSIZE) +#define FOOT(bp) ((byte *)(bp) + SIZE(bp)) +#define SIZE(bp) (PARSE(GET(HEAD(bp)))) +#define ALLOC(bp) (GET(HEAD(bp)) & 0x1) + +#define GET(p) (*(word *)(p)) +#define SET(p, v) (*(word *)(p) = (v)) + +#define NEXT(bp) (FOOT(bp) + DSIZE) +#define PREV(bp) ((byte *)(bp) - PARSE(GET((bp) - DSIZE)) - DSIZE) + +typedef unsigned int word; +typedef char byte; + +// mark the front and tail pos +void *front_p = NULL; +void *tail_p = NULL; +// My func +/** + * add a blank chunk and coalesce + * will update tail_p + * @param size align by 8, excluding head and foot + * @return new bp + */ +static void *_extend(size_t size); -#define SIZE_T_SIZE (ALIGN(sizeof(size_t))) +/** + * coalesce blank chunk before and after bp + * @param bp loaded point + * @return bp after coalesce + */ +static void *_coalesce(void *bp); +static void *__coalesce_prev(void *bp); +static void *__coalesce_next(void *bp); +static void *__coalesce_all(void *bp); -/* - * mm_init - initialize the malloc package. +/** + * traverse and find first fit, then place in + * @param size align by 8, excluding head and foot + * @return */ -int mm_init(void) -{ +static void *_first_fit(size_t size); + +/** + * allocate the block and cut sometimes + * @param size align by 8, excluding head and foot + */ +static void _place(void *ptr, size_t size); +// end + +/** + * initialize the malloc package. + * get a new chunk, set front_p and tail_p + */ +int mm_init(void) { + if ((front_p = mem_sbrk(WSIZE)) == (void *) - 1) return -1; // blank + front_p += DSIZE; // first chunk + if (!_extend(CHUNK)) return -1; return 0; } -/* - * mm_malloc - Allocate a block by incrementing the brk pointer. - * Always allocate a block whose size is a multiple of the alignment. +/** + * find first fit or extend */ -void *mm_malloc(size_t size) -{ - int newsize = ALIGN(size + SIZE_T_SIZE); - void *p = mem_sbrk(newsize); - if (p == (void *)-1) - return NULL; - else { - *(size_t *)p = size; - return (void *)((char *)p + SIZE_T_SIZE); +void *mm_malloc(size_t size) { + size_t adjust_size = ALIGN(size); + size_t extend_size; + void *bp; + if ((bp = _first_fit(adjust_size)) != NULL) { + return bp; + } else { + extend_size = adjust_size; + if (!ALLOC(tail_p)) { + extend_size -= (SIZE(tail_p) + DSIZE); + } + bp = _extend(MAX(extend_size, CHUNK)); + if (bp == NULL) return bp; + _place(bp, adjust_size); + return bp; } } -/* - * mm_free - Freeing a block does nothing. +/** + * free a block and coalesce immediately */ -void mm_free(void *ptr) -{ +void mm_free(void *ptr) { + size_t size = SIZE(ptr); + SET(HEAD(ptr), PACK(size, 0)); + SET(FOOT(ptr), PACK(size, 0)); + _coalesce(ptr); } -/* - * mm_realloc - Implemented simply in terms of mm_malloc and mm_free +/** + * implemented simply in terms of mm_malloc and mm_free + * if size <= old_size, then cut instead of malloc and coalesce + * if the rest blank are enough for the size, then coalesce + * if too big, then cut again */ -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; -} - - - - - +void *mm_realloc(void *ptr, size_t size) { + if (ptr == NULL) return mm_malloc(size); + if (size == 0) return NULL; + void *new_ptr; + size_t old_size = SIZE(ptr); + size_t adjust_size = ALIGN(size); + if (adjust_size <= old_size) { + if (old_size - adjust_size >= FSIZE) { + _place(ptr, adjust_size); // just cut + if (NEXT(ptr) != tail_p && !ALLOC(NEXT(NEXT(ptr)))) __coalesce_next(NEXT(ptr)); + } + return ptr; + } else { + if (ptr != tail_p && !ALLOC(NEXT(ptr)) && SIZE(ptr) + SIZE(NEXT(ptr)) + DSIZE >= adjust_size) { + if (NEXT(ptr) == tail_p) tail_p = ptr; + size_t new_size = SIZE(ptr) + SIZE(NEXT(ptr)) + DSIZE; + SET(HEAD(ptr), PACK(new_size, 1)); + SET(FOOT(ptr), PACK(new_size, 1)); + if (SIZE(ptr) - adjust_size >= FSIZE) { + _place(ptr, adjust_size); + } + return ptr; + } + if ((new_ptr = mm_malloc(size)) == NULL) return NULL; + memcpy(new_ptr, ptr, old_size); + mm_free(ptr); + return new_ptr; + } +} +// my func +static void *_extend(size_t size) { + void *bp; + if ((bp = mem_sbrk(size + DSIZE)) == (void *) - 1) return NULL; + // init chunk + SET(bp, PACK(size, 0)); + bp += WSIZE; + SET(FOOT(bp), PACK(size, 0)); + // init mark point + tail_p = bp; + return _coalesce(bp); +} +static void *_coalesce(void *bp) { + // one chunk + if (bp == front_p && bp == tail_p) return bp; + if (bp == front_p || ALLOC(PREV(bp))) { + if (bp == tail_p || ALLOC(NEXT(bp))) return bp; + return __coalesce_next(bp); + } else if (bp == tail_p || ALLOC(NEXT(bp))) { + return __coalesce_prev(bp); + } else { + return __coalesce_all(bp); + } +} +static void *__coalesce_prev(void *bp) { + void *prev = PREV(bp); + size_t new_size = SIZE(prev) + SIZE(bp) + DSIZE; + SET(HEAD(prev), PACK(new_size, 0)); + SET(FOOT(bp), PACK(new_size, 0)); + if (bp == tail_p) tail_p = prev; + return prev; +} +static void *__coalesce_next(void *bp) { + void *next = NEXT(bp); + size_t new_size = SIZE(next) + SIZE(bp) + DSIZE; + SET(HEAD(bp), PACK(new_size, 0)); + SET(FOOT(next), PACK(new_size, 0)); + if (next == tail_p) tail_p = bp; // should also change + return bp; +} +static void *__coalesce_all(void *bp) { + void *prev = PREV(bp); + void *next = NEXT(bp); + size_t new_size = SIZE(prev) + SIZE(bp) + SIZE(next) + FSIZE; + SET(HEAD(prev), PACK(new_size, 0)); + SET(FOOT(next), PACK(new_size, 0)); + if (next == tail_p) tail_p = prev; + return prev; +} +static void *_first_fit(size_t size) { + void *bp = front_p; + void *after_p = NEXT(tail_p); + while (bp != after_p) { + if (!ALLOC(bp) && SIZE(bp) >= size) { + _place(bp, size); + return bp; + } + bp = NEXT(bp); + } + return NULL; +} +static void _place(void *ptr, size_t size) { + size_t p_size = SIZE(ptr); + if (p_size - size >= FSIZE) { + SET(HEAD(ptr), PACK(size, 1)); + SET(FOOT(ptr), PACK(size, 1)); + // DSIZE adjust + size_t adjust_size = p_size - size - DSIZE; + SET(HEAD(NEXT(ptr)), PACK(adjust_size, 0)); + SET(FOOT(NEXT(ptr)), PACK(adjust_size, 0)); + if (ptr == tail_p) tail_p = NEXT(ptr); + } else { + SET(HEAD(ptr), PACK(p_size, 1)); + SET(FOOT(ptr), PACK(p_size, 1)); + } +} diff --git a/labs/malloclab_lab/mm.o b/labs/malloclab_lab/mm.o index 19793166db68252f7e0a95a7d4542a642fe39da1..fd45e145b4f9d97bcd4ff8f137640cd4accb0627 100644 GIT binary patch literal 17584 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 Op2WDFwh%JA`Tqdq{Cc$j literal 2160 zcma)7&ube;6dq}nRB_a`Yzz&=Z3T6MOPxUqrX;0MuNBEAb?s2wNx?L0NnZcJT1l){ z#V)0xC{1mQA*WtisIR^CP`&|?lhB=lmaLH)kn8EbI^?Sr@9``&x=X6DU| z^sq2hjKyL?OH3G|%Y@jw5JpA=7#97aFNj}K1ODoLk9`!hYm@)J06 zorUcaI!nG&a>ZoH^ENZ%_0QMVMVa5RN>f(cmUNa{VG}L_`k`+r-5DG@5EJ?Q`q~JG}Cu_%+&1zGim*1ChlC$ zo2k4aYFq=j2vx@}mS8`E(qDzL<~OYQtzntz#|g_EXkVB%M`q0Iq?wsFhb(j0GDoa{ z7JAG9>%dH7vXu1{lOBbW4q(!BKH?15e9Za~?)_yFy_X5`q7%(A*tLil=c*WII|`Ew z!Bgvsan{AqX9#`6HNV_VhGhgN)^!=;)h-F*J?D7rY(}0}Kh|pk^;wZ$iHzuvUlKCH znRojf{}_A`%CqA5d7wTga>lf9{E8yHQ+?d8>&gl~_F8StC%UC-wO$dny>atBx#IYC zqhkB3t=hUQZwPy0YG&M;vS*6L*}|MXXN^x4Y~ebt-7I_S9KP&14$*VMI*3&on<98c zuVK!3uMn>Td$5=+FwrN(rt&{j{_m9kSE9Q7F>H``f|yju_d?En5i`Izt^j|hh`z!t zh0lp>ylif|eyI%fy%1Nm#aC)A+3@NO$MZMC+RiH4SaKa9SG;=jxbDEmi!6Uuj_Z~qwVKcHIJPs&v&U%(iYvWmesfvm@u##*fZHk9@FTSXa+ zK2mT^--XTm|H{j%F*kq|)*A}V;LCc{yh2@X3{G`jf;_H|@*y<3k39s2;p0Ad9rQkC zVYBWPKG~I%a>rm4MdHQ#q>3R)6 z!sZyAw+C{{1SLA}d+_Lfe@8&?m%mWV<2giYfr=kcco9yXzs{r0TDr$D#VJVeKR^Ou T9SZMWH19bk`Z