๐ŸŽ๏ธ[C] malloc-lab

์ด๊ฐ•์šฑยท2022๋…„ 10์›” 31์ผ
3

๐ŸŽ๏ธ C

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

malloc

์ด๋ฒˆ ๊ณผ์ œ๋Š” malloc์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ.
์ข€ ๋” ๋ช…ํ™•ํžˆ๋Š” malloc, free, realloc์„ ํฌํ•จํ•˜๋Š” ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ.

์ฒ˜์Œ์—” ์ฑ…์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ํƒ€์ดํ•‘ ํ•ด๋ณด๋ฉด์„œ ์ดํ•ดํ–ˆ์œผ๋‚˜, ๊ณ„์† ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒŒ ์ง€๊ธˆ ๋ญ˜ ํ•˜๊ณ  ์žˆ๋Š”๊ฑฐ์ง€?

์ƒ๊ฐํ•ด๋ณด๋‹ˆ malloc์ด ์•ˆ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ง€๋„ ๋ชจ๋ฅด๊ณ  malloc์„ ๋”ฐ๋ผ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ.

๊ทธ๋ ‡๋‹ด malloc์ด ๋ฌด์–ด๋ƒ. memory allocation.

C dynamic memory allocation refers to performing manual memory management for dynamic memory allocation in the C programming language via a group of functions in the C standard library, namely malloc, realloc, calloc and free.
- ์ถœ์ฒ˜ : https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

malloc์„ ํฌํ•จํ•ด realloc, calloc, free๋Š” C์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์  ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์˜ ๋ชจ์Œ์ธ ๊ฒƒ.

๊ตฌ์ฒด์ ์ธ malloc์˜ ๋‚ด๋ถ€ ๋กœ์ง.

๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ, malloc์ด heap ์˜์—ญ์„ ์žก๊ณ  ์œ ์ง€ํ•œ๋‹ค๋Š” ์ฐจ์›์—์„œ ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•ด pool์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ์„ ์•Œ๋ฆฐ๋‹ค. ๊ฒฐ๊ตญ ๊ฐ™์€ ๋ง์ด๋‹ค.

  1. malloc์€ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ํ• ๋‹น์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” ์ž์‹ ์ด ๊ฐ€์ง„ pool(i.e. heap segment)์—์„œ ํ• ๋‹นํ•ด์ฃผ๊ณ , ํฌ๊ธฐ๊ฐ€ ํฐ ํ• ๋‹น์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” pool์ด ์•„๋‹Œ memory mapping segment์—์„œ ํ• ๋‹นํ•ด์ค€๋‹ค.

  2. malloc ๋‚ด์—์„œ๋Š” ๋‘๊ฐ€์ง€ syscall์ด ํ™œ์šฉ๋˜๋Š”๋ฐ, mmap๊ณผ sbrk๊ฐ€ ๊ทธ๊ฒƒ์ด๋‹ค.

  • sbrk๋Š” malloc์ด ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”(์ข€ ๋” ์ •ํ™•ํžˆ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰๋œ ํ•จ์ˆ˜๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ช…์‹œ์  ํ• ๋‹น๊ธฐ์—์„œ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”) pool์•ˆ์—์„œ ํ˜„์žฌ ํ• ๋‹น์š”์ฒญ์— ๋Œ€ํ•œ ํ• ๋‹น์„ ํ•ด์ค„ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ์™”์„ ๋•Œ, pool์˜ size๋ฅผ ๋Š˜๋ฆฌ๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    sbrk์— ์›ํ•˜๋Š” incr๋ฅผ ์ „๋‹ฌํ•ด ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ heap segment์˜ ๋ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” program brk๊ฐ€ incr๋งŒํผ ์ฆ๊ฐ€ํ•˜๊ณ , ์ด๋Š” ๊ณง heap segment์˜ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ๋˜ ์ด๋Š” ๊ณง malloc์ด ์œ ์ง€ํ•˜๋Š” pool์˜ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

  • mmap์€ ํฌํ‚ค๊ฐ€ ํฐ ํ• ๋‹น์š”์ฒญ์— ๋Œ€ํ•ด memory mapping segment์˜ ์˜์—ญ์„ ํ• ๋‹นํ•ด ์ค„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์›๋ž˜ mmap์€ '๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘'์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ.

    ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘์ด๋ž€, ์–ด๋–ค ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋””์Šคํฌ์˜ ํŒŒ์ผ ๋‚ด์šฉ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œํ˜ธ์ถœ.

    ๋‹จ, ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š” ๊ทธ์ € ํ• ๋‹น ์š”์ฒญ ํฌ๊ธฐ์— ๋งž๋Š” ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์–ป์œผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ํŠน์ • ํŒŒ์ผ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€ ์žˆ์ง€ ์•Š์€, ์ด ํ”„๋กœ์„ธ์Šค๋งŒ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜์—ญ์„ ๋ฐ›์œผ๋ฉด ๋˜๊ฒ ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, mmap์„ manual๋กœ ํ˜ธ์ถœํ•  ๋•Œ MAP_ANONYMOUS flag ์™€, MAP_PRIVATE flag๋ฅผ ์ฃผ๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ๋‚ด๋ถ€๊ฐ€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ, ์ด ํ”„๋กœ์„ธ์Šค๋งŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ์— ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฆฌ๋ผ ์ถ”์ธก๋œ๋‹ค.

๊ทธ๋ ‡๋‹ด ์™œ ํฌ๊ธฐ๊ฐ€ ํฐ ํ• ๋‹น ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” heap์˜ ์˜์—ญ์ด ์•„๋‹Œ memory mapping segment์˜ ์˜์—ญ์„ ํ• ๋‹นํ•ด์ค„๊นŒ?
๋จผ์ €, free๋ฅผ ํ†ตํ•ด์„œ๋Š” ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ๋ฐ˜ํ™˜์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋“ฏ malloc์€ ์ž์ฒด์ ์ธ pool์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํ• ๋‹น๊ณผ ๋ฐ˜ํ™˜์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋‹จ pool์˜ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง€๋ฉด ๊ทธ ํฌ๊ธฐ ๋งŒํผ์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ ์œ ํ•˜๋Š” ๊ณต๊ฐ„์ด ๋  ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ, ํฌ๊ธฐ๊ฐ€ ์ œ๋ฒ• ํฐ ์˜์—ญ์„ pool์•ˆ์— ํ• ๋‹นํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด, ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํŠน์„ฑ์ƒ ๊ทธ ์˜์—ญ์„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ญ๋น„๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž, ํŠน์ • threshold๋ฅผ (glibc์˜ malloc ๊ธฐ์ค€ 128KB) ๋„˜๋Š” ํ• ๋‹น ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” mmap์„ ํ†ตํ•ด pool(heap segment) ๋ฐ”๊นฅ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์ฃผ๊ณ , free๋ฅผ ์š”์ฒญ์‹œ munmap์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์— ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์–ด์จŒ๋“  ์ด ๋ชจ๋“  ์ดํ•ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผํ•  ๊ณผ์ œ๋Š”,

๋‚˜๋งŒ์˜ ๋ช…์‹œ์  ํ• ๋‹น๊ธฐ(malloc, free, realloc ์„ ํฌํ•จํ•˜๋Š”)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ํ• ๋‹น๊ธฐ๊ฐ€ ๊ฐ–๊ณ ์žˆ๋Š” pool์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋˜๊ฒ ๋‹ค.

ํ• ๋‹น๊ธฐ๊ฐ€ ํ•ด์•ผํ•˜๋Š” ์ฃผ๋œ ์—…๋ฌด๋Š” ์š”์ฒญ ์‚ฌ์ด์ฆˆ์— ํ•ด๋‹นํ•˜๋Š” ๋ธ”๋ก์„ ์ฐพ์•„์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•ด๋‹น ๋ธ”๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ทธ ๊ณต๊ฐ„์„ ๋‹ค์‹œ ์žฌํ™œ์šฉ ํ•˜๋Š” ๊ฒƒ.

๋ธ”๋ก์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•ด์„œ ์‹œ๊ฐ„์„ ๋น ๋ฅด๊ฒŒ ํ•˜๋ฉด,
์ฒ˜๋ฆฌ๋Ÿ‰(throughput)์€ ๋Š˜์ง€๋งŒ, ๊ณต๊ฐ„ ํ™œ์šฉ๋„(space utilization)๋Š” ์ค„์–ด๋“ ๋‹ค.
๋ฐ˜๋Œ€๋กœ ๋ธ”๋ก์„ ์ •๊ตํ•˜๊ฒŒ ์ฐพ์•„์„œ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์ž˜ ์“ฐ๋ฉด,
๊ณต๊ฐ„ ํ™œ์šฉ๋„(space utilization)๋Š” ๋Š˜์–ด๋‚˜์ง€๋งŒ, ์ฒ˜๋ฆฌ๋Ÿ‰(throughput)์ด ์ค„์–ด๋“ค ๊ฒƒ์ด๋‹ค.

๊ตฌํ˜„ ์ด์Šˆ

pool์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ ํ•จ์€,

  1. ์ ํ•ฉํ•œ free block list์˜ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•ด ์‚ฌ์šฉํ•˜๊ณ ,
  2. ๊ทธ list์—์„œ free block์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•(์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ์ž˜ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

free block list์˜ ๊ตฌ์กฐ

์–ด๋–ป๊ฒŒ free block๋“ค์„ ์ง€์†์ ์œผ๋กœ ์ถ”์ ํ•˜๋Š”๊ฐ€?

free block list์—๋Š” implicit, explicit, segment list, buddy system์ด ์žˆ๋‹ค.

  • implicit list : ๊ฐ ๋ธ”๋ก์˜ ํ—ค๋”(์™€ ํ‘ธํ„ฐ)์— ๊ทธ ๋ธ”๋ก์˜ ํ• ๋‹น์—ฌ๋ถ€๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์„ ๋ฟ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์šฉ ๋ธ”๋ก๋“ค์„ ํ•˜๋‚˜์”ฉ ๋ณด๋ ค๋ฉด, ๋ฌด์กฐ๊ฑด ๋งจ ์ฒ˜์Œ ๋ธ”๋ก๋ถ€ํ„ฐ ํ๋‹นํ๋‹น ํ•˜๋‚˜์”ฉ ๋ณด๋ฉด์„œ ๊ทธ ๋ธ”๋ก์ด free์ธ์ง€ allocated์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
    ์ด ๊ด€์ ์—์„œ ๋ณด๋ฉด 'free block list'๋ผ๋Š”๊ฑด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค(ํ‘œ๋ฉด์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค). ๋‹จ์ง€ ํž™ ์•ˆ์— '๋ฌต์‹œ์ ์œผ๋กœ' ์ˆจ์–ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ free ๋ธ”๋ก์„ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— implicit list๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • explicit list : implicit๊ณผ ๋‹ค๋ฅด๊ฒŒ, free block ๋“ค์ด ์„œ๋กœ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋จ์œผ๋กœ์จ free block list๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋ช…์‹œ์ ์œผ๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กญ๊ฒŒ ๋ฐœ์ƒ๋œ free block์„ list์— ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‚ฝ์ž…ํ•  ์ง€ ๋ฐฉ๋ฒ•์ด ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค : LIFO(ํ›„์ž…์„ ์ถœ) ๋˜๋Š” free block์˜ address order. ์ „์ž๋Š” ๋ฐ˜ํ™˜์ด ๋น ๋ฅด๊ณ  ํ›„์ž์˜ ๋ฐ˜ํ™˜์€ ๋งž๋Š” ์œ„์น˜(์ฃผ์†Œ์ˆœ์œผ๋กœ)๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๋’ค์—์„œ ์„ค๋ช…๋  first-fit์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, LIFO๋ณด๋‹ค๋Š” address order์˜ first-fit์ด best-fit์— ๊ทผ์ ‘ํ•˜๋Š” ์ข‹์€ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ๋„๋ฅผ ๊ฐ€์ง. (best-fit์ด ๊ฐ€์žฅ ์ข‹์„ํ…Œ์ง€๋งŒ, ํ˜„์‹ค์ ์œผ๋กœ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆผ. ๋”ฐ๋ผ์„œ first-fit์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ list์˜ ๊ตฌ์„ฑ์„ ํ†ตํ•ด best-fit์— ๊ทผ์ ‘ํ•ด์ง€๋ ค๋Š” ์‹œ๋„๊ฐ€ ๋งŽ์Œ)

  • Segregated Lists (Segregated Fit) : ๋‹ค์ˆ˜์˜ free block list๋ฅผ ํฌ๊ธฐ ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆ„์–ด ์œ ์ง€ํ•˜๋Š”๋ฐ, ๊ฐ list์˜ blcok ํฌ๊ธฐ๋Š” ๊ทธ list์— ํ•ด๋‹นํ•˜๋Š” ํฌ๊ธฐ ๋ฒ”์œ„ ์•ˆ์— ์†ํ•œ๋‹ค. ๋ถ„ํ• ์ด๋‚˜ ์—ฐ๊ฒฐ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๋‹จ์ง€ free block์„ ํฌ๊ธฐ๋ณ„๋กœ ๋ชจ์•„๋‘ ์œผ๋กœ์จ ๊ด€๋ฆฌ์™€ ํƒ์ƒ‰์„ ์šฉ์ดํ•˜๊ฒŒ ํ•จ.
    ๋น ๋ฅด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ธ ๋ฐฉ์‹. ์–ด๋– ํ•œ ์š”์ฒญ ํฌ๊ธฐ์— ๋Œ€ํ•ด ์ „์ฒด ํž™์ด ์•„๋‹Œ ํ•ด๋‹น ํฌ๊ธฐ์˜ ํด๋ž˜์Šค ์•ˆ(ํž™์˜ ํŠน์ • ๋ถ€๋ถ„)์—์„œ๋งŒ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๊ฒ€์ƒ‰์‹œ๊ฐ„.
    ๋˜ํ•œ 'ํ•ด๋‹น ํด๋ž˜์Šค'๋ผ๋Š” ๋ง์€ ์ตœ๋Œ€ํ•œ ์š”์ฒญ ํฌ๊ธฐ์™€ ๋น„์Šทํ•œ ํฌ๊ธฐ์˜ ๋ธ”๋ก๋“ค ์ค‘์—์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ๋„๋„ ๋‚˜์˜์ง€ ์•Š์Œ.

  • buddy system : segregated fit ๋ฐฉ๋ฒ•์˜ ํŠน๋ณ„ ์ผ€์ด์Šค. ๊ฐ ํฌ๊ธฐ ํฌ๋ž˜์Šค์˜ ํฌ๊ธฐ๊ฐ€ 2์˜ ์ œ๊ณฑ์ˆ˜์ด๋‹ค. ๋งŒ์•ฝ ์ „์ฒด heap size๊ฐ€ 2m2^m ์ด๋ผ๋ฉด, ํฌ๊ธฐ ํด๋ž˜์Šค๋“ค์˜ ํฌ๊ธฐ๋Š” 2k2^k,where 0โ‰คkโ‰ค2m0 \leq k \leq 2^m
    ์ด๋‹ค. ๋งจ ์ฒ˜์Œ์—๋Š” 2m2^mํฌ๊ธฐ์˜ ๋ธ”๋ก ํ•˜๋‚˜๊ฐ€ ์žˆ๊ณ , ์š”์ฒญ์— ๋”ฐ๋ผ ํ•ด๋‹น ๋ธ”๋ก์„ ๋ฐ˜์œผ๋กœ ๊ณ„์† ์ชผ๊ฐœ๋ฉด์„œ ๋‚˜๋ˆ„๊ฒŒ๋œ๋‹ค. fitํ•œ size์˜ ๋ธ”๋ก์ด ์ƒ์„ฑ๋˜๋ฉด ๊ทธ ๋ธ”๋ก์„ ํ• ๋‹นํ•˜๊ณ , ๊ณผ์ • ์ค‘์— ์ชผ๊ฐœ์ง„ ๋ธ”๋ก(buddy: ์–ด๋–ค ๋ธ”๋ก๊ณผ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ์ง๊ฟ ๋ธ”๋ก)๋“ค์€ ๋‹ค์‹œ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ๋ธ”๋ก์„ freeํ•  ๋•Œ๋Š” buddy๊ฐ€ free์ƒํƒœ์ด๋ฉด ์—ฐ๊ฒฐํ•˜๊ณ , allocated buddy๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ํฌ๊ธฐ๋ฅผ ํ‚ค์›Œ๊ฐ€๋ฉฐ ์ด๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
    (Memory Partitioning 3: Buddy System).

free block ์„ ํƒ ๋ฐฉ๋ฒ•

ํ• ๋‹น ์š”์ฒญ์— ์ ํ•ฉํ•œ free block์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€?

  • first fit : free block list๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•ด์„œ ํฌ๊ธฐ๊ฐ€ ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ free block์„ ์„ ํƒ
  • next fit : first fit๊ณผ ์œ ์‚ฌํ•˜๋‚˜, ๊ฒ€์ƒ‰ ์‹œ์ž‘ ์ง€์ ์ด ์ด์ „ ๊ฒ€์ƒ‰์ด ์ข…๋ฃŒ๋œ ์ง€์ .
  • best fit : free block list์— ์žˆ๋Š” ๋ชจ๋“  free block์„ ๊ฒ€์‚ฌํ•ด ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ๋”ฑ ๋งž๋Š” free block์„ ์„ ํƒ

๋ถ„ํ•  (splitting)

free block์—์„œ ์š”์ฒญ๋œ size๋งŒํผ์„ ๋บ€ ๋‚˜๋จธ์ง€์˜ ๋ธ”๋ก ์˜์—ญ์„ ๋‹ค์‹œ free block์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€?

  • ์ƒ๊ด€ ์—†์ด ๊ทธ๋ƒฅ ์„ ํƒ๋œ free block ์ „์ฒด๋ฅผ ์‚ฌ์šฉ.
  • (๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด) ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด free blcok์œผ๋กœ ์žฌ์ƒ. -> ๊ณผ์ œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์—ฐ๊ฒฐ (coalescing)

๋ฐฉ๊ธˆ ๋ฐ˜ํ™˜๋œ free block์„ ์ธ์ ‘ํ•œ free block๋“ค๊ณผ ํ•ฉ์ณ ํ•˜๋‚˜์˜ ๋” ํฐ free blcok์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€?

  • ์ฆ‰์‹œ ์—ฐ๊ฒฐ : free block์ด ๋ฐ˜ํ™˜๋  ๋•Œ ๋งˆ๋‹ค ์ฆ‰์‹œ ์—ฐ๊ฒฐ. ์“ฐ๋ž˜์‹ฑ(์—ฐ๊ฒฐ ํ›„ ์ž ์‹œ ๋’ค ๋ฐ”๋กœ ๋ถ„ํ• ๋จ) ๋ฐœ์ƒ ๊ฐ€๋Šฅ. -> ๊ณผ์ œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ง€์—ฐ ์—ฐ๊ฒฐ : ์ผ์ • ์‹œ๊ฐ„ ํ›„์— ์—ฐ๊ฒฐ. e.g. ์–ด๋–ค ํ• ๋‹น ์š”์ฒญ์ด ์‹คํŒจํ•  ๋•Œ๊นŒ์ง€ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๊ฐ€, ์‹คํŒจํ•˜๋Š” ์š”์ฒญ์ด ์ƒ๊ธฐ๋ฉด ๊ทธ ๋•Œ ์ „์ฒด ํž™์„ ๊ฒ€์ƒ‰ํ•ด ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰.

์‚ฌ์‹ค ์ด๋Ÿฐ ๋ชจ๋“  ๋…ธ๋ ฅ๋“ค์„ ํ•ด์•ผํ•˜๋Š” ์ด์œ ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ช…์‹œ์ ์œผ๋กœ free๋ฅผ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ (๋ช…์‹œ์  ํ• ๋‹น๊ธฐ). ๊ฐ ์š”์ฒญ์— ์ ํ•ฉํ•œ ๋นˆ ๊ณต๊ฐ„์„ ํƒ์ƒ‰ํ•˜๊ณ  ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •๊ณผ ๊ทธ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ณต์žกํ•œ ๊ฒƒ.
free๋ฅผ ๋ฌต์‹œ์ ์œผ๋กœ ํ•˜๊ธฐ๋กœ ์•ฝ์† ํ•œ๋‹ค๋ฉด, ์ฆ‰ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฌด์กฐ๊ฑด ํ• ๋‹น๋งŒ ๋ฐ›๊ณ , ํ• ๋‹น ๋ฐ›์€ ๊ณต๊ฐ„ ์ค‘ ๋”์ด์ƒ ์“ฐ์ด์ง€ ์•Š์„ ๊ณต๊ฐ„๋“ค์„ ํ• ๋‹น๊ธฐ ์ธก์—์„œ ํŒ๋‹จํ•ด ์ž„์˜๋กœ freeํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ณต๊ฐ„ ๊ด€๋ฆฌ๊ฐ€ ๋งค์šฐ ์œ ์šฉํ•ด์งˆ ๊ฒƒ. ๋‹จ ์ด ๊ฒฝ์šฐ์—๋Š” ํ• ๋‹นํ•ด์ค€ ๊ณต๊ฐ„ ์ค‘ ๋” ์ด์ƒ ์“ฐ์ด์ง€ ์•Š์„ ํ• ๋‹น ๊ณต๊ฐ„์„ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€๊ณผ ๊ทธ ๊ตฌํ˜„์ด ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

๋ฐฐ๊ฒฝ์ง€์‹

๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ

ํ”„๋กœ์„ธ์Šค๋“ค์€ ์„œ๋กœ cpu์™€ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค๊ณผ ๊ณต์œ ํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์ด๊ณ  ๋” ์ ์€ ์—๋Ÿฌ๋ฅผ ๊ฐ–๋„๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ(Virtual Memory)๋ผ๋Š” ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ถ”์ƒํ™”๋ฅผ ์ด์šฉํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋Š” ์ž์‹ ์ด ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์˜ ์„ธ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

  1. ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋””์Šคํฌ์— ๋Œ€ํ•œ ์บ์‹œ๋กœ ์ทจ๊ธ‰ํ•ด, ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ํ™œ์„ฑํ™” ์˜์—ญ๋งŒ ์œ ์ง€ํ•˜๋ฉด์„œ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋””์Šคํฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•œ๋‹ค.

  2. ๊ฐ ํ”„๋กœ์„ธ์Šค์— ํ†ต์ผ๋œ ์ฃผ์†Œ๊ณต๊ฐ„์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•œ๋‹ค.

  3. ๊ฐ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ๊ณต๊ฐ„์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•œ ์†์ƒ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ

ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๋Š”(์ž๊ธฐ ์ž์‹ ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค์ง€๋Š” ๊ฒƒ ํฌํ•จ) ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ ์šฉ๋„์— ๋งž๊ฒŒ ์„ธ๊ทธ๋จผํŠธ(์˜์—ญ)์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ตฌ์กฐํ™” ํ•œ ๊ฒƒ.

  1. code segment (text segment)
    ์‹คํ–‰๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด(executable code)๊ฐ€ ์ €์žฅ๋œ๋‹ค. ๋ณดํ†ต read-only์ด๊ณ , ์‚ฌ์ด์ฆˆ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋‹ค.

  2. data segment (initialized)
    ์ดˆ๊ธฐํ™”๋œ static ๋ณ€์ˆ˜๋“ค(e.g. global variables, local static variables)์„ ํฌํ•จํ•œ๋‹ค.

  3. BSS segment (Block Started by Symbol)
    ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ static ๋ณ€์ˆ˜๋“ค์„ ํฌํ•จํ•œ๋‹ค.
    ์ด ์„ธ๊ทธ๋จผํŠธ์˜ ๋ฐ์ดํ„ฐ๋“ค์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰๊ณผ ํ•จ๊ป˜ ์ปค๋„์— ์˜ํ•ด 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

  4. Stack
    ์Šคํƒ ์˜์—ญ์€ LIFO ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ ์Šคํƒ์„ ํฌํ•จํ•œ๋‹ค.
    ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ์ˆ˜ํ–‰ ์ดํ›„์— ๋ฆฌํ„ดํ•  ์ฃผ์†Œ์™€ ๋ ˆ์ง€์Šคํ„ฐ ์ƒํƒœ ๊ฐ’ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค.

  5. Heap
    ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ˆ˜ํ–‰๋˜๋Š” ์„ธ๊ทธ๋จผํŠธ ๊ณต๊ฐ„.

์‹œ์Šคํ…œ ์ฝœ (์‹œ์Šคํ…œ ํ˜ธ์ถœ)

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•ด์„œ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ์„œ๋น„์Šค(e.g. I/O)๋ฅผ ์š”์ฒญํ•จ.
์ปค๋„์ด ์ž์‹ ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ์ดํ•ดํ•  ์ˆ˜๋„ ์žˆ์Œ.

๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”

  1. ๋‚ด๋ถ€ ๋‹จํŽธํ™”
    ๋ฐ์ดํ„ฐ ์ž์ฒด ํฌ๊ธฐ๋ณด๋‹ค ํ• ๋‹น๋œ ๋ธ”๋ก์˜ ํฌ๊ธฐ๊ฐ€ ํด ๋•Œ ๋ฐœ์ƒ.
  2. ์™ธ๋ถ€ ๋‹จํŽธํ™”
    ์ „์ฒด์ ์œผ๋กœ ๋นˆ ๊ณต๊ฐ„์„ ๋ชจ์•˜์„ ๋•Œ๋Š” ํ• ๋‹น ์š”์ฒญ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์žˆ์ง€๋งŒ, ๊ฐ๊ฐ์˜ ๋‹จ์ผํ•œ ๊ฐ€์šฉ๋ธ”๋ก์€ ์š”์ฒญ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ.

์ฐธ๊ณ ์‚ฌ์ดํŠธ

profile
I think I think too much.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 12์›” 12์ผ

LGTM

1๊ฐœ์˜ ๋‹ต๊ธ€