๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ง๊ฐ๋กœ๊ทธ

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK5 Day42 - Counter ๋ชจ๋“ˆ / malloc lab ๊ตฌํ˜„ / ํž™ ์ •๋ ฌ ๋ณธ๋ฌธ

Krafton jungle

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK5 Day42 - Counter ๋ชจ๋“ˆ / malloc lab ๊ตฌํ˜„ / ํž™ ์ •๋ ฌ

habbn 2024. 2. 20. 01:02
728x90
๐Ÿ“†24.02.19

1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - Counter ๋ชจ๋“ˆ
2. malloc - next fit
3. heap sort

 

 

์˜ค๋žœ๋งŒ์— ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ํ’€์—ˆ๋‹ค. ์›๋ž˜ ๊ธฐ์ดˆ ํ’€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์ž…๋ฌธ ๋‹ค ํ’€๋ ค๊ณ  ๋‹ค์‹œ ์ž…๋ฌธ์œผ๋กœ ๋Œ์•„์™”๋‹ค.. 

 

ํ’€๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ์ ์— ๋Œ€ํ•ด ์ •๋ฆฌ!


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ตœ๋นˆ๊ฐ’ ๊ตฌํ•˜๊ธฐ

 

Counter ํด๋ž˜์Šค 

  • ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” most_common() ๋ฉ”์„œ๋“œ ์ œ๊ณต

์ตœ๋นˆ๊ฐ’์€ ์ฃผ์–ด์ง„ ๊ฐ’ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๊ฐ’์„ ์˜๋ฏธ

from collections import Counter

def solution(array):
    answer = Counter(array)
    modes =[]
    max_count = max(answer.values())
    
    for k, v in answer.items():
        if v == max_count:
            modes.append(k)
        
    if len(modes) == 1:
        return modes[0]
    else:
        return -1

 

  • items() - ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค, ๊ฐ’ ์Œ ์–ป์Œ
  • keys() - ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค๋งŒ ์–ป์Œ
  • values() - ๋”•์…”๋„ˆ๋ฆฌ์˜ value๋งŒ ์–ป์Œ

Malloc

 

First Fit์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒฐ๊ณผ ์ด์ ์ด 44(util) + 12 (thru) = 56 ์ ์ด ๋‚˜์™”๋‹ค.

  • Space Utilization - ๊ณต๊ฐ„์„ ์–ผ๋งˆ๋‚˜ ์ž˜ ํ™œ์šฉํ•˜๋Š”๊ฐ€
  • Throughput - ํ• ๋‹น ์†๋„๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅธ๊ฐ€

 

๋” ๋†’์€ ์ ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” first-fit์„ next-fit์œผ๋กœ ๋ฐ”๊ฟ”์„œ Throughput์„ ๊ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค!

  • first-fit์€ ๋งค ํ• ๋‹น๋งˆ๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ญ‰ ๋ณด๋‹ค๊ฐ€ ์•Œ๋งž์€ ์ž๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ• ๋‹นํ•˜๋Š” ๊ฒƒ
  • next fit์€ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ๊ฐ€ ์•„๋‹Œ ์ด์ „ ํ• ๋‹น ์œ„์น˜๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ด์„œ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ

 

๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ์ตœ๊ทผ์— ํ• ๋‹นํ•œ ๋ธ”๋ก์˜ ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ์ „์—ญ ํฌ์ธํ„ฐ last_bp๋ฅผ ๋งŒ๋“ค์–ด ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค!!

//last_bp ์ „์—ญ ํฌ์ธํ„ฐ ์„ ์–ธ
static void *last_bp;   //next fit

 

