์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- pintos
- kraftonjungle
- ํฌ๋ํํค ์ ๊ธ
- TiL
- ์ด๋ฒคํธ ํจ์ ์คํ ์์
- ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ ๋ํฐ
- ์๊ณ ๋ฆฌ์ฆ
- ํฌ๋ํํค ์ ๊ธ 4๊ธฐ
- project3
- ์ ์-์ ํฌ
- ๋ค์ต์คํธ๋ผ
- ํํ ์ค
- BFS
- 4๊ธฐ
- ํฌ๋ํํค์ ๊ธ4๊ธฐ
- Unity
- ํ์ด์ฌ
- ์ค๋ธ์
- KRAFTON JUNGLE
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๋ฐฑ์ค
- ํฌ๋ํํค์ ๊ธ
- c#
- anonymous page
- User Stack
- ์ถ์ํด๋์ค์์ธํฐํ์ด์ค
- C
- ๋คํธ์ํฌ
- ์๊ณ ๋ฆฌ์ฆ์์ -๋๋น์ฐ์ ํ์2
- Today
- Total
๋ง๊ฐ๋ก๊ทธ
ํฌ๋ํํค ์ ๊ธ WEEK5 Day 43 - ํด์ฆ ๋ฆฌ๋ทฐ / implict list(best fit, realloc ๊ฐ์ ์ฝ๋) ๋ณธ๋ฌธ
ํฌ๋ํํค ์ ๊ธ WEEK5 Day 43 - ํด์ฆ ๋ฆฌ๋ทฐ / implict list(best fit, realloc ๊ฐ์ ์ฝ๋)
habbn 2024. 2. 20. 23:58๐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์ผ์ฐจ
๋ฌธ์ ๋ค์ด ์ฌ๋ฐ์ด์ ํ๊ธฐ ์ฌ๋ฐ๋ค
'Krafton jungle' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฌ๋ํํค ์ ๊ธ WEEK6 Day45 - 6์ฃผ์ฐจ ๋ฐ์ /OSI 7๊ณ์ธต (0) | 2024.02.22 |
---|---|
ํฌ๋ํํค ์ ๊ธ WEEK5 Day44 - explict free list (1) | 2024.02.21 |
ํฌ๋ํํค ์ ๊ธ WEEK5 Day42 - Counter ๋ชจ๋ / malloc lab ๊ตฌํ / ํ ์ ๋ ฌ (0) | 2024.02.20 |
ํฌ๋ํํค ์ ๊ธ WEEK5 Day 40 - implict list/explict free list/malloc (1) | 2024.02.17 |
ํฌ๋ํํค ์ ๊ธ WEEK5 Day 39 - ๊ฐ์๋ฉ๋ชจ๋ฆฌ (0) | 2024.02.15 |