[Malloc] Implicit Free List๋ฐฉ์-๊ตฌํ
Malloc - lab
๐heap
- ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ๋ ํ์ด๋ผ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ด๋ฌํ ํ ์์ญ์๋ ํ ๋น๋ ๋ธ๋ก๊ณผ ๊ฐ์ฉ๋ธ๋ก์ด ์๋ค.
- ํ ๋น๊ธฐ์ ์ข
๋ฅ
- ๋ช
์์ ํ ๋น๊ธฐ(explicit allocator) : ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ์ง์ ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์กฐ์ํ๋ ํ ๋น๊ธฐ
- ๋จ์ : ๋ฉ๋ชจ๋ฆฌ ๋์ , ๋ฌดํจ ํ์ธํฐ(์ด์ ์ ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง ์ด์ ๋ ๋ฌดํจํ๋ ํฌ์ธํฐ๋ฅผ ๋ํ๋)
- ์์์ ํ ๋น๊ธฐ(implicit allocator) : ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋๋ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด์ฅ๋์ด ์์ด์ ๊ฐ๋ฐ์๊ฐ ๋ช
์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ๊ด๋ฆฌํ์ง ์์๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์
- ๋จ์ : ๋ฐํ์ ์ค๋ฒํค๋ ๋ฌธ์ , ์ฑ๋ฅ ๋ฌธ์
- ๋ช
์์ ํ ๋น๊ธฐ(explicit allocator) : ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ์ง์ ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์กฐ์ํ๋ ํ ๋น๊ธฐ
Malloc pacakge
๐malloc
void *malloc(size_t size)
- ํ ๋น ์ฑ๊ณต์, 8byte๋ก ์ ๋ ฌ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ์คํจ์ null(0) ๋ฐํ.
๐free
void free(void *p)
- ํ ๋น๋์ง ์๋ ๋ธ๋ก์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
- p๋ ๋จผ์ malloc์ด๋ calloc์ ์ํด ํ ๋น ๋์ด์ผ ํจ.
- calloc : ๋ธ๋ก์ 0์ผ๋ก ์ด๊ธฐํ
- realloc : ์ด๋ฏธ ํ ๋น๋ ๋ธ๋ก ์ฌ์ด์ฆ๋ฅผ ์ค์ด๊ฑฐ๋ ๋๋ฆผ
- sbrak : ํ ์ฌ์ด์ฆ๋ฅผ ์ค์ด๊ฑฐ๋ ๋๋ฆผ
โ๏ธmalloc ์ฌ์ฉ์์
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5; // ์ ์ ๋ฐฐ์ด์ ํฌ๊ธฐ
// malloc์ ์ฌ์ฉํ์ฌ n๊ฐ์ int ํฌ๊ธฐ๋งํผ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
fprintf(stderr, "๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ค๋ฅ\n");
return 1;
}
// ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ธฐํํ๊ณ ์ถ๋ ฅ
for (int i = 0; i < n; i++) {
arr[i] = i * 10;
printf("arr[%d] = %d\n", i, arr[i]);
}
// ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
free(arr);
return 0;
}
allocator
๐ํ ๋น๊ธฐ ๊ตฌํ ์ ์ฝ
- ์ด๋ฏธ ํ ๋น๋ ๋ธ๋ก์ ์ฌ์ด์ฆ๋ฅผ ์์ ํ ์ ์๋ค.
- malloc ์์ฒญ์ ๋ฐ๋ก ์๋ตํ๋ค. ์ง์ฐ์ํค๊ฑฐ๋ ์ฌ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅ
- -> ์์ฒญ ์์ฒด๋ฅผ ์ ๋ ฌ ํ๊ฑฐ๋ ์์๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค. ํ์ง๋ง malloc ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ง์ฐ์ด ์๋๋ผ ๊ณง๋ฐ๋ก ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ ์ ์์ด์ผํ๋ค.
- free์ธ ๋ธ๋ก์๋ง ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
- ํ ๋น๋ ๋ธ๋ก์ ์ฎ๊ธธ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ์ด ํ์ํ๋ค.
- -> 32๋นํธ๋ผ๋ฉด 4๋ฐ์ดํธ์ฉ, 64๋นํธ๋ผ๋ฉด 8๋ฐ์ดํธ์ฉ
- free ๋ธ๋ก๋ง ์กฐ์ํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
๐ํ ๋น๊ธฐ ๊ตฌํ ์ด์
- ์ด๋ป๊ฒ ๊ฐ์ฉ(free)๋ธ๋ก์ ์ง์์ ์ผ๋ก ์ถ์ ํ ๊ฒ์ธ๊ฐ?
- ์ด๋์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ free์์ผ์ผํ ์ง , ํ๋์ ํฌ์ธํฐ๋ก ์ ์ ์๋๊ฐ?
- ๋ฉ๋ชจ๋ฆฌ ํ ๋นํ ๋๋จธ์ง ๊ฐ์ฉ ๋ธ๋ก๋ค์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ๊ฐ?
- -> ๊ทธ๋๋ก ๋๋๋ฉด ๋ด๋ถ ๋จํธํ๊ฐ ์ผ์ด๋ ๊ฒ์ด๋ค. ์์ ๋ธ๋ก์ผ๋ก ๋ค์ ๋๋ ์ free๋ธ๋ก์ผ๋ก ์ธ ์๋ ์์๊ฒ์ด๋ค.
- ํ ๋น๋ free ๋ธ๋ก๋ค์ ์ด๋ป๊ฒ ๊ณ ๋ฅผ ๊ฒ์ธ๊ฐ?
- free๋ ๋ธ๋ก๋ค์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ? ์ฌ์ฐ๊ฒฐ ํ ๊ฒ์ธ๊ฐ?
๐header
- header์๋ ํด๋น ๋ธ๋ก์ ์ฌ์ด์ฆ
- ํ ๋น์ฌ๋ถ, free์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์ ธ์์
๐free๋ ๋ธ๋ก๋ค์ ์ถ์ ํ๋ ๋ฒ
๐ก1. implicit list (๋ฌต์์ ๊ฐ์ฉ ๋ฆฌ์คํธ)
- ๋ชจ๋ ๋ธ๋ก๋ค์ ํค๋๋ค์ ๋ฐฉ๋ฌธํ์ฌ, ํด๋น ๋ธ๋ก์ด ์ฌ์ฉํ ์ ์๋์ง๋ฅผ ์ ์ฅํ๋ค.
๐ก2. explicit list(๋ช ์์ ๊ฐ์ฉ ๋ฆฌ์คํธ)
- free๋ ๋ธ๋ก ๋ด์ ๋ค์ free ๋ธ๋ก์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์์ด, ํ free ๋ธ๋ก์์ ๋ค์ free ๋ธ๋ก์ ์์น๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ ์๋ค.
๐ก3. segregated free list(๋ถ๋ฆฌ ๊ฐ์ฉ ๋ฆฌ์คํธ)
- ํ ๋น์ด ํด์ ๋์ด ์๋ ๋ธ๋ก๋ค์ ์ฌ์ด์ฆ ๋ณ๋ก ๊ฐ๊ฐ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด ๊ด๋ฆฌํ๋ค.
๐ก4. blocks sorted by size(ํฌ๊ธฐ๋ณ๋ก ์ ๋ ฌ๋ ๋ธ๋ก)
- ๊ท ํํธ๋ฆฌ๋ฅผ ์ด์ฉํด ๊ฐ์ฉ ๋ฆฌ์คํธ๋ค์ ํฌ๊ธฐ ์์๋๋ก ์ ๋ ฌํ๋ค.
implicit list (๋ฌต์์ ๊ฐ์ฉ ๋ฆฌ์คํธ)
๐implicit list
- ๋ธ๋ก์ด ํ ๋น ๋์ด ์์ผ๋ฉด a๋ 1์ด๊ณ , ํ ๋น๋์ด ์์ง ์์ผ๋ฉด 0์ด๋ค.
- a๋ ํญ์ 0์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ด์ฆ๊ฐ 4๋ฐ์ดํธ๋ฉด 100, 2๋ฐ์ดํธ๋ฉด 10, ์ฌ๊ธฐ๋ฅผ allocated/ free flag๋ก ์ฌ์ฉ
๐Implicit Free List ์์
- ๋งจ ์ฒ์์ unused word
- -> ๋งจ ์ฒ์์ ํค๋๊ฐ ํ์ํ๊ณ , 32bit๋ก 8๋ฐ์ดํธ(word 2๊ฐ)๋ก ์ ๋ ฌ๋์ด ์๋ค๋ ์ ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ํ ๋นํ ๋ธ๋ก ๋ฐฐ์น ๋ฐฉ๋ฒ
- ๊ฐ๋จํ๊ฒ ์๋ฅผ ๋ค์ด ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
- ํ๋ก์ธ์ค๊ฐ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋๊ธฐ์ "๋์ ์ฉ๋์ 99M์ ๋๋ค. ์ ๊ฐ ๋ค์ด๊ฐ ์ ์์๋งํผ์ ์ฉ๋์ ์ ์๊ฒ ์ฃผ์ธ์^^;๋ผ๊ณ ๋งํ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ํ๋ก์ธ์ค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ฉ ๋ธ๋ก์ค ํ๋๋ฅผ ์ค๊ฒ์ด๋ค. ์ด๋ป๊ฒ, ์ด๋ ํ ๋ฐฉ๋ฒ์ผ๋ก ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ก์ธ์ค์๊ฒ ํ ๋นํด ์ค๊ฒ์ธ๊ฐ? ๋ฐ๋ก , first -fit , next-fit , best-fit ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ์ค๊ฒ์ด๋ค.
- ์์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํ์๋ฉด 16M์ ํ๋ก์ธ์ค๊ฐ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋๋ ค๊ณ ํ๋ค.
- first-fit(์ฒ์๋ถํฐ ๋๊น์ง ํ์ํ์ฌ ์์ฒญ๋ ํฌ๊ธฐ์ ๊ฐ์ฅ ๊ทผ์ ํ, ๊ฐ์ฅ ๊ฐ๊น์ด ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค๊ฒ์ด๋ค)
- ->๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฒซ ๋ถ๋ถ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์, ๊ทธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ํ์ํ๋ฏ์ด ํ์ํ ๊ฒ์ด๋ค. ์ฒซ ๊ฐ์ฉ ๋ธ๋ก์ 8M์ผ๋ก ๋ค์์ ํ์ํ๊ณ , ๊ทธ๋ค์์ 12M , ๋ ๋ค์์ ํ์ํ๋ค. ๊ทธ๋ฐ๋ฐ 22M์ ์ถฉ๋ถํ 16M์ด ๋ค์ด๊ฐ ์ ์๋ค. ๊ทธ๋์ 22M์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํด์ค๊ฒ์ด๋ค.
- next - fit(๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด๊ฐ ๊ณต๊ฐ์ผ๋ก๋ถํฐ ๊ฐ์ฅ ์ ํฉํ๊ณณ์ ์ค๊ฒ์ด๋ค.)
- ->์คํ์ฒ๋ผ, ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด๊ฐ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ ์์ญ๋ถํฐ ํ์์ ์์ํ์ฌ ๊ณต๊ฐ์ ์ฐพ๋๊ฒ์ด๋ค. ํฌ์ธํฐ๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ ๊ฒฐ๊ตญ ์ฐพ์ ๊ณณ์ 36M์ด๋ค.
- best-fit(์ฒ์๋ถํฐ ๋๊น์ง ํ์ํ์ฌ ์์ฒญ๋ ํฌ๊ธฐ์ ๊ฐ์ฅ ๊ทผ์ ํ, ๊ฐ์ฅ ๊ฐ๊น์ด ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค๊ฒ์ด๋ค.)
- -> ์ผ์ชฝ์์ ๋ณด๋ฉด ํ์ฌ 18M์ด ๊ฐ์ฅ 16M๊ณผ ๊ฐ๊น๊ณ ๊ทผ์ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก 18M์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค๊ฒ์ด๋ค.
๐ก1. Fist fit
- first fit : ์ฒ์๋ถํฐ ํ์ํ๊ณ ํฌ๊ธฐ๊ฐ ๋ง๋ ์ฒซ ๊ฐ์ฉ ๋ธ๋ก์ ์ ํ
- ์ฅ์ : ๋งค์ฐ ๋น ๋ฅธ ํ์ ์๋ , ์ฒ์ ์ผ๋ก ์ถฉ๋ถํ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฐพ์ ํ๋ก์ธ์ค๋ฅผ ํ ๋นํ๋ฏ๋ก ๊ฒ์ ์๊ฐ์ด ๋งค์ฐ ์งง๋ค.
- ๋จ์ : ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ
- ์์)
Input : blockSize[] = {100, 500, 200, 300, 600};
processSize[] = {212, 417, 112, 426};
Output:
Process No. Process Size Block no.
1 212 2
2 417 5
3 112 2
4 426 Not Allocated
- ๋ง์ง๋ง์ผ๋ก ํ๋ก์ธ์ค 4๋ฅผ ํ ๋นํ๋ ค๊ณ ํ๋๋ฐ, ์ฌ์ฉ ๊ฐ๋ฅํ ๋ธ๋ก์ค์๋ 300 ํฌ๊ธฐ์ ๋ธ๋ก์ด ๊ฐ์ฅ ํฐ๊ฒ์ด๊ณ , ์ด๋ 426์ ํ๋ก์ธ์ค๋ฅผ ์์ฉํ ์์์ด ํ ๋น๋์ง ์๋๋ค.
๐ก๊ตฌํ ๋จ๊ณ
- ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ํฌ๊ธฐ์ ํ๋ก์ธ์ค ํฌ๊ธฐ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ํฌ๊ธฐ: ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ ๋๋ ํํฐ์ ํฌ๊ธฐ์ผ ์ ์์ต๋๋ค.
- ํ๋ก์ธ์ค ํฌ๊ธฐ: ํ ๋นํ๋ ค๋ ํ๋ก์ธ์ค์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ ๋๋ค.
- ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ด๊ธฐํํ์ฌ ๋น ์ํ๋ก ํ์ํฉ๋๋ค.
- ์ด ๋จ๊ณ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ด๊ธฐํํ๊ณ , ์ด ๋ธ๋ก๋ค์ ์ด๊ธฐ ์ํ์์๋ ์๋ฌด๋ฐ ํ๋ก์ธ์ค๊ฐ ํ ๋น๋์ง ์์ ์ํ(๋น ์ํ)๋ก ํ์๋ฉ๋๋ค.
- ๊ฐ ํ๋ก์ธ์ค๋ฅผ ์ ํํ๊ณ ํ์ฌ ๋ธ๋ก์ ํ ๋นํ ์ ์๋์ง ํ์ธํฉ๋๋ค.
- ์ด ๋จ๊ณ์์๋ ํ๋ก์ธ์ค๋ฅผ ํ๋์ฉ ์ ํํ๊ณ , ํ์ฌ ๊ฒ์ฌ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ง์ฝ ํ๋ก์ธ์ค ํฌ๊ธฐ๊ฐ ํ์ฌ ๋ธ๋ก ํฌ๊ธฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ํด๋น ๋ธ๋ก์ ํ ๋นํ๊ณ ๋ค์ ํ๋ก์ธ์ค๋ฅผ ํ์ธ
- ํ์ฌ ๊ฒ์ฌ์ค์ธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํฌ๊ธฐ๊ฐ ์ ํํ ํ๋ก์ธ์ค์ ํฌ๊ธฐ์ ๊ฐ๊ฑฐ๋ ํฌ๋ฉด, ํด๋น ํ๋ก์ธ์ค๋ฅผ ํ์ฌ ๋ธ๋ก์ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฐ๋ค์ ๋ค์ ๋ค์ ํ๋ก์ธ์ค๋ฅผ ์ ํํ์ฌ ํ ๋น ๊ฐ๋ฅํ ๋ธ๋ก์ ์ฐพ์๊ฐ๋๋ค.
- ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์ ๋ธ๋ก์ ํ์ธํ๊ณ , ์ด ๊ณผ์ ์ ๋ฐ๋ณต
- ํ์ฌ ๋ธ๋ก์ ํฌ๊ธฐ๊ฐ ์ ํํ ํ๋ก์ธ์ค์ ํฌ๊ธฐ๋ณด๋ค ์์ผ๋ฉด ๋ค์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ผ๋ก ์ด๋ํ์ฌ ํ ๋น ๊ฐ๋ฅํ ๋ธ๋ก์ ์ฐพ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ๋ชจ๋ ๋ธ๋ก์ ๋ํด ๋ฐ๋ณต
๐กfirst-fit
#include<stdio.h>
// First-Fit ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ๋ธ๋ก์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ํจ์
void firstFit(int blockSize[], int m, int processSize[], int n)
{
int i, j;
// ๊ฐ ํ๋ก์ธ์ค์ ํ ๋น๋ ๋ธ๋ก ID๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด
int allocation[n];
// ์ด๊ธฐ์๋ ์ด๋ค ๋ธ๋ก๋ ์ด๋ค ํ๋ก์ธ์ค์ ํ ๋น๋์ง ์์์ต๋๋ค.
for(i = 0; i < n; i++)
{
allocation[i] = -1;
}
// ๊ฐ ํ๋ก์ธ์ค๋ฅผ ์ ํํ๊ณ ์ ์ ํ ๋ธ๋ก์ ์ฐพ์ ํ ๋นํฉ๋๋ค
for (i = 0; i < n; i++) // ์ฌ๊ธฐ์ n์ ํ๋ก์ธ์ค์ ์์
๋๋ค
{
for (j = 0; j < m; j++) // ์ฌ๊ธฐ์ m์ ๋ธ๋ก์ ์์
๋๋ค
{
if (blockSize[j] >= processSize[i])
{
// ๋ธ๋ก j๋ฅผ i๋ฒ์งธ ํ๋ก์ธ์ค์ ํ ๋นํฉ๋๋ค
allocation[i] = j;
// ์ด ๋ธ๋ก์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์์ํต๋๋ค.
blockSize[j] -= processSize[i];
break; // ๋ค์ ํ๋ก์ธ์ค๋ก ์ด๋ํฉ๋๋ค.
}
}
}
printf("\nํ๋ก์ธ์ค ๋ฒํธ\tํ๋ก์ธ์ค ํฌ๊ธฐ\t๋ธ๋ก ๋ฒํธ\n");
for (int i = 0; i < n; i++)
{
printf(" %i\t\t\t", i+1); // ํ๋ก์ธ์ค ๋ฒํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
printf("%i\t\t\t\t", processSize[i]); // ํ๋ก์ธ์ค ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
if (allocation[i] != -1)
printf("%i", allocation[i] + 1); // ํ ๋น๋ ๋ธ๋ก ๋ฒํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
else
printf("ํ ๋น๋์ง ์์"); // ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ๋ฅผ ํ์ํฉ๋๋ค.
printf("\n");
}
}
// ๋ฉ์ธ ํจ์
int main()
{
int m; // ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์
int n; // ์
๋ ฅ ํ์ ์๋ ํ๋ก์ธ์ค์ ์
int blockSize[] = {100, 500, 200, 300, 600}; // ๊ฐ ๋ธ๋ก์ ํฌ๊ธฐ
int processSize[] = {212, 417, 112, 426}; // ๊ฐ ํ๋ก์ธ์ค์ ํฌ๊ธฐ
m = sizeof(blockSize) / sizeof(blockSize[0]); // ๋ธ๋ก ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
n = sizeof(processSize) / sizeof(processSize[0]); // ํ๋ก์ธ์ค ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
firstFit(blockSize, m, processSize, n); // First-Fit ์๊ณ ๋ฆฌ์ฆ์ ํธ์ถํฉ๋๋ค.
return 0;
}
- ๊ฒฐ๊ณผ
๐free ๋ธ๋ก ์ฐพ๋ ๋ฐฉ๋ฒ ( fisrt fit)
p = start;
while ((p < end) && ((*p & 1) || (*p <= len))) {
p = p + (*p & -2);
}
- p์ ์ฃผ์ ๊ฐ์ด, heap์ ๋งจ ๋ ์ฃผ์ ๋ณด๋ค ์์ ๋๋ง ๋ฐ๋ณตํด์ ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ p๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋งจ ๋์ ๋นํธ๊ฐ 1์ด๋ฉด ํ ๋น๋์ด ์๋ค๋ ๋ป์ด๋ ๋์ด๊ฐ๋ค. ๋ํ ์ฐ๋ฆฌ๊ฐ ํ ๋นํ๋ ค๋ ์ฌ์ด์ฆ ๋ณด๋ค, p๊ฐ ๊ฐ๋ฅดํค๋ ๋ธ๋ก์ ์ฌ์ด์ฆ๊ฐ ์์ผ๋ฉด ํ ๋นํ ์ ์์ผ๋ ์ด ๋ํ ๋์ด๊ฐ๋ค.
p = p + (*p & -2);
- 2๋ 11111110์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ๋ฐ๋ผ์ &๋ผ๋ ๋นํธ ์ฐ์ฐ์๋ฅผ ํตํด p์ ์ฌ์ด์ฆ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋งจ ๋ง์ง๋ง์ allocated, free๋ฅผ ๋ํ๋ด๋ flag์ด๋ฏ๋ก ์ด์ ์๊ด์์ด ์ฌ์ด์ฆ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค.
- next fit : ์ด์ ํ์์ด ๋๋ ์ง์ ์ผ๋ก๋ถํฐ free ๋ฆฌ์คํธ๋ฅผ ํ์ํ๋ค.
- best fit : ์ฒ์๋ถํฐ ์ ๋ถ ๊ฒ์ํ์ฌ ํฌ๊ธฐ๊ฐ ๋ฑ ๋ง๋ ๋ธ๋ก์ ์ถ๋ ค๋ธ๋ค. first fit๋ณด๋ค ๋๋ฆด ์ ์๋ค.
๐free ๋ธ๋ก์ ํ ๋นํ๊ธฐ
- ์ฐ๋ฆฌ๊ฐ ํ ๋นํ๊ณ ์ ํ๋ ๋ธ๋ก์ ํฌ๊ธฐ๊ฐ free ๋ธ๋ก์ ํฌ๊ธฐ๋ณด๋ค ์์ ์ ์๋ค. ์ด๋ด ๋๋ ๋ด๋ถ ๋จํธํ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ ๋จ์ ๋ธ๋ก์ splitํ๋๊ฒ ํจ์จ์ ์ด๋ค.
void addblock (ptr p, int len) {
int newsize = ((len + 1) >> 1) << 1;
int oldsize = *p & -2;
*p = newsize | 1;
if (newsize < oldsize) {
*(p + newsize) = oldsize - newsize;
}
}
- ํ ๋น๋๋ ํฌ๊ธฐ์ธ newsize๋ ์ง์๊ฐ ๋๊ฒํ๋ค. ํ์๊ฐ ๋ค์ด์ค๋ฉด +1์ ํ ํ ์ค๋ฅธ์ชฝ์ผ๋ก shiftํ๊ณ ๋ค์ ์ผ์ชฝ์ผ๋ก shiftํ๋ฉด ๋งจ ๋์ด 0์ด๋ฉด์ ํฌ๊ธฐ๋ ์ง์๊ฐ ๋๋ค. ์๋ ์ฌ์ด์ฆ๋ฅผ oldsize๋ก ์ฝ์ด์ฃผ๊ณ p๊ฐ ๊ฐ๋ฅดํค๋ ๊ณณ์๋ newsize๋ฅผ ๋ฃ์๊ณผ ๋์์ 1์ ๋ํ์ฌ allocated์์ ํ์ํ๋ค. ์ด ๋ ๋ง์ฝ ์๋ ๋ธ๋ก์ ํฌ๊ธฐ๊ฐ ๋ ์ปธ๋ค๋ฉด, p์ newsize๋งํผ ๋ํ ๊ณณ์ ํค๋์๋ ํ ๋นํ๊ณ ๋จ์ ๋ธ๋ก์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๊ฒ ํ๋ค. ์ด๋ newsisze์ oldsize ๋ชจ๋ ๋งจ ๋๋นํธ๋ 0์ด๋ฏ๋ก ๋์ด ๋นผ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๐ํ ๋น๋ ๋ธ๋ก free์ํค๊ธฐ
void free_block(ptr p) {
*p = *p & - 2;
}
- free์ํค๋ ๊ฒ์, ๋จ์ํ ๋งจ ๋ flag ๋นํธ๋ฅผ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค. ๋ธ๋ก์ ํ ๋น๋ ๋ฐ์ดํฐ๋ ์ง์์ง๋ ๋ฐฉ์์ด ์๋๋ผ ๋ฎ์ด์์ ์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ๋ง ํด์ฃผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด 5๋ฅผ ํ ๋นํ ๋ ์ธ๋ถ ๋จํธํ๋ก ์ธํด ํ ๋นํ ์ ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ free๋ผ๋ฆฌ ์ด์ด์ ธ ์๋ค๋ฉด ์ฐ๊ฒฐ ์์ผ์ค์ผ ํ๋ค.
๐์ฐ๊ฒฐ
void free_block(ptr p) {
*p = *p & -2; // ๊ธฐ์กด ๋ธ๋ก์ ๋ฐํํ๋ค. *p = 0000 0101(allocated) -> 0000 0100(free), p = 0000 1000์ด๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด,
next = p + *p; // ๋ค์ ๋ธ๋ก์ ๊ธฐ์กด ๋ธ๋ก์ ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ํ ๊ฐ์ด ๋๋ค. next = 0000 1100
if ((*next & 1) == 0) { // ๋ง์ฝ ๋ค์ ๋ธ๋ก์ด free ๋ธ๋ก์ด๋ผ๋ฉด, ex. *next = 0000 0010
*p = *p + *next; // ๋ธ๋ก์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฐ๋ค. ์ด ๋ *p, ์ฆ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ์ ํค๋์ด๋ค.
} // *p๋ 0000 0110์ผ๋ก ํฌ๊ธฐ๊ฐ 4์์ 6์ผ๋ก ๋๋ค.
}
- ๋จ์ํ free๋ง ์ํค๋ ์ฝ๋์์ ์ฐ๊ฒฐ๊น์ง ํด์ฃผ๋ ๊ฒ
- flag๋ฅผ 0 ์ผ๋ก ๋ง๋ค์ด์ค ํ, next๋ ํ์ฌ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ์ฌ์ด์ฆ๋ฅผ ๋ํด์ฃผ๋ ๊ฒ์ด๋ค. ์ด ๋ ์ด next์ flag๊ฐ 0์ด๋ผ๋ฉด free ๋ธ๋ก์์ ๋ํ๋ด๋ฏ๋ก ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ header์ ํ์ฌ ๋ธ๋ก ์ฌ์ด์ฆ์ next ๋ธ๋ก์ ์ฌ์ด์ฆ๋ฅผ ๋ํด์ค๋ค. ์ด ๋ ๋๋ค flag๋ 0์ด๋ฏ๋ก ๊ทธ์ ๋ํด์ฃผ๊ธฐ๋ง ํ๋ฉด๋๋ค.
- ์๋ ๋ค์ ๋ธ๋ก์ด free์ผ ๋์ด๋ค. ํ์ง๋ง ์ด์ ๋ธ๋ก์ด free๋ผ๋ฉด ์ด๋ป๊ฒ ์ฐ๊ฒฐํ ๊น?
๐๊ฒฝ๊ณํ๊ทธ๋ก ์ฐ๊ฒฐํ๊ธฐ
- ํค๋๋ฅผ ๋ณต์ฌํ์ฌ, ๋ธ๋ก์ ๋์ ์์น์ํค๋๋กํ๋ค. ์ด๋ฅผ footer ํน์ ๊ฒฝ๊ณ ํ๊ทธ๋ผ๊ณ ์นญํ๋ค. ์ด๋ free ๋ฆฌ์คํธ๋ฅผ ํ์ํ ๋ ๋ค๋ก ๊ฐ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ ์์ผ๋ก๋ ๊ฐ ์ ์๊ฒ ํด์ฃผ์ง๋ง, ๊ณต๊ฐ์ ์ถ๊ฐ์ ์ผ๋ก ์๊ตฌํ๋ค.
- ํค๋์์ ํ ์นธ๋ง ์์ผ๋ก ๊ฐ๋ฉด ์ด์ ๋ธ๋ก์ด ํ ๋น ์ํ์ธ์ง, free์ํ์ธ์ง ์ ์ ์๋ค. ๋ฐ๋ผ์ ์์์๊ฐ, constant time์ผ๋ก ์ฐ๊ฒฐ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ฐ๋ผ์ free ๋ธ๋ก์ ์ฐ๊ฒฐํ๋ ๋ฐ์ ๋ฐ์ ํ ์ ์๋ ์๊ฐ ๋ณต์ก๋๋ O(1)์ด ๋๋ค.
๐๊ฒฝ๊ณํ๊ทธ์ฐ๊ฒฐ์ด 4๊ฐ์ง์ธ ๊ฒฝ์ฐ
๐๊ฒฝ๊ณํ๊ทธ๋จ์ ๊ณผ ๊ฐ์ ๋ฐฉ์
- ๋จ์ : ๊ฒฐ๊ตญ header์ footer๋ผ๋ ๊ฐ๋
์ ์ฌ์ฉํ๋ฉด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณ์ ํ์๋ก ํ๋ ์
์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
* ์ค๋ฒํค๋ : ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด ํ์ํ ๊ฐ์ ์ ์ธ ์๊ฐ or ๋ฉ๋ชจ๋ฆฌ๋ก, header์ footer๋ผ๋ ๊ฐ๋ ์ ๋์ ํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๊ฒ ๋๋ ์ ์ฒด์ ์ผ๋ก ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ ๋์ด๋๊ฒ ๋๋ค. - ๊ฐ์ ๋ฐฉ์ : ์ด์ ํน์ ์ดํ ๋ธ๋ก์ด ํ ๋น๋๋ค๋ฉด, ์ฆ ํ ๋น๋ ๋ธ๋ก์ด ๋๋ฒ๋ฆฐ๋ค๋ฉด footer๋ฅผ ์์ ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์ ์๋๋ก ํ๋ค. case๋ค์ ์ดํด๋ณด๋ฉด ํ ๋น๋ ๋ธ๋ก๋ค์ footer๋ค์, ์ฐ๊ฒฐ๋ ๋ธ๋ก์ header์ footer์ ์๋ฌด๋ฐ ์ํฅ์ ๋ผ์น๊ณ ์์ง ์๋ค. ๋ฐ๋ผ์ ํ ๋น๋ ๋ธ๋ก์์๋ footer๊ฐ ํ์์น ์๋ค.
- ๊ทธ๋ ๋ค๋ฉด, ํด๋น ๋ธ๋ก์ ์ด๋ป๊ฒ ์ด์ ์ ๋ธ๋ก์ด ํ ๋น๋์๋์ง ํน์ free์ธ์ง ์ ์ ์์๊น? ํด๋น ๋ธ๋ก์์ ํค๋์ ์ฌ์ฉํ์ง ์๋ ๋นํธ์ธ 3๊ฐ์ ๋นํธ ์ค 1๊ฐ์ ์ด์ ์ ๋ธ๋ก ํ ๋น ์ํ๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค. ์ด๋ฌ๋ฉด ์์ ๋ธ๋ก์ด ํ ๋น๋์๋ค๊ณ ๊ฐ์ ํ์ ๋, ํ์ฌ ํด๋น ๋ธ๋ก์ 3๊ฐ ๋นํธ ์ค 1๊ฐ์ ๋นํธ๋ ์ด์ ๋ธ๋ก์ด ํ ๋น๋์๋ค๊ณ ์๋ ค์ฃผ๋ฏ๋ก ์ฐ๊ฒฐ์ ์๋ํ์ง ์์ ๊ฒ์ด๋ค.
๐first-fit
/*
* 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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#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 */
"week5",
/* First member's full name */
"janghotoung",
/* First member's email address */
"ghdud4653@gmail.com",
/* Second member's full name (leave blank if none) */
"",
/* Second member's email address (leave blank if none) */
""
};
/* ๋ฉํฌ๋ก */
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define MAX(x, y) ((x) > (y)? (x) : (y))
/* ํฌ๊ธฐ์ ํ ๋น ๋นํธ๋ฅผ ํตํฉํด์ ํค๋์ ํํฐ์ ์ ์ฅํ ์ ์๋ ๊ฐ์ return */
#define PACK(size, alloc) ((size) | (alloc))
/* ์ธ์ p๊ฐ ์ฐธ์กฐํ๋ ์๋ ์ฝ์ด์ return */
/* ์ธ์ p๋ ๋๊ฐ (void*) ํฌ์ธํฐ. ์ง์ ์ ์ผ๋ก ์ญ์ฐธ์กฐ ๋ถ๊ฐ */
#define GET(p) (*(unsigned int *)(p))
/* ์ธ์ p๊ฐ ๊ฐ๋ฆฌํค๋ ์๋์ val ์ ์ฅ */
#define PUT(p, val) (*(unsigned int *)(p) = (val))
/* ๊ฐ๊ฐ ์ฃผ์ p์ ์๋ ํค๋, ํํฐ์ size์ ํ ๋น ๋นํธ๋ฅผ return */
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
/* ๋ธ๋ก ํฌ์ธํฐ bp๊ฐ ์ฃผ์ด์ง๋ฉด, ๊ฐ๊ฐ ๋ธ๋ก ํค๋์ ํํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ return */
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
/* ๋ธ๋ก ํฌ์ธํฐ bp๊ฐ ์ฃผ์ด์ง๋ฉด, ๊ฐ๊ฐ ๋ค์๊ณผ ์ด์ ๋ธ๋ก์ ๋ธ๋ก ํฌ์ธํฐ๋ฅผ return */
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
/* rounds up to the nearest multiple of ALIGNMENT */
#define ALIGN(size) (((size) + (DSIZE-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
/* ํจ์ ์ ์ธ */
static void *extend_heap(size_t);
static void *coalesce(void *);
/* ์ ์ญ ๋ณ์ */
static char *heap_listp;
/*
* mm_init - ํ ๋น๊ธฐ ์ด๊ธฐํ
*/
int mm_init(void)
{
/* ๋ฉ๋ชจ๋ฆฌ ์์คํ
์์ 4์๋ ๊ฐ์ ธ์ ๋น ๊ฐ์ฉ ๋ฆฌ์คํธ ๋ง๋ค ์ ์๋๋ก ์ด๊ธฐํ */
if ((heap_listp = mem_sbrk(4*WSIZE)) == (void *)-1)
return -1;
PUT(heap_listp, 0); /* Alignment padding */
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1)); /* Prologue header */
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1)); /* Prologue footer */
PUT(heap_listp + (3*WSIZE), PACK(0, 1)); /* Epilogue header */
heap_listp += (2*WSIZE);
/* heap์ CHUNKSIZE ๋ฐ์ดํธ๋ก ํ์ฅ ํ ์ด๊ธฐ ๊ฐ์ฉ ๋ธ๋ก ์์ฑ */
if (extend_heap(CHUNKSIZE/WSIZE) == NULL)
return -1;
return 0;
}
/*
* coalesc - ๊ฐ์ฉ ๋ธ๋ญ ์์ฑ์ ํตํฉ
*/
static void *coalesce(void *bp)
{
size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp)));
size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
size_t size = GET_SIZE(HDRP(bp));
if (prev_alloc && next_alloc){ /* Case 1 */
return bp;
}
else if (prev_alloc && !next_alloc){ /* Case 2 */
size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
}
else if (!prev_alloc && next_alloc){ /* Case 3 */
size += GET_SIZE(HDRP(PREV_BLKP(bp)));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
bp = PREV_BLKP(bp);
}
else{ /* Case 4 */
size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(FTRP(NEXT_BLKP(bp)));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0));
bp = PREV_BLKP(bp);
}
return bp;
}
/*
* expend_heap - malloc package ์ด๊ธฐํ
* 1. ํ ์ด๊ธฐํ์
* 2. mm_malloc์ด ์ ๋นํ fit์ ๋ชป์ฐพ์์ ๋, ์ ๋ ฌ ์ ์ง ์ํด ํธ์ถ
*/
static void *extend_heap(size_t words)
{
char *bp;
size_t size;
/* ์ ๋ ฌ ์ ์ง ์ํด ์ง์ word ํ ๋น */
size = (words % 2) ? (words+1) * WSIZE : words * WSIZE;
if ((long)(bp = mem_sbrk(size)) == -1)
return NULL;
/* ๊ฐ์ฉ ๋ธ๋ญ์ ํค๋, ํธํฐ ์ epilogue ํค๋ ์ด๊ธฐํ */
PUT(HDRP(bp), PACK(size, 0)); /* Free block ํค๋ */
PUT(FTRP(bp), PACK(size, 0)); /* Free block ํธํฐ */
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1)); /* New epilogue ํค๋ */
/* ์ด์ ๋ธ๋ก์ด ๊ฐ์ฉ๋ฌ์ ๋ ํตํฉ */
return coalesce(bp);
}
/* first-fit ๊ฒ์ */
static void *find_fit(size_t asize)
{
void *bp;
for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp))
{
if (!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp)))){
return bp;
}
}
/* No fit */
return NULL;
}
/*
* place - ๋ง๋ ๋ธ๋ก ์ฐพ์ผ๋ฉด ํ ๋น๊ธฐ๋ ์์ฒญํ ๋ธ๋ก์ ๋ฐฐ์น, ์ต์
์ผ๋ก ์ถ๊ฐ ๋ถ๋ถ ๋ถํ
*/
static void place(void *bp, size_t asize)
{
size_t csize = GET_SIZE(HDRP(bp));
if ((csize - asize) >= (2 * DSIZE))
{
PUT(HDRP(bp), PACK(asize, 1));
PUT(FTRP(bp), PACK(asize, 1));
bp = NEXT_BLKP(bp);
PUT(HDRP(bp), PACK(csize - asize, 0));
PUT(FTRP(bp), PACK(csize - asize, 0));
}
else
{
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
}
}
/*
* mm_malloc - size ๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ์์ฒญ
* brk pointer๋ฅผ ์ฆ๊ฐ์์ผ ๋ธ๋ก ํ ๋น
*/
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;
else /* 8๋ฐ์ดํธ ๋๋ ์์ฒญ์ ๋ํด ์ค๋ฒํค๋ ๋ฐ์ดํธ ์ถ๊ฐ, ์ธ์ 8์ ๋ฐฐ์๋ก ๋ฐ์ฌ๋ฆผ */
asize = DSIZE * ((size + (DSIZE) + (DSIZE-1)) / DSIZE);
/* ์ ์ ํ ๊ฐ์ฉ ๋ธ๋ก์ ๊ฐ์ฉ ๋ฆฌ์คํธ์์ ๊ฒ์ */
if ((bp = find_fit(asize)) != NULL){
/* ๋ง๋ ๋ธ๋ก ์ฐพ์ผ๋ฉด ํ ๋น๊ธฐ๋ ์์ฒญํ ๋ธ๋ก์ ๋ฐฐ์น, ์ต์
์ผ๋ก ์ถ๊ฐ ๋ถ๋ถ ๋ถํ */
place(bp, asize);
/* ์๋ก ํ ๋นํ ๋ธ๋ก์ ํฌ์ธํฐ return */
return bp;
}
/* ์ ์ ํ ๊ฐ์ฉ ๋ธ๋ก์ ๊ฐ์ฉ ๋ฆฌ์คํธ์์ ์ฐพ์ง ๋ชปํ๋ฉด, ํ์ ์๋ก์ด ๊ฐ์ฉ ๋ธ๋ก์ผ๋ก ํ์ฅ */
extendsize = MAX(asize, CHUNKSIZE);
if ((bp = extend_heap(extendsize/WSIZE)) == NULL)
return NULL;
/* ์์ฒญํ ๋ธ๋ก์ ์ ๊ฐ์ฉ ๋ธ๋ก์ ๋ฐฐ์น, ํ์์ ๋ธ๋ก์ ๋ถํ */
place(bp, asize);
/* ์๋ก ํ ๋นํ ๋ธ๋ก์ ํฌ์ธํฐ return */
return bp;
}
/*
* mm_free - ์์ฒญํ ๋ธ๋ก ๋ฐํํ๊ณ ๊ฒฝ๊ณ ํ๊ทธ ์ฐ๊ฒฐ ์ฌ์ฉํด ์์ ์๊ฐ์ ์ธ์ ๊ฐ์ฉ ๋ธ๋ก๋ค๊ณผ ํตํฉ
*/
void mm_free(void *bp)
{
size_t size = GET_SIZE(HDRP(bp));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
/* ์ธ์ ๊ฐ์ฉ ๋ธ๋ก๋ค ํตํฉ */
coalesce(bp);
}
/*
* mm_realloc - ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์ฉ ์ ์งํ๋ฉฐ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ๋ณ๊ฒฝ
*/
void *mm_realloc(void *bp, size_t size)
{
if ((int)size == 0)
{
// mm_free(bp);
return NULL;
}
else
if (size > 0)
{
size_t oldsize = GET_SIZE(HDRP(bp));
size_t newsize = size + (2 * WSIZE); /* ํค๋์ ํธํฐ ์ํ 2 words ์ถ๊ฐ */
/* newsize๊ฐ oldsize๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด return bp */
if (newsize <= oldsize)
{
return bp;
}
/* oldsize ๋ณด๋ค new size๊ฐ ํฌ๋ฉด ๋ฐ๊ฟ */
else
{
/* ๋ค์ ๋ธ๋ก์ ํ ๋น ์ฌ๋ถ ๋นํธ */
size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
size_t csize;
/* next block์ด ๊ฐ์ฉ ์ํ์ด๊ณ , old์ next block์ ์ฌ์ด์ฆ ํฉ์ด new size๋ณด๋ค ํฌ๋ฉด ํฉ์ณ์ ์ฌ์ฉ */
if (!next_alloc && ((csize = oldsize + GET_SIZE(HDRP(NEXT_BLKP(bp))))) >= newsize)
{
// remove_from_free_list(NEXT_BLK(bp));
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
return bp;
}
/* next block์ด ํ ๋น๋ ์ํ์ด๊ฑฐ๋, old์ next block์ ์ฌ์ด์ฆ ํฉ์ด new size๋ณด๋ค ์์ ๋ ์ block ์์ฑ */
else
{
void *new_ptr = mm_malloc(newsize);
// place(new_ptr, newsize);
memcpy(new_ptr, bp, newsize);
mm_free(bp);
return new_ptr;
}
}
}
else
return NULL;
}
๐next-fit
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#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 */
"week5",
/* First member's full name */
"janghoyoung",
/* First member's email address */
"ghdud4653@gmail.com",
/* Second member's full name (leave blank if none) */
"",
/* Second member's email address (leave blank if none) */
""
};
/* ๋ฉํฌ๋ก */
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define MAX(x, y) ((x) > (y)? (x) : (y))
/* ํฌ๊ธฐ์ ํ ๋น ๋นํธ๋ฅผ ํตํฉํด์ ํค๋์ ํํฐ์ ์ ์ฅํ ์ ์๋ ๊ฐ์ return */
#define PACK(size, alloc) ((size) | (alloc))
/* ์ธ์ p๊ฐ ์ฐธ์กฐํ๋ ์๋ ์ฝ์ด์ return */
/* ์ธ์ p๋ ๋๊ฐ (void*) ํฌ์ธํฐ. ์ง์ ์ ์ผ๋ก ์ญ์ฐธ์กฐ ๋ถ๊ฐ */
#define GET(p) (*(unsigned int *)(p))
/* ์ธ์ p๊ฐ ๊ฐ๋ฆฌํค๋ ์๋์ val ์ ์ฅ */
#define PUT(p, val) (*(unsigned int *)(p) = (val))
/* ๊ฐ๊ฐ ์ฃผ์ p์ ์๋ ํค๋, ํํฐ์ size์ ํ ๋น ๋นํธ๋ฅผ return */
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
/* ๋ธ๋ก ํฌ์ธํฐ bp๊ฐ ์ฃผ์ด์ง๋ฉด, ๊ฐ๊ฐ ๋ธ๋ก ํค๋์ ํํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ return */
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
/* ๋ธ๋ก ํฌ์ธํฐ bp๊ฐ ์ฃผ์ด์ง๋ฉด, ๊ฐ๊ฐ ๋ค์๊ณผ ์ด์ ๋ธ๋ก์ ๋ธ๋ก ํฌ์ธํฐ๋ฅผ return */
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
/* ์ ๋ ฌ ์ ์ง ์ํด ๊ฐ๊น์ด ๋ฐฐ์๋ก ๋ฐ์ฌ๋ฆผ */
#define ALIGN(size) (((size) + (DSIZE-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
/* ํจ์ ์ ์ธ */
static void *extend_heap(size_t);
static void *coalesce(void *);
static void *find_fit(size_t);
static void place(void *, size_t);
/* ์ ์ญ ๋ณ์ */
static char *heap_listp;
static char *last_bp ;
/*
* mm_init - ํ ๋น๊ธฐ ์ด๊ธฐํ
*/
int mm_init(void)
{
/* ๋ฉ๋ชจ๋ฆฌ ์์คํ
์์ 4์๋ ๊ฐ์ ธ์ ๋น ๊ฐ์ฉ ๋ฆฌ์คํธ ๋ง๋ค ์ ์๋๋ก ์ด๊ธฐํ */
if ((heap_listp = mem_sbrk(4*WSIZE)) == (void *)-1)
return -1;
PUT(heap_listp, 0); /* Alignment padding */
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1)); /* Prologue header */
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1)); /* Prologue footer */
PUT(heap_listp + (3*WSIZE), PACK(0, 1)); /* Epilogue footer */
heap_listp += (2*WSIZE);
/* heap์ CHUNKSIZE ๋ฐ์ดํธ๋ก ํ์ฅ ํ ์ด๊ธฐ ๊ฐ์ฉ ๋ธ๋ก ์์ฑ */
if (extend_heap(CHUNKSIZE/WSIZE) == NULL)
return -1;
last_bp = heap_listp;
return 0;
}
/*
* coalesc - ๊ฐ์ฉ ๋ธ๋ญ ์์ฑ์ ํตํฉ
*/
static void *coalesce(void *bp)
{
size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp)));
size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
size_t size = GET_SIZE(HDRP(bp));
if (prev_alloc && next_alloc){ /* Case 1 */
last_bp = bp;
return bp;
}
else if (prev_alloc && !next_alloc){ /* Case 2 */
size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
}
else if (!prev_alloc && next_alloc){ /* Case 3 */
size += GET_SIZE(HDRP(PREV_BLKP(bp)));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
bp = PREV_BLKP(bp);
}
else{ /* Case 4 */
size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(FTRP(NEXT_BLKP(bp)));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0));
bp = PREV_BLKP(bp);
}
last_bp = bp;
return bp;
}
/*
* expend_heap - malloc package ์ด๊ธฐํ
* 1. ํ ์ด๊ธฐํ์
* 2. mm_malloc์ด ์ ๋นํ fit์ ๋ชป์ฐพ์์ ๋, ์ ๋ ฌ ์ ์ง ์ํด ํธ์ถ
*/
static void *extend_heap(size_t words)
{
char *bp;
size_t size;
/* ์ ๋ ฌ ์ ์ง ์ํด ์ง์ word ํ ๋น */
size = (words % 2) ? (words+1) * WSIZE : words * WSIZE;
if ((long)(bp = mem_sbrk(size)) == -1)
return NULL;
/* ๊ฐ์ฉ ๋ธ๋ญ์ ํค๋, ํธํฐ ์ epilogue ํค๋ ์ด๊ธฐํ */
PUT(HDRP(bp), PACK(size, 0)); /* Free block ํค๋ */
PUT(FTRP(bp), PACK(size, 0)); /* Free block ํธํฐ */
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1)); /* New epilogue ํค๋ */
/* ์ด์ ๋ธ๋ก์ด ๊ฐ์ฉ๋ฌ์ ๋ ํตํฉ */
return coalesce(bp);
}
/* next-fit ๊ฒ์ */
static void *find_fit(size_t asize)
{
char *bp = last_bp;
/* ํ์ฌ ์์น์์ ๋ค์ ๋ธ๋ก์ ๋ธ๋ก ํฌ๊ธฐ๊ฐ 0์ด ์๋ ๋, ๊ทธ ๋ค์ ๋ธ๋ก ๊ฒ์ */
for (bp = NEXT_BLKP(bp); GET_SIZE(HDRP(bp))!=0; bp = NEXT_BLKP(bp))
{
/* ๊ฐ์ฉ ๋ธ๋ก์ด๊ณ , ํฌ๊ธฐ๊ฐ ์ฌ์ด์ฆ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋ */
if (GET_ALLOC(HDRP(bp)) == 0 && GET_SIZE(HDRP(bp)) >= asize)
{
last_bp = bp;
return bp;
}
}
/* ๊ฐ์ฉ ๋ธ๋ก ๋ฆฌ์คํธ๊ฐ ๋์ฌ ๋๊น์ง */
bp = heap_listp;
while (bp < last_bp)
{
bp = NEXT_BLKP(bp);
if (GET_ALLOC(HDRP(bp)) == 0 && GET_SIZE(HDRP(bp)) >= asize)
{
last_bp = bp;
return bp;
}
}
return NULL ;
}
/*
* place - ๋ง๋ ๋ธ๋ก ์ฐพ์ผ๋ฉด ํ ๋น๊ธฐ๋ ์์ฒญํ ๋ธ๋ก์ ๋ฐฐ์น, ์ต์
์ผ๋ก ์ถ๊ฐ ๋ถ๋ถ ๋ถํ
*/
static void place(void *bp, size_t asize)
{
size_t csize = GET_SIZE(HDRP(bp));
if ((csize - asize) >= (2 * DSIZE))
{
PUT(HDRP(bp), PACK(asize, 1));
PUT(FTRP(bp), PACK(asize, 1));
bp = NEXT_BLKP(bp);
PUT(HDRP(bp), PACK(csize - asize, 0));
PUT(FTRP(bp), PACK(csize - asize, 0));
}
else
{
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
}
}
/*
* mm_malloc - size ๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ์์ฒญ
* brk pointer๋ฅผ ์ฆ๊ฐ์์ผ ๋ธ๋ก ํ ๋น
*/
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;
else /* 8๋ฐ์ดํธ ๋๋ ์์ฒญ์ ๋ํด ์ค๋ฒํค๋ ๋ฐ์ดํธ ์ถ๊ฐ, ์ธ์ 8์ ๋ฐฐ์๋ก ๋ฐ์ฌ๋ฆผ */
asize = DSIZE * ((size + (DSIZE) + (DSIZE-1)) / DSIZE);
/* ์ ์ ํ ๊ฐ์ฉ ๋ธ๋ก์ ๊ฐ์ฉ ๋ฆฌ์คํธ์์ ๊ฒ์ */
if ((bp = find_fit(asize)) != NULL){
/* ๋ง๋ ๋ธ๋ก ์ฐพ์ผ๋ฉด ํ ๋น๊ธฐ๋ ์์ฒญํ ๋ธ๋ก์ ๋ฐฐ์น, ์ต์
์ผ๋ก ์ถ๊ฐ ๋ถ๋ถ ๋ถํ */
place(bp, asize);
last_bp = bp;
/* ์๋ก ํ ๋นํ ๋ธ๋ก์ ํฌ์ธํฐ return */
return bp;
}
/* ์ ์ ํ ๊ฐ์ฉ ๋ธ๋ก์ ๊ฐ์ฉ ๋ฆฌ์คํธ์์ ์ฐพ์ง ๋ชปํ๋ฉด, ํ์ ์๋ก์ด ๊ฐ์ฉ ๋ธ๋ก์ผ๋ก ํ์ฅ */
extendsize = MAX(asize, CHUNKSIZE);
if ((bp = extend_heap(extendsize/WSIZE)) == NULL)
return NULL;
/* ์์ฒญํ ๋ธ๋ก์ ์ ๊ฐ์ฉ ๋ธ๋ก์ ๋ฐฐ์น, ํ์์ ๋ธ๋ก์ ๋ถํ */
place(bp, asize);
last_bp = bp;
/* ์๋ก ํ ๋นํ ๋ธ๋ก์ ํฌ์ธํฐ return */
return bp;
}
/*
* mm_free - ์์ฒญํ ๋ธ๋ก ๋ฐํํ๊ณ ๊ฒฝ๊ณ ํ๊ทธ ์ฐ๊ฒฐ ์ฌ์ฉํด ์์ ์๊ฐ์ ์ธ์ ๊ฐ์ฉ ๋ธ๋ก๋ค๊ณผ ํตํฉ
*/
void mm_free(void *bp)
{
size_t size = GET_SIZE(HDRP(bp));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
/* ์ธ์ ๊ฐ์ฉ ๋ธ๋ก๋ค ํตํฉ */
coalesce(bp);
}
/*
* mm_realloc - ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์ฉ ์ ์งํ๋ฉฐ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ๋ณ๊ฒฝ
*/
void *mm_realloc(void *bp, size_t size)
{
if ((int)size < 0)
return NULL;
else if ((int)size == 0)
{
mm_free(bp);
return NULL;
}
else if (size > 0)
{
size_t oldsize = GET_SIZE(HDRP(bp));
size_t newsize = size + (2 * WSIZE); /* ํค๋์ ํธํฐ ์ํ 2 words ์ถ๊ฐ */
/* newsize๊ฐ oldsize๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด return bp */
if (newsize <= oldsize)
{
return bp;
}
/* oldsize ๋ณด๋ค new size๊ฐ ํฌ๋ฉด ๋ฐ๊ฟ */
else
{
/* ๋ค์ ๋ธ๋ก์ ํ ๋น ์ฌ๋ถ ๋นํธ */
size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
size_t csize;
/* next block์ด ๊ฐ์ฉ ์ํ์ด๊ณ , old์ next block์ ์ฌ์ด์ฆ ํฉ์ด new size๋ณด๋ค ํฌ๋ฉด ํฉ์ณ์ ์ฌ์ฉ */
if (!next_alloc && ((csize = oldsize + GET_SIZE(HDRP(NEXT_BLKP(bp))))) >= newsize)
{
// remove_from_free_list(NEXT_BLK(bp));
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
return bp;
}
/* next block์ด ํ ๋น๋ ์ํ์ด๊ฑฐ๋, old์ next block์ ์ฌ์ด์ฆ ํฉ์ด new size๋ณด๋ค ์์ ๋ ์ block ์์ฑ */
else
{
void *new_ptr = mm_malloc(newsize);
place(new_ptr, newsize);
memcpy(new_ptr, bp, newsize);
mm_free(bp);
return new_ptr;
}
}
}
else
return NULL;
}