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

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

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK5 Day 43 - ํ€ด์ฆˆ ๋ฆฌ๋ทฐ / implict list(best fit, realloc ๊ฐœ์„  ์ฝ”๋“œ) ๋ณธ๋ฌธ

Krafton jungle

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK5 Day 43 - ํ€ด์ฆˆ ๋ฆฌ๋ทฐ / implict list(best fit, realloc ๊ฐœ์„  ์ฝ”๋“œ)

habbn 2024. 2. 20. 23:58
728x90
๐Ÿ“†24.02.20

1. 5์ฃผ์ฐจ ํ€ด์ฆˆ
2. find fit(best-fit)
3. realloc ์ฝ”๋“œ ์ดํ•ด
4. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / ๋ฐฑ์ค€

 

5์ฃผ์ฐจ ํ€ด์ฆˆ

 

1. ํŽ˜์ด์ง•๊ณผ ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ์ •์˜ ๋ฐ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ 

 

ํŽ˜์ด์ง•

  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ๋ธ”๋ก, ์ฆ‰ 'ํŽ˜์ด์ง€'๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๊ฐ ํŽ˜์ด์ง€๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์™€ ๋งคํ•‘๋˜๋ฉฐ, ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
  • ํŽ˜์ด์ง•์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ญ๋น„๋ฅผ ์ค„์ด๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•œ๋‹ค.

์žฅ์ 

  • ์™ธ๋ถ€ ๋‹จํŽธํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋‹จ์ˆœํ•˜๋‹ค

๋‹จ์ 

  • ๋‚ด๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ
  • ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ์— ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ

 

์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜

  • ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„์ธ '์„ธ๊ทธ๋จผํŠธ'๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋Š” ์‹œ์ž‘ ์ฃผ์†Œ์™€ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ(์˜ˆ :  ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ์Šคํƒ)๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•จ
  • ์„ธ๊ทธ๋จผํŠธ๋ณ„ ๋ณดํ˜ธ์™€ ๊ณต์œ ๊ฐ€ ์šฉ์ดํ•จ

๋‹จ์ 

  • ์™ธ๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ

 

2. First -fit, Next-fit, Best-fit์ผ ๋•Œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ˆœ์„œ

 

๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก : A(10), B(50), C(25), D(30), E(40)

์š”์ฒญ ์ˆœ์„œ : 1(30) , 2(25) , 3(25), 4(10)

 

  • First- fit : ์ฒ˜์Œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๊ณ  ํฌ๊ธฐ๊ฐ€ ๋งž๋Š” ์ฒซ ๊ฐ€์šฉ ๋ธ”๋ก์„ ์„ ํƒํ•œ๋‹ค.
    •  ์ˆœ์„œ :  B - C - D - A
  • Next-fit : ์ด์ „ ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋œ ์‹œ์ ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•œ๋‹ค.
    •  ์ˆœ์„œ : B - C - D - E
  • Best-fit : ๋ชจ๋“  ๊ฐ€์šฉ ๋ธ”๋ก์„ ๊ฒ€์‚ฌํ•ด์„œ, ํฌ๊ธฐ์— ๋งž๋Š” ๊ฐ€์šฉ ๋ธ”๋ก ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋ธ”๋ก์„ ์ฐพ๋Š”๋‹ค.
    • ์ˆœ์„œ : D - C - E - A

 

3.  DMA์˜ ๊ธฐ๋ณธ ๊ฐœ๋… , DMA๊ฐ€ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์ด์  ๋‘ ๊ฐ€์ง€ ์ด์ƒ ์ œ์‹œ

  • DMA๋Š” Direct Memory Access์˜ ์•ฝ์ž๋กœ, CPU์˜ ์ค‘์žฌ ์—†์ด ์ฃผ๋ณ€์žฅ์น˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์˜ ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.
  • DMA๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ๋ฐ์ดํ„ฐ ์ „์†ก ๊ณผ์ •์—์„œ CPU๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ , CPU๋Š”๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ์œผ๋กœ ์ด์–ด์ง€๋Š”๋ฐ, ํŠนํžˆ I/O์ž‘์—…์ด ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ๊ทธ ์ด์ ์ด ๋‘๋“œ๋Ÿฌ์ง„๋‹ค.
  • ์ฒซ์งธ, CPU์˜ ๋ถ€ํ•˜๊ฐ€ ๊ฐ์†Œํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ํšจ์œจ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค
  • ๋‘˜์งธ, ๋ฐ์ดํ„ฐ ์ „์†ก ์†๋„๊ฐ€ ํ–ฅ์ƒ๋˜๋ฏ€๋กœ, ์ „๋ฐ˜์ ์ธ ์‹œ์Šคํ…œ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.

 