mm_init
int mm_init(void)
{
    //4์›Œ๋“œ ๋นˆ ๊ฐ€์šฉ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ดˆ๊ธฐํ™”
    if((heap_listp = mem_sbrk(4*WSIZE)) == (void*)-1)
        return -1;

    PUT(heap_listp, 0);     //์ •๋ ฌ ํŒจ๋”ฉ(unused)
    PUT(heap_listp + (1*WSIZE), PACK(DSIZE,1)); //ํ”„๋กค๋กœ๊ทธ ํ—ค๋” 8๋ฐ”์ดํŠธ
    PUT(heap_listp + (2*WSIZE), PACK(DSIZE,1)); //ํ”„๋กค๋กœ๊ทธ ํ’‹ํ„ฐ 8๋ฐ”์ดํŠธ
    PUT(heap_listp + (3*WSIZE), PACK(0,1)); //์—ํ•„๋กœ๊ทธ ๋ธ”๋ก, ํ—ค๋”๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํฌ๊ธฐ๊ฐ€ 0์œผ๋กœ ํ• ๋‹น๋œ ๋ธ”๋ก
    heap_listp += (2*WSIZE);    //ํ”„๋กค๋กœ๊ทธ ๋ธ”๋ก(ํž™์˜ ์‹œ์ž‘์ )์„ ๊ฐ€๋ฆฌํ‚ด -> ํž™์˜ ์‹œ์ž‘ ์œ„์น˜ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Œ

    //ํž™์„ CHUNKSIZE ๋ฐ”์ดํŠธ๋กœ ํ™•์žฅํ•˜๊ณ  ์ดˆ๊ธฐ ๊ฐ€์šฉ ๋ธ”๋ก ์ƒ์„ฑ(ํž™ ํ™•์žฅ) (์›Œ๋“œ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜)
    if(extend_heap(CHUNKSIZE/WSIZE) == NULL)
        return -1;

    last_bp = heap_listp;       //next_fit์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐ ํฌ์ธํ„ฐ ์œ„์น˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
    return 0;
}

 

last_bp์— ํž™(heap) ์˜์—ญ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ดˆ๊ธฐ ํฌ์ธํ„ฐ ์œ„์น˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

 

mm_malloc
void *mm_malloc(size_t size)
{
    size_t asize;     /*์กฐ์ •๋œ ๋ธ”๋ก ์‚ฌ์ด์ฆˆ*/
    size_t extendsize;  /*์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํž™ ํ™•์žฅํ•  ์‚ฌ์ด์ฆˆ*/
    char *bp;

    if(size == 0)
        return NULL;

    //๋”๋ธ” ์›Œ๋“œ ์ •๋ ฌ ์ œํ•œ ์กฐ๊ฑด ๋งŒ์กฑ ์œ„ํ•ด ๋”๋ธ” ์›Œ๋“œ ๋‹จ์œ„๋กœ ํฌ๊ธฐ ์„ค์ •
    if(size <= DSIZE)
        asize = 2*DSIZE;    //์ตœ์†Œ ๋ธ”๋ก ํฌ๊ธฐ 16๋ฐ”์ดํŠธ ํ• ๋‹น(ํ—ค๋” 4 + ํ‘ธํ„ฐ 4 + ์ €์žฅ๊ณต๊ฐ„ 8)
    else    
        asize = ALIGN(size + DSIZE); //8๋ฐฐ์ˆ˜๋กœ ์˜ฌ๋ฆผ ์ฒ˜๋ฆฌ

    //์ ์ ˆํ•œ ๊ฐ€์šฉ ๋ธ”๋ก ๊ฒ€์ƒ‰
    if ((bp = find_fit(asize)) !=NULL)
    {
        place(bp,asize);
        last_bp = bp;
        return bp;  //์ƒˆ๋กญ๊ฒŒ ํ• ๋‹นํ•œ ๋ธ”๋ก ๋ฆฌํ„ด
    }

    //์ ํ•ฉํ•œ ๋ธ”๋ก์ด ์—†์„ ๊ฒฝ์šฐ ํž™ ํ™•์žฅ
    extendsize = MAX(asize,CHUNKSIZE);
    if((bp = extend_heap(extendsize/WSIZE))==NULL)
        return NULL;
    place(bp,asize);
    last_bp = bp;
    return bp;
}

 

find_fit (next_fit) 
#elif defined(NEXT_FIT)
static void *find_fit(size_t asize)
{
    void *bp = last_bp;

    //next_fit ํฌ์ธํ„ฐ์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘
    for(bp = NEXT_BLKP(bp); GET_SIZE(HDRP(bp))> 0; bp =NEXT_BLKP(bp))
    {
        if(!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp))))
        {
            last_bp = bp;
            return bp;
        }
    }

    //๋๊นŒ์ง€ ๊ฐ”๋Š”๋ฐ ํ• ๋‹น๊ฐ€๋Šฅํ•œ free block์ด ์—†์œผ๋ฉด ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ last_bp์ „๊นŒ์ง€ ํƒ์ƒ‰
    bp = heap_listp;
    while(bp <last_bp)
    {
        bp = NEXT_BLKP(bp);
        if(!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp))))
        {
            last_bp = bp;
            return bp;
        }
    }
    return NULL;
}

 

