TIL: ptmalloc2 ๐Ÿ—ƒ๏ธ

https://dreamhack.io/lecture/courses/98

ptmalloc2

ptmalloc2๋Š” Linux์˜ Memory Allocator์ด๋‹ค. ptmalloc2๋Š” memory๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค:

  1. Memory ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด memory allocation ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์šฐ์„  free๋œ block ์ค‘์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” block์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  2. tcache์™€ bin์ด๋ผ๋Š” linked list์— free๋œ block๋“ค์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  3. 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 ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ์†๋„ ์ €ํ•˜๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

Categories: ,

Updated:

Leave a comment