4. ์•„๋ž˜ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ

 

#include <stdio.h>

int main() {
	char* str[2];
	str[0] = "hello!";
	str[1] = "jungler";
	printf("1. %s\n", str[0] + 1);
	printf("2. %s\n", (str + 1)[0] + 2);
	return 0;
}

 

1 . ello!

2. ngler

 

๋‚ด ๋‹ต์•ˆ

1 . e

2.  n

-> %s ๋ฅผ ๋ณด์ง€ ๋ชปํ•˜๊ณ  ๋ฌธ์ž ํ•˜๋‚˜๋งŒ ์ถœ๋ ฅํ•˜์˜€๋‹ค. %s๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ด์•ผํ•˜๋ฏ€๋กœ str[0] + 1๋ฒˆ์งธ, (str+1)[0] + 2 ๋ฒˆ์งธ ๋ถ€ํ„ฐ์˜ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

str[0] + 1 -> str[0]์˜ 1๋ฒˆ์งธ     ,  (str+1)[0] +2 ->  str[1] +2 , str[1]์˜ 2๋ฒˆ

 

5. 1 2 4 4 3 5 5 6์˜ ์ž…๋ ฅ์ด Do it ์•Œ๊ณ ๋ฆฌ์ฆ˜์ฑ… p.294์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ฃผ์–ด์งˆ ๋•Œ์˜ ์ƒํƒœ๋ฅผ ๊ทธ๋ ค๋ผ

 

 

malloc (best-fit)

 

best-fit์€ ๊ฐ€์šฉ ๋ธ”๋ก ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ธ”๋ก์„ ์ฐพ๋Š”๋‹ค.

static void *find_fit(size_t asize)
{
    void *bp;
    void *best_fit = NULL;  //๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ธ”๋ก ํฌ์ธํ„ฐ

    for(bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp))
    {
        if(!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp))))
        {   
            // best_fit์ด NULL์ด๊ฑฐ๋‚˜ ํ˜„์žฌ ๊ฒ€์‚ฌ ์ค‘์ธ bp์˜ ํฌ๊ธฐ๊ฐ€ ์ด์ „์— ์ฐพ์€ best_fit์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์„ ๋•Œ
            if(!best_fit || GET_SIZE(HDRP(bp)) < GET_SIZE(HDRP(best_fit)))
                best_fit = bp;
        }
    }
    return best_fit;
}

 

 

๊ธฐ์กด mm_realloc 
 void *mm_realloc(void *ptr, size_t size)
 {
     void *oldptr = ptr;     // ์ฃผ์–ด์ง„ ํฌ์ธํ„ฐ๋ฅผ oldptr์— ๋ณต์‚ฌ.
     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;  //์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ํฌ์ธํ„ฐ ๋ฐ˜ํ™˜
}

 

๊ธฐ์กด mm_realloc์€ ๋ฌด์กฐ๊ฑด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ๋’ค, ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๋ฐ˜๋ณต์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์œผ๋กœ ์ฝ”๋“œ์˜ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

 

mm_realloc์„ ๊ฐœ์„ ํ•˜์—ฌ ์ƒˆ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋ ค๋Š” ๋ธ”๋ก์˜ ๋‹ค์Œ ๋ธ”๋ก์ด ๊ฐ€์šฉ ๋ธ”๋ก์ด๋ผ๋ฉด ์ƒˆ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์•ˆํ•ด์ค˜๋„ ๋˜๊ฒŒ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์ ์œผ๋กœ ํšจ์œจ์ ์ด๊ฒŒ ๋œ๋‹ค! ( ๋‹จ์ˆœํžˆ ํ—ค๋”, ํ‘ธํ„ฐ์˜ ์‚ฌ์ด์ฆˆ ์ •๋ณด๋งŒ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.)

๊ฐœ์„ ๋œ mm_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;      // ์ƒˆ ์‚ฌ์ด์ฆˆ + (ํ—ค๋”์™€ ํ‘ธํ„ฐ ๊ณ ๋ ค)
    
    // newsize๊ฐ€ ๋” ์ž‘์€ ๊ฒฝ์šฐ
    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;
        }
    }
}

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

 

 

๋จธ์“ฑ์ด ๋„์žฅ ๊นจ๊ธฐ 5์ผ์ฐจ

๋ฌธ์ œ๋“ค์ด ์žฌ๋ฐŒ์–ด์„œ ํ’€๊ธฐ ์žฌ๋ฐŒ๋‹ค

 

728x90