๋งŒ์ผ last_bp๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๊ณ , ํ• ๋‹นํ•  ๊ณณ์„ ๋ชป ์ฐพ์•˜๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ๋ฒˆ ๋” ํƒ์ƒ‰ํ•œ๋‹ค. 

์•ž์— ๋นˆ ๊ณต๊ฐ„ ์—†์ด ํ• ๋‹น๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ๋™์ž‘ ์‹œ๊ฐ„ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•˜๊ฒ ์ง€๋งŒ, ์กฐ๊ธˆ์ด๋ผ๋„ ๋นˆ ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

 

thr๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ๋‹ค! ๊ทผ๋ฐ ์™œ util์€ ์ค„์—ˆ์„๊นŒ..

 

๊ทธ๋ฆฌ๊ณ ! 

๊ธฐ์กด mm_realloc ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ถ„์˜ ๊ฐœ์„ ๋œ realloc ์ฝ”๋“œ๋กœ ๋Œ๋ ค๋ดค๋”๋‹ˆ...!!

 

๊ธฐ์กด mm_realloc
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 =GET_SIZE(HDRP(oldptr));
    if (size < copySize)    
        copySize = size;  

    memcpy(newptr, oldptr, copySize);   //์ƒˆ ๋ธ”๋ก์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
    mm_free(oldptr);

    return newptr;
}

 

๊ฐœ์„ ๋œ realloc
void *mm_realloc(void *ptr, size_t size)
{
    void *oldptr = ptr;
    void *newptr;
    size_t originsize = GET_SIZE(HDRP(oldptr));
    size_t newsize = size + DSIZE;
    
    if (newsize <= originsize) {
        return oldptr;
    }
    else {
        size_t addSize = originsize + GET_SIZE(HDRP(NEXT_BLKP(oldptr)));
        if (!GET_ALLOC(HDRP(NEXT_BLKP(oldptr))) && (newsize <= addSize))
        {
            PUT(HDRP(oldptr), PACK(addSize, 1));
            PUT(FTRP(oldptr), PACK(addSize, 1));
            return oldptr;
        }
        else
        {
            newptr = mm_malloc(newsize);
            if (newptr == NULL)
                return NULL;
            memcpy(newptr, oldptr, newsize);
            mm_free(oldptr);
            return newptr;
        }
    }
}

 

 

 

๋ฌด๋ ค util๊ณผ thru๊ฐ€ ๊ฐœ์„ ๋œ 86์  ์ ์ˆ˜๊ฐ€ ๋–ด๋‹ค.

 

์ด๊ฑด ๋‚ด์ผ.. ๋ถ„์„ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค..

 


ํž™ ์ •๋ ฌ

 

์˜ค์ผ€์ด ์ด๋ก  ์ดํ•ดํ–ˆ๋‹ค.

์ž ์ฝ”๋“œ ๋ด๋ณด์ž~ ์—ฅ?? ์—์—ฅ??? ํ•ด์„œ ๋””๋ฒ„๊น… ๋Œ๋ฆฌ๋ฉด์„œ ๋ณต๋ณด๊ณ ๋ณด๊ณ ๋ณด๊ณ ํ•˜๋ฉด์„œ ์ดํ•ดํ–ˆ๋‹ค................!!!!!!!!

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํž™ ์ •๋ ฌ(Heap Sort)

ํž™ ์ •๋ ฌ์ด๋ž€ ? ํž™ ์ •๋ ฌ์€ ํž™์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํž™์€ '๋ถ€๋ชจ์˜ ๊ฐ’์ด ์ž์‹์˜ ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ํฌ๋‹ค'๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์ด๋‹ค. ์ด๋•Œ ๋ถ€๋ชจ์˜ ๊ฐ’์ด ์ž์‹์˜ ๊ฐ’๋ณด๋‹ค

habbn-unitystudy.tistory.com

 

 

 


์ฐธ๊ณ 

https://olive-su.tistory.com/428

 

Malloc Lab ๊ตฌํ˜„

โ˜๏ธ Overview - ์—ฐ๊ด€ ํฌ์ŠคํŒ…(๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ฐœ์š”) Ch9. Dynamic Memory Allocation(9.9) ์ถ”๊ฐ€์ ์ธ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Ÿฐํƒ€์ž„์— ํš๋“ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ๋‹ค. ํŽธ๋ฆฌ์„ฑ, ํ˜ธํ™˜์„ฑ Intro. ๋™์ 

olive-su.tistory.com

 

728x90