From 234964fd870864a4b9fc8687f9acbe0c8ee8f7d8 Mon Sep 17 00:00:00 2001 From: GentleCold <1952173800@qq.com> Date: Sat, 31 Dec 2022 02:37:22 +0800 Subject: [PATCH] mm malloc v2 - 88 --- labs/malloclab_lab/mdriver | Bin 43844 -> 45156 bytes labs/malloclab_lab/mm.c | 236 ++++++++++++++++++++++++++++++++------- labs/malloclab_lab/mm.o | Bin 19116 -> 21784 bytes labs/malloclab_lab/solve_note.md | 83 +++++++++++++- 4 files changed, 273 insertions(+), 46 deletions(-) diff --git a/labs/malloclab_lab/mdriver b/labs/malloclab_lab/mdriver index 2c4aefcbe212cb89986194e9687a68eafaf17c7d..1ca2a70490235f978ebc0f7a061a26264cd0ac3b 100644 GIT binary patch delta 19862 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 Q_d1lW8@Ep$f2hm<1LTR9{Qv*} diff --git a/labs/malloclab_lab/mm.c b/labs/malloclab_lab/mm.c index 5e8a590..dbadeba 100644 --- a/labs/malloclab_lab/mm.c +++ b/labs/malloclab_lab/mm.c @@ -1,27 +1,11 @@ /* - * mm-naive.c - The fastest, least memory-efficient malloc package. - * - * In this naive approach, a block is allocated by simply incrementing - * the brk pointer. A block is pure payload. There are no headers or - * footers. Blocks are never coalesced or reused. Realloc is - * implemented directly using mm_malloc and mm_free. - * - * NOTE TO STUDENTS: Replace this header comment with your own header - * comment that gives a high level description of your solution. + * mm-naive.c - The clear list, first fit malloc package. */ -#include -#include -#include -#include #include #include "mm.h" #include "memlib.h" -/********************************************************* - * NOTE TO STUDENTS: Before you do anything else, please - * provide your team information in the following struct. - ********************************************************/ team_t team = { /* Team name */ "team", @@ -44,7 +28,9 @@ team_t team = { #define WSIZE 4 #define DSIZE 8 #define FSIZE 16 -#define CHUNK 1 << 10 +#define ADDRESS (sizeof(unsigned long)) +#define CHUNK 1 << 12 +#define MIN_BLOCK (2 * ADDRESS + DSIZE) #define MAX(a, b) ((a) > (b) ? (a) : (b)) @@ -62,14 +48,24 @@ team_t team = { #define NEXT(bp) (FOOT(bp) + DSIZE) #define PREV(bp) ((byte *)(bp) - PARSE(GET((bp) - DSIZE)) - DSIZE) -typedef unsigned int word; +#define POS_PRED(bp) ((byte *)(bp)) +#define POS_SUCC(bp) (((byte *)(bp) + ADDRESS)) +#define GET_PRED(bp) (*(word *)POS_PRED(bp)) +#define GET_SUCC(bp) (*(word *)POS_SUCC(bp)) + +typedef unsigned long word; typedef char byte; // mark the front and tail pos void *front_p = NULL; void *tail_p = NULL; -// used for next fit, updated by mm_init, mm_malloc, _coalesce + +/** + * used for next fit, updated by mm_init, mm_malloc, _coalesce + * @deprecated useless for clear list + */ void *fitted_p = NULL; +void *list_p = NULL; // My func /** @@ -89,6 +85,7 @@ static void *_coalesce(void *bp); static void *__coalesce_prev(void *bp); static void *__coalesce_next(void *bp); static void *__coalesce_all(void *bp); +static void *__coalesce_none(void *bp); /** * traverse and find first fit, then place in @@ -100,6 +97,7 @@ static void *_first_fit(size_t size); /** * find next fit, then place in + * @deprecated I'll use clear list * @param size align by 8, excluding head and foot * @return */ @@ -114,10 +112,30 @@ static void *_next_fit(size_t size); static void *_next_best_fit(size_t size); /** + * traverse blank block only and find first fit, then place in + * @param size align by 8, excluding head and foot + * @return + */ +static void *_first_fit_of_clear(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); + +/** + * just replace in of out in list + * @param in the block that in the list + * @param out the block that out the list + */ +static void _fix_list(void *in, void *out); + +/** + * check the number of blank list nums and real blank nums and print + * @deprecated + */ +static void _check(); // end /** @@ -127,7 +145,7 @@ static void _place(void *ptr, size_t size); int mm_init(void) { if ((front_p = mem_sbrk(WSIZE)) == (void *) - 1) return -1; // blank front_p += DSIZE; // first chunk - fitted_p = front_p; // init fitted_p +// fitted_p = front_p; // init fitted_p if (!_extend(CHUNK)) return -1; return 0; } @@ -139,8 +157,8 @@ void *mm_malloc(size_t size) { size_t adjust_size = ALIGN(size); size_t extend_size; void *bp; - if ((bp = _next_fit(adjust_size)) != NULL) { - fitted_p = bp; + if ((bp = _first_fit_of_clear(adjust_size)) != NULL) { +// fitted_p = bp; return bp; } else { extend_size = adjust_size; @@ -150,7 +168,7 @@ void *mm_malloc(size_t size) { bp = _extend(MAX(extend_size, CHUNK)); if (bp == NULL) return bp; _place(bp, adjust_size); - fitted_p = bp; +// fitted_p = bp; return bp; } } @@ -159,6 +177,11 @@ void *mm_malloc(size_t size) { * free a block and coalesce immediately */ void mm_free(void *ptr) { +#ifdef DEBUG + printf("---free---\n"); + _check(); + printf("----------\n"); +#endif size_t size = SIZE(ptr); SET(HEAD(ptr), PACK(size, 0)); SET(FOOT(ptr), PACK(size, 0)); @@ -183,22 +206,24 @@ void *mm_realloc(void *ptr, size_t size) { size_t next_size = (ptr != tail_p && !ALLOC(NEXT(ptr))) ? SIZE(NEXT(ptr)) + DSIZE : 0; size_t total_size = old_size + next_size; if (adjust_size <= total_size) { - __coalesce_next(ptr); - _place(ptr, adjust_size); // just cut + void *next = NEXT(ptr); + // remove + SET(POS_SUCC(GET_PRED(next)), GET_SUCC(next)); + SET(POS_PRED(GET_SUCC(next)), GET_PRED(next)); + if (next == list_p) { + if (GET_SUCC(next) == (word)next) list_p = NULL; + else list_p = (void *)GET_SUCC(next); + } + SET(HEAD(ptr), PACK(total_size, 1)); + SET(FOOT(ptr), PACK(total_size, 1)); + if (next == tail_p) tail_p = ptr; return ptr; - } - size_t prev_size = (ptr != front_p && !ALLOC(PREV(ptr))) ? SIZE(PREV(ptr)) + DSIZE : 0; - total_size += prev_size; - if (adjust_size <= total_size) { // coalesce prev or all - new_ptr = _coalesce(ptr); - memmove(new_ptr, ptr, old_size); - _place(new_ptr, adjust_size); } else { if ((new_ptr = mm_malloc(size)) == NULL) return NULL; memmove(new_ptr, ptr, old_size); mm_free(ptr); + return new_ptr; } - return new_ptr; } // my func @@ -209,6 +234,13 @@ static void *_extend(size_t size) { SET(bp, PACK(size, 0)); bp += WSIZE; SET(FOOT(bp), PACK(size, 0)); +#ifdef DEBUG + if (tail_p) { + printf("----extend----\n"); + _check(); + printf("--------------\n"); + } +#endif // init mark point tail_p = bp; return _coalesce(bp); @@ -216,9 +248,9 @@ static void *_extend(size_t size) { static void *_coalesce(void *bp) { // one chunk - if (bp == front_p && bp == tail_p) return bp; + if (bp == front_p && bp == tail_p) return __coalesce_none(bp); if (bp == front_p || ALLOC(PREV(bp))) { - if (bp == tail_p || ALLOC(NEXT(bp))) return bp; + if (bp == tail_p || ALLOC(NEXT(bp))) return __coalesce_none(bp); return __coalesce_next(bp); } else if (bp == tail_p || ALLOC(NEXT(bp))) { return __coalesce_prev(bp); @@ -233,31 +265,74 @@ static void *__coalesce_prev(void *bp) { SET(HEAD(prev), PACK(new_size, 0)); SET(FOOT(bp), PACK(new_size, 0)); if (bp == tail_p) tail_p = prev; - if (bp == fitted_p) fitted_p = prev; +// if (bp == fitted_p) fitted_p = prev; + list_p = prev; return prev; } static void *__coalesce_next(void *bp) { void *next = NEXT(bp); + // tweak list + _fix_list(next, bp); + // coalesce 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 - if (next == fitted_p) fitted_p = bp; +// if (next == fitted_p) fitted_p = bp; + list_p = bp; + +#ifdef DEBUG + printf("----coalesce next----\n"); + _check(); + printf("---------------------\n"); +#endif return bp; } static void *__coalesce_all(void *bp) { void *prev = PREV(bp); void *next = NEXT(bp); + // tweak list + SET(POS_SUCC(GET_PRED(next)), GET_SUCC(next)); + SET(POS_PRED(GET_SUCC(next)), GET_PRED(next)); + // coalesce 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; - if (next == fitted_p || bp == fitted_p) fitted_p = prev; +// if (next == fitted_p || bp == fitted_p) fitted_p = prev; + list_p = prev; +#ifdef DEBUG + printf("---coalesce all---\n"); + _check(); + printf("-------------------\n"); +#endif return prev; } +static void *__coalesce_none(void *bp) { + // tweak list + if (list_p == NULL) { + list_p = bp; + SET(POS_SUCC(list_p), (word)list_p); + SET(POS_PRED(list_p), (word)list_p); + } else { + // add to list + SET(POS_SUCC(bp), GET_SUCC(list_p)); + SET(POS_PRED(bp), (word)list_p); + SET(POS_PRED(GET_SUCC(list_p)), (word)bp); + SET(POS_SUCC(list_p), (word)bp); + list_p = bp; + } +#ifdef DEBUG + printf("---coalesce none---\n"); + _check(); + printf("-------------------\n"); +#endif + return bp; +} + static void *_first_fit(size_t size) { void *bp = front_p; void *after_p = NEXT(tail_p); @@ -319,18 +394,93 @@ static void *_next_best_fit(size_t size) { return min_p; } +static void *_first_fit_of_clear(size_t size) { + void *bp = list_p; + if (bp == NULL) return NULL; + do { + if (SIZE(bp) >= size) { + _place(bp, size); + return bp; + } + bp = (void *)GET_SUCC(bp); + } while (bp != list_p); + return NULL; +} + static void _place(void *ptr, size_t size) { size_t p_size = SIZE(ptr); - if (p_size - size >= FSIZE) { + if (p_size - size >= MIN_BLOCK) { 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); + void *new_ptr = NEXT(ptr); + SET(HEAD(new_ptr), PACK(adjust_size, 0)); + SET(FOOT(new_ptr), PACK(adjust_size, 0)); + if (ptr == tail_p) tail_p = new_ptr; + // tweak list + _fix_list(ptr, new_ptr); + if (ptr == list_p) list_p = new_ptr; } else { SET(HEAD(ptr), PACK(p_size, 1)); SET(FOOT(ptr), PACK(p_size, 1)); + // tweak list + // remove + SET(POS_SUCC(GET_PRED(ptr)), GET_SUCC(ptr)); + SET(POS_PRED(GET_SUCC(ptr)), GET_PRED(ptr)); + if (ptr == list_p) { + if (GET_SUCC(ptr) == (word)ptr) list_p = NULL; + else list_p = (void *)GET_SUCC(ptr); + } + } +//#ifdef DEBUG +// printf("----place----\n"); +// _check(); +// printf("-------------\n"); +//#endif +} + +static void _fix_list(void *in, void *out) { + if (GET_SUCC(in) == (word)in) { + SET(POS_SUCC(out), (word)out); + SET(POS_PRED(out), (word)out); + } else { + SET(POS_SUCC(out), GET_SUCC(in)); + SET(POS_PRED(out), GET_PRED(in)); + SET(POS_SUCC(GET_PRED(in)), (word)out); + SET(POS_PRED(GET_SUCC(in)), (word)out); } } + +static void _check() { + int num1 = 0; + int num2 = 0; + int num3 = 0; + void *bp = front_p; + void *after_p = NEXT(tail_p); + void *blank_p = NULL; + while (bp != after_p) { + if (!ALLOC(bp)) { + if (blank_p == NULL) blank_p = bp; + num1++; + } + bp = NEXT(bp); + } + bp = blank_p; + do { + if (bp != NULL) { + bp = (void *)GET_SUCC(bp); + num2++; + } + } while (bp != blank_p); + + bp = list_p; + do { + if (bp != NULL) { + bp = (void *)GET_SUCC(bp); + num3++; + } + } while (bp != list_p); + + printf("expect: %d, actual: %d, list_p: %d\n", num1, num2, num3); +} diff --git a/labs/malloclab_lab/mm.o b/labs/malloclab_lab/mm.o index 44d0f11e62b3e5308dce38f87b438284019a4765..362b601b2369d0eac80421c127327166d2d82be6 100644 GIT binary patch literal 21784 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 Kju0}Z`u_pqH6N(} literal 19116 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