๐ง ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ธฐ ์ ์๋ ๊ทธ ํฌ๊ธฐ๋ฅผ ์ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐํ์ ์์ ํ๋ํ๊ธฐ ์ํด ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฌ์ฉํฉ๋๋ค.
๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ๋ ํ(heap)์ด๋ผ๊ณ ํ๋ ํ๋ก์ธ์ค์ ๊ฐ์๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ด๋ฆฌํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์์คํ ๋ง๋ค ๋ค๋ฅด์ง๋ง, ์ผ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฒํ์ง ์๋ ํ๋์์, ํ ์์ญ์ด ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ ์์ญ ์ดํ๋ถํฐ ์์ํ์ฌ ์์ชฝ(์ฃผ์๊ฐ ์ฆ๊ฐํ๋ ๋ฐฉํฅ)์ผ๋ก ์ปค์ง๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ผ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
๊ฐ๊ฐ์ ํ๋ก์ธ์ค์ ํ ๋น๋๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ์ฌ, ์ปค๋์ ํ ์์ญ์ ๊ผญ๋๊ธฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ(brk ptr)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ๋ ํ์ ๋ค์ํ ํฌ๊ธฐ์ ๋ธ๋ก ๋จ์๋ก ๊ด๋ฆฌํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๋ฐฉ๋ฒ์๋ ๋ช ์์ (Explicit)์ผ๋ก ํ ๋นํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฌต์์ (Implicit)์ผ๋ก ํ ๋นํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ช ์์ ํ ๋น
์์ฉ ํ๋ก๊ทธ๋จ์ด ํ ๋นํ๊ณ , ๋ฐํํฉ๋๋ค.
์๋ฅผ ๋ค์ด C ํ๋ก๊ทธ๋จ์ malloc๊ณผ free๊ฐ ์ด์ ํด๋นํฉ๋๋ค.
๋ฌต์์ ํ ๋น
์์ฉ ํ๋ก๊ทธ๋จ์ด ํ ๋นํ์ง๋ง, ์ง์ ๋ฐํํ์ง๋ ์์ต๋๋ค.
์ด๋ฅผ ์ํด์๋ ๋ ์ด์ ํ๋ก๊ทธ๋จ์ ์ํด ์ฌ์ฉ๋์ง ์๋ ๋ธ๋ก์ ๊ฒ์ถํ ์ ์์ด์ผ ํฉ๋๋ค.
์์๋ก๋ ์๋ฐ์์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์์ผ๋ฉฐ, ์๋์ผ๋ก ์ฌ์ฉํ์ง ์๋ ํ ๋น๋ ๋ธ๋ก์ ๋ฐํ์์ผ์ฃผ๋ ์์ ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด๋ผ ๋ถ๋ฆ ๋๋ค.
๐ง malloc
C ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ malloc ํจํค์ง๋ก ์๋ ค์ง ๋ช ์์ ์ธ ํ ๋น๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ malloc ํจ์๋ฅผ ํธ์ถํด์ ํ์ผ๋ก๋ถํฐ ๋ธ๋ก๋ค์ ํ ๋น๋ฐ์ต๋๋ค.
#include <stdlib.h>
void * malloc(size_t size);
malloc ํจ์๋ ๋ธ๋ก ๋ด์ ํฌํจ๋ ์ ์๋ ์ด๋ค ์ข ๋ฅ์ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋ํด์ ์ ์ ํ ์ ๋ ฌ๋ ์ต์ size ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํฌ์ธํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
์ค์ ๊ตฌํ์์ ์ฝ๋๊ฐ 32๋นํธ ๋ชจ๋์ธ ๊ฒฝ์ฐ ์ฃผ์๋ 8์ ๋ฐฐ์, 64๋นํธ ๋ชจ๋์ธ ๊ฒฝ์ฐ 16์ ๋ฐฐ์์ ๋๋ค.
๋ง์ฝ size๊ฐ 0 ์ด๊ฑฐ๋ ํ ๋น์ ์คํจํ ๊ฒฝ์ฐ NULL์ ๋ฐํํ๋ฉฐ errno๋ฅผ ์ธํ ํฉ๋๋ค.
malloc์ ๋ฆฌํดํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ธฐํํ์ง ์์ต๋๋ค.
๋ง์ฝ ์ด๊ธฐํ๋๊ธธ ์ํ๋ค๋ฉด calloc์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ ์ mallioc์ ํตํด ํ ๋น๋ ๋ธ๋ก์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ realloc ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
#include <stdlib.h>
void * realloc(void * p, size_t size);
realloc์ ๋ธ๋ก p์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ์ ๋ธ๋ก์ ํฌ์ธํฐ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์ ๋ธ๋ก์ ๋ด์ฉ์ ์ด์ ๋ธ๋ก๊ณผ ์ ๋ธ๋ก์ ํฌ๊ธฐ ์ค ์์ ๋ธ๋ก์ ํฌ๊ธฐ๊น์ง๋ ๋ณํจ์์ต๋๋ค.
๐ง sbrk
malloc๊ฐ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ๋ mmap๊ณผ munmap ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ฑฐ๋, ํน์ sbrk ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
#include <unistd.h>
void * sbrk(intptr_t incr);
sbrk ํจ์๋ ์ปค๋์ brk ํฌ์ธํฐ์ incr์ ๋ํด์ ํ์ ๋๋ฆฌ๊ฑฐ๋ ์ค์ ๋๋ค.
์ฑ๊ณตํ๋ค๋ฉด ์ด์ ์ brk ๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
์คํจํ๋ค๋ฉด -1์ ๋ฆฌํดํ๊ณ errno๋ฅผ ENOMEM์ผ๋ก ์ค์ ํฉ๋๋ค.
๐ง free
ํ๋ก๊ทธ๋จ๋ค์ ํ ๋น๋ ํ ๋ธ๋ก์ free ํจ์๋ฅผ ํธ์ถํด์ ๋ฐํํฉ๋๋ค.
#include <stdlib.h>
void free(void * ptr);
ptr ์ธ์๋ malloc, calloc, realloc์์ ํ๋ํ ํ ๋น๋ ๋ธ๋ก์ ์์์ ๊ฐ๋ฆฌ์ผ์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ free์ ๋์์ ์ ์๋์ง ์์ต๋๋ค.
๐ง ์์
ํ ์์ญ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ C ํ๋ก๊ทธ๋จ์ ๋ํ์ฌ 16 ์๋์ ์์ ํ์ malloc๊ณผ free๊ฐ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
(์์๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ ์๋ ๋จ์๋ก ์ฃผ์๊ฐ ์ง์ ๋๋ค๊ณ ํ๊ฒ ์ต๋๋ค.)
๐ง ํ ๋น๊ธฐ ์๊ตฌ์ฌํญ
๋ช ์์ ํ ๋น๊ธฐ๋ค์ ์๋์ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํด์ผ ํฉ๋๋ค.
ํ ๋น๋ ๋ธ๋ก์ ๊ฐฏ์์ ํฌ๊ธฐ๋ ์กฐ์ ํ ์ ์์ต๋๋ค.
์์์ ์์๋ก ๋ค์ด์ค๋ ์์ฒญ ์ฒ๋ฆฌ
์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๊ฐ์ ๊ฐ์ฉ ๋ธ๋ก์ด ์ด์ ์ ํ ๋น ์์ฒญ์ ์ํด ํ์ฌ ํ ๋น๋ ๋ธ๋ก์ ๋์๋์ด์ผ ํ๋ค๋ ์ ํ์ฌํญ์ ๋ง์กฑํ๋ฉด์ ์์์ ์์๋ก ํ ๋น๊ณผ ๋ฐํ์์ฒญ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ํ ๋น๊ธฐ๋ ํ ๋น๊ณผ ๋ฐํ ์์ฒญ์ ์์์ ๋ํด ์๋ฌด๋ฐ ๊ฐ์ ์ ํ ์ ์์ต๋๋ค.
๋ชจ๋ ํ ๋น ์์ฒญ์ ์ฆ์ ์๋ต
์์ฒญ ์์๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์ฒญ์ ๋ฒํผ๋ฑ์ ์ ์ฅํ ์ ์์ต๋๋ค.
๋ธ๋ก์ ํ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์๋ง ํ ๋นํด์ผ ํฉ๋๋ค.
๋ธ๋ก๋ค์ ๋ชจ๋ ์ฃผ์๋ง์ถค ์๊ฑด์ ๋ง์กฑํ๋๋ก ์ ๋ ฌํด์ผ ํฉ๋๋ค.
๋ฆฌ๋ ์ค ์ปดํจํฐ์ GNU malloc์์๋ 8 ํน์ 16๋ฐ์ดํธ์ ์ ๋ ฌ์ ์ฌ์ฉํฉ๋๋ค.
ํ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ง์ ๊ด๋ฆฌํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
์ผ๋จ ํ ๋น๋ ๋ธ๋ก๋ค์ ์ด๋ํ ์ ์์ต๋๋ค.
์์ ๊ฐ์ ์๊ตฌ์ฌํญ๋ค์ ๋ง์กฑํ๋ฉด์, ๋ ์ข์ ์ฑ๋ฅ์ ๋ด๊ธฐ ์ํด ์ฒ๋ฆฌ๋๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ด์ฉ๋๋ฅผ ์ต๋ํํ๊ธฐ ์ํ์ฌ ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค.
์ด์์ ์ผ๋ก๋ malloc๊ณผ free ์ํ ์ (์ธ์ ๋ ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง) ์์ ์๊ฐ์ด ๊ฑธ๋ ค์ผ ํ๋ฉฐ,
๊ณต๊ฐ ํ์ฉ๋๋ฅผ ๋์ด๊ธฐ ์ํด ํํธํ(fragmentation)๋ฅผ ์ต์ํํด์ผ ํฉ๋๋ค.
๐ง ์ฑ๋ฅ ์งํ 1 : Throughput(์ฒ๋ฆฌ๋)
malloc๊ณผ free ์์ฒญ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
$R_0,\; R_1,\; ...,\; R_k, \;...,\; R_{n-1}$
์ฒ๋ฆฌ๋์ ๋จ์ ์๊ฐ(1 ์ด)๋์์ ์๋ฃํ ์์ฒญ์ ์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด 5000๋ฒ์ malloc๊ณผ 5000๋ฒ์ free๋ฅผ 10์ด ๋์์ ์ํํ๋ ๊ฒฝ์ฐ, ์ฒ๋ฆฌ๋์ `1000 operations / second` ์ ๋๋ค.
๐ง ์ฑ๋ฅ ์งํ 2 : ์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ด์ฉ๋ฅ (Utilization)
malloc๊ณผ free ์์ฒญ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
$R_0,\; R_1,\; ...,\; R_k, \;...,\; R_{n-1}$
์ด ๋ฐ์ดํฐ $P_k$ : ์์ฒญ $R_k$ ๊ฐ ์ฒ๋ฆฌ๋ ํ, ์ด ๋ฐ์ดํฐ $P_k$ ๋ ํ์ฌ ํ ๋น๋ ๋ฐ์ดํฐ๋ค์ ํฉ์ ๋๋ค.
ํ์ฌ ํ์ ํฌ๊ธฐ $H_k$
์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ด์ฉ๋ฅ :
k๊ฐ์ ์์ฒญ ํ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ด์ฉ๋ฅ ์ $U_k = \frac{(max_{i \leq k} P_i)}{H_k}$ ์ ๋๋ค.
๐ง Fragmentation(ํํธํ)
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ํจ์จ์ด ๋จ์ด์ง๋ ์ด์ ๋ ํํธํ(fragmentation)๋ก ์ธํ์ฌ ๋ฐ์ํฉ๋๋ค.
ํํธํ๋ ๋ด๋ถ ํํธํ์ ์ธ๋ถ ํํธํ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
๐ Internal Fragmentation (๋ด๋ถ ํํธํ)
์ผ๋ถ ๋ธ๋ก์์ ๋ด๋ถ ํํธํ๋ ๋ธ๋ก ํฌ๊ธฐ์ ๋ฐ์ดํฐ ํฌ๊ธฐ ์ฌ์ด์ ์ฐจ์ด๋ก ์ธํ์ฌ ๋ฐ์ํฉ๋๋ค.
์ฆ ํ ๋น๋ ๋ธ๋ก์ด ๋ฐ์ดํฐ ์์ฒด๋ณด๋ค ๋ ํฐ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค.
๋ด๋ถ ํํธํ๋ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ์งํ๊ณ , ์ ๋ ฌ์ ์ํด ๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ํ ๋น ์ ์ฑ ์ ์ ํ ์ค๋ฒํค๋ (๋ธ๋ก์ ๋๋์ง ์๋ ๊ฒฝ์ฐ)๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
์ด์ ์ ์์ฒญํ ํจํด์ ์ํด์๋ง ์ํฅ์ ๋ฐ์ผ๋ฉฐ ๋ฐ๋ผ์ ์ธก์ ํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
๐ External Fragmentation (์ธ๋ถ ํํธํ)
ํ ๋น ์์ฒญ์ ๋ง์กฑ์ํฌ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ ์ ์ฒด๋ฅผ ํฉ์ณค์ ๋์๋ ์กด์ฌํ์ง๋ง, ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ๋จ์ผ ๊ฐ์ฉ๋ธ๋ก์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ์ธ๋ถ ํํธํ์ ์์์ ๋๋ค.
ํด๋น ๊ฒฝ์ฐ malloc(6)์ ๊ฒฝ์ฐ, ์ ์ฒด ํ์ ๊ฐ์ฉ ๊ณต๊ฐ์ ์ด ํฉ์ 7์ธ ๋ฐ๋ฉด, ๊ฐ์ฉํ ๋จ์ผ ๋ธ๋ญ์ ์ต๋ ํฌ๊ธฐ๊ฐ 5์ด๋ฏ๋ก ํ ๋นํ ์ ์๋ ์ํ์ ๋์ฌ์์ต๋๋ค.
์ธ๋ถ ํํธํ๋ ๋ด๋ถ ํํธํ์ ๋ฌ๋ฆฌ ๋ฏธ๋์ ์์ฒญ์ ์ํ์ฌ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ์ธก์ ์ด ์ด๋ ต์ต๋๋ค.
๐ง malloc๊ณผ free ๊ตฌํ ์ ๊ณ ๋ ค์ฌํญ
- ๊ฐ์ฉ๋ธ๋ก์ ์ง์์ ์ผ๋ก ์ถ์ ํ๊ณ ๊ด๋ฆฌํ ์ ์์ด์ผ ํฉ๋๋ค.
- ๊ฐ์ฉ๋ธ๋ก๋ณด๋ค ์์ ํฌ๊ธฐ์ ๊ตฌ์กฐ์ฒด๋ฅผ ํ ๋นํ ๋, ๋จ๋ ๊ณต๊ฐ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ํ ๋น์ ์ํ ๊ฐ์ฉ ๋ธ๋ก์ ์ด๋ป๊ฒ ์ ํํด์ผ ํ ์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ๋ฐํ๋ ๋ธ๋ก์ ๊ฐ์ฉ ๋ธ๋ก์ผ๋ก ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผ ํ ์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ์ผ๋ง๋งํผ free ์์ผ์ผ ํ๋์ง ์ ์ ์์ด์ผ ํฉ๋๋ค.
๐ง free ๋ธ๋ญ ๊ด๋ฆฌํ๊ธฐ
Free ๋ธ๋ญ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค.
๊ฐ์ (๋ฌต์์ ) ๋ฆฌ์คํธ ๋ฐฉ์ (Implicit List):
๋ธ๋ก์ ํฌ๊ธฐ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ๋ธ๋ก์ ์ฐ๊ฒฐํฉ๋๋ค.
์ง์ (๋ช ์์ ) ๋ฆฌ์คํธ ๋ฐฉ์ (Explicit List):
๊ฐ์ฉ ๋ธ๋ก๋ผ๋ฆฌ๋ง ํฌ์ธํฐ๋ก ์ฐ๊ฒฐํฉ๋๋ค.
๊ตฌ๋ถ ๊ฐ์ฉ ๋ฆฌ์คํธ ๋ฐฉ์ (Segregated Free List)
์ผ์ ํ ๊ตฌ๊ฐ์ ํฌ๊ธฐ๋ณ๋ก ๋๋์ด, ํด๋น ํฌ๊ธฐ ๋ด์ ๊ฐ์ฉ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๊ฐ ์ ์งํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ด์ํฉ๋๋ค.
ํฌ๊ธฐ๋ก ์ ๋ ฌ๋ ๋ธ๋ก ๋ฐฉ์