TIL: ptmalloc2 ๐๏ธ
https://dreamhack.io/lecture/courses/98
ptmalloc2
ptmalloc2๋ Linux์ Memory Allocator์ด๋ค. ptmalloc2๋ memory๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์๋ ์ธ ๊ฐ์ง ํน์ง์ ๊ฐ๋๋ค:
- Memory ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด memory allocation ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ฐ์ free๋ block ์ค์์ ์ฌ์ฌ์ฉํ ์ ์๋ block์ด ์๋์ง ํ์ธํ๋ค.
- tcache์ bin์ด๋ผ๋ linked list์ free๋ block๋ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- Fragmentation์ ์ต์ํํ๊ธฐ ์ํด alignment, coalescence, split์ ์ฌ์ฉํ๋ค. 64 bit machine์์ ptmalloc2๋ memory ๊ณต๊ฐ์ 16 byte ๋จ์๋ก ํ ๋นํ๋ค.
Chunk
Chunk๋ ptmalloc์ด allocateํ๊ณ freeํ๋ block์ ์๋ฏธํ๋ค. Header์ data๋ก ๊ตฌ์ฑ๋๋๋ฐ, header๋ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋๋ค.
bin
bin์ freed chunk๊ฐ ์ ์ฅ๋๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ค์ด๋ค. ptmalloc์๋ ์ด 128๊ฐ์ bin๋ค์ด ์ ์๋์ด ์๋๋ฐ, ์ด ์ค 62๊ฐ๋ smallbin, 63๊ฐ๋ largebin, 1๊ฐ๋ unsortedbin์ด๊ณ , ๋๋จธ์ง 2๊ฐ๋ ์ฌ์ฉ๋์ง ์๋๋ค.
smallbin
- 32 byte ~ 1008 byte ํฌ๊ธฐ์ chunk๊ฐ ์ ์ฅ๋จ.
- ๊ฐ bin ๋ณ๋ก ์ ํด์ง ํฌ๊ธฐ์ chunk๋ง์ด ์ ์ฅ๋๋ฉฐ, index๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ ์ฅ๋๋ chunk์ ํฌ๊ธฐ๋ 16 byte์ฉ ์ฆ๊ฐํ๋ค. (smallbin[0]์๋ 32 byte, smallbin[61]์๋ 1008 byte์ chunk๊ฐ ์ ์ฅ๋๋ค.)
- Circular doubly linked list์ด๋ฉฐ, FIFO ๋ฐฉ์์ ์ฌ์ฉํ๋ค. (๋จผ์ free๋ chunk๊ฐ ๋จผ์ allocation์ ์ํด ์ฌ์ฉ๋๋ค.) (FIFO๋ ์๋, fragmentation ๋ ๋ค ์ค๊ฐ)
- coalescence๊ฐ ์ผ์ด๋๋ค. ptmalloc2์์๋ consolidation์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ค.
fastbin
- smallbin, largebin, unsortedbin๊ณผ๋ ๋ณ๋๋ก ์กด์ฌํ๋ bin์ผ๋ก, ์์ chunk๊ฐ ๋ฐ๋ณต์ ์ผ๋ก allocate ๋ฐ free๋ ๋ ๋น ๋ฅด๊ฒ ์๋ํ๋๋ก ํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
- 32 byte ~ 176 byte ํฌ๊ธฐ์ chunk๊ฐ ์ ์ฅ๋จ. 16 byte์ฉ ๋์ด ์ด 10๊ฐ์ fastbin์ด ์กด์ฌํ๋๋ฐ, linux๋ ์ด ์ค ์์ ํฌ๊ธฐ๋ถํฐ 7๊ฐ๋ง์ ์ฌ์ฉํ๋ค. ์ฆ, 32 byte ~ 128 byte์ chunk๋ค์ ์ ์ฅํ๋ค.
- Singly linked list์ด๋ฉฐ, LIFO ๋ฐฉ์์ ์ฌ์ฉํ๋ค. (LIFO๋ ์๋๋ ๋น ๋ฅด์ง๋ง fragmentation์ด ์ฌํ๋ค.)
- NO coalescence
largebin
- 1024 byte ์ด์์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ chunk๊ฐ ์ ์ฅ๋๋ค.
- ๊ฐ bin์ ์ผ์ ๋ฒ์ ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ๋ชจ๋ chunk๊ฐ ์ ์ฅ๋๋ค. ์ด ๋ฒ์๋ index๊ฐ ์ฆ๊ฐํ ์๋ก ๋ก๊ทธ์ ์ผ๋ก ์ฆ๊ฐํ๋ค. (largebin[0]๋ 1024 ~ 1088 byte, largebin[32]๋ 3072 ~ 3584 byte)
- Circular doubly linked list์ด๋ฉฐ, best-fit ๋ฐฉ์์ ์ฌ์ฉํ๋ค. (์๋๊ฐ ๋๋ฆฌ์ง๋ง fragmentation์ด ๊ฐ์ฅ ์ ์)
- coalescence๊ฐ ์ผ์ด๋๋ค.
unsortedbin
- ๋ถ๋ฅ๋์ง ์์ chunk๋ค์ ๋ณด๊ดํ๋ bin์ด๋ค. ํ๋๋ง ์กด์ฌํ๋ฉฐ, fastbin์ ๋ค์ด๊ฐ์ง ์๋ ๋ชจ๋ chunk๋ค์ ์ด bin์ ๋ณด๊ด๋๋ค.
- Circular doubly linked list์ด๋ฉฐ, ๋ด๋ถ๋ ์ ๋ ฌ๋์ด ์์ง ์๋ค.
- smallbin ํฌ๊ธฐ์ ํด๋นํ๋ ์ฒญํฌ๋ฅผ ํ ๋น ์์ฒญํ๋ฉด, ptmalloc์ fastbin ๋๋ smallbin์ ํ์ํ ๋ค unsortedbin์ ํ์ํ๋ค.
- largebin ํฌ๊ธฐ์ ํด๋นํ๋ chunk๋ unsortedbin์ ๋จผ์ ํ์ํ๋ค. ์ด ๊ณผ์ ์์ ํ์๋ chunk๋ค์ ๊ฐ์์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ ์ ํ bin์ผ๋ก ์ด๋๋๋ค.
- ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ด๊ธฐ ์ํด ์กด์ฌํ๋ค.
arena
arena๋ fastbin, smallbin, largebin๋ฑ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๋ค.
Multi thread ํ๊ฒฝ์์ race condition์ ๋ง๊ธฐ ์ํด arena์ lock์ ์ ์ฉํ๋๋ฐ (mutex ๊ฐ์), ์ด ๋ฐฉ์์ ์๋๋ฅผ ์ ํ์ํค๋ฏ๋ก ์ต๋ 64๊ฐ์ arena๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์ด ์๋ค. ๊ทธ๋ฌ๋, ์ด๋ณด๋ค ๊ณผ๋ํ multi thread ํ๊ฒฝ์์๋ 64๊ฐ์ arena๋ ๋ถ์กฑํ๋ฏ๋ก ์๋ ์ ํ๊ฐ ์ผ์ด๋๋ค. โ GLibc 2.26์์๋ tcache๋ฅผ ์ถ๊ฐ๋ก ๋์ ํ๋ค.
tcache
- Thread local cache์ ์ฝ์์ด๋ค. ๊ฐ thread์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ๋น๋๋ cache ์ ์ฅ์์ด๋ค.
- ๊ฐ thread๋ 64๊ฐ์ tcache๋ฅผ ๊ฐ๋๋ค. ํ๋์ tcache๋ ๊ฐ์ ํฌ๊ธฐ์ chunk๋ง์ ์ ์ฅํ๋ค. ๊ฐ๊ฐ ์ต๋ 7๊ฐ์ chunk๋ฅผ ๋ฃ์ ์ ์๋ค.
- 32 byte ~ 1040 byte ํฌ๊ธฐ์ chunk๋ค์ด ๋ณด๊ด๋๋ค. ์ด ๋ฒ์์ chunk๋ค์ allocate ๋ฐ free๋ ๋ tcache๋ฅผ ๊ฐ์ฅ ๋จผ์ ์กฐํํ๋ค. chunk๊ฐ ๊ฐ๋ ์ฐผ์ ๋ bin์ ์ฌ์ฉํ๋ค.
- Singly linked list์ด๋ฉฐ, LIFO ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- ๊ฐ thread ๋ณ๋ก ๊ฐ๋ cache์ด๋ฏ๋ก arena์ bin์ ์ฌ์ฉํ ์ผ์ด ์ค์ด๋ ๋ค. โ arena ์ฌ์ฉ์ผ๋ก ์ธํ ์๋ ์ ํ๊ฐ ์ค์ด๋ ๋ค.
Leave a comment