1. Why you have to know about the Memory Layout? ๐Ÿ‘ฉโ€๐Ÿ’ป

์‹œ์Šคํ…œ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ถ”์ ํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์•ฑ์„ ๊ฐœ๋ฐœํ•  ๋•Œ C ์™€ ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ ์–ธ์–ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ง์ ‘ ํ•  ํ”ผ์š”๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•œ CS ์ง€์‹์ด ์ „ํ˜€ ์—†๋‹ค๋ฉด ์ž˜๋ชป ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋กœ ์ธํ•ด ์•ฑ์ด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€ ๋ชป ํ•˜๊ณ  Memory Leak ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ž˜๋ชป๋œ ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ์•ฑ์˜ Crash ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฒฐ๊ตญ ๊ฐœ๋ฐœ์ž๋กœ์จ ํ•œ๊ณ„์— ๋ถ€๋”›ํžˆ๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์€ Wroking Memory(RAM)๊ณผ Non-volatile Memory(Flash)์— RTOS(Real-time Operating System)๊ฐ€ ์ถ”๊ฐ€์ ์ธ ๋ณต์žก์„ฑ์„ ๋”ํ•˜๊ฒŒ ๋œ๋‹ค. Embedded ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ SW ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋Š” ์˜์—ญ์€ RAM ์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„, ์ฆ‰ ์ž‘์—… ์˜์—ญ์ด๋‹ค.


2. Working Memory Layout ๐Ÿ‘ฉโ€๐Ÿ’ป

Memory Layout

System ์ „์ฒด๋กœ ๋ณด๋ฉด Memory Layout ์€ 6๊ฐœ์˜ Segments๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์žฅ ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— Kernel Space ๊ฐ€ ํ• ๋‹น๋˜๊ณ , ๊ทธ ์•„๋ž˜ Stack ์ด ํ• ๋‹น๋œ๋‹ค. ์ด๋“ค์€ ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

๋ฐ˜๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ฐ˜๋Œ€ํŽธ, ์ฆ‰, ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ถ€ํ„ฐ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ์žˆ๋‹ค. ์šฐ์„  ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—๋Š” Text ๊ฐ€ ์œ„์น˜ํ•œ๋‹ค. ๊ทธ ์œ„๋กœ๋Š” Data, BSS, Heap ์ด ์ˆœ์„œ๋Œ€๋กœ ํ• ๋‹น๋œ๋‹ค.

์ด ์ค‘ OS ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ Kernel Space ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ 5๊ฐœ Segments(Stack ์„ ํฌํ•จํ•˜๋Š”)๋ฅผ User Space๋ผ ํ•œ๋‹ค.


3.1. Kernel Space ๐Ÿ‘ฉโ€๐Ÿ’ป

Unix-like OS ์—์„œ ์ž…์ถœ๋ ฅ(I/O)๋‚˜ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค์—์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์˜ค์ง System Call์„ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ์˜์—ญ์— ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ด๋ฅผ Kernel Panic์ด๋ผ ํ•˜๋ฉฐ, ํ•˜๋“œ์›จ์–ด, ๋“œ๋ผ์ด๋ฒ„, ์†Œํ”„ํŠธ์›จ์–ด ๋“ฑ ๋‹ค์–‘ํ•œ ์›์ธ์— ์˜ํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Kernel Panic ์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์— ์•…์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ ๋ณด์•ˆ๊ณผ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด OS ๋Š” ์ ๊ทน์ ์ธ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์žฌ๊ณตํ•ด์•ผํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์ง€์†์ ์œผ๋กฑ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•œ๋‹ค.

Terminal ๊ณผ ๊ฐ™์€ Shell์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž๋Š” Kernel ์— ์ง์ ‘์ ์ธ ๋ช…๋ น์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด SSH ๊ฐ€ ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜๊ณ  ์˜คํ”ˆ ๋˜์—ˆ์„ ๋•Œ ๋งค์šฐ ์œ„ํ—˜ํ•œ ์ด์œ ๋‹ค.


3.2 User Spaces ๐Ÿ‘ฉโ€๐Ÿ’ป

์‚ฌ์šฉ์ž์—๊ฒŒ ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ์•ฑ์€ ์ด ์˜์—ญ ์•ˆ์—์„œ ์ž‘๋™ํ•˜๊ฒŒ๋œ๋‹ค. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์—ญ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 5๊ฐœ์˜ Segments ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • Stack
  • Heap
  • BSS(Uninitialized Data Segment)
  • Data(Initialized Data Segment)
  • Text(Code)

1. Stack

LIFO(Last In First Out)๋กœ ์ž‘๋™ํ•˜๋ฉฐ, OS Kernel Space ๋ฐ”๋กœ ์•„๋ž˜ ์œ„์น˜ํ•ด ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.

์•ฑ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” Segment๋กœ ํ•จ์ˆ˜๋Š” Stack Push/Pop ์„ ํ†ตํ•ด ์ž‘๋™ํ•œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์Œ“์ด๊ณ , ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์Œ“์ธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ์ œ๊ฑฐ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ๊ทธ ์•„๋ž˜ ์Œ“์ธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋˜๊ณ  ์™„๋ฃŒ๋˜๋ฉด ์ œ๊ฑฐ๋˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š”๋ฐ ์ด๋Š” Stack ์„ ๋น„์šธ ๋•Œ๊นŒ์ง€ ๊ณ„์†๋œ๋‹ค.

ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ Recursive Functions ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ–‰์œ„๊ฐ€ ๋ชจ๋‘ Stack ์— ํ•จ์ˆ˜๋ฅผ ์Œ“์•„ ์˜ฌ๋ฆฌ๋Š” ํ–‰์œ„์ด๋‹ค.

Stack ์— Push ๋œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ Stack Frame์ด๋ผ ํ•˜๋ฉฐ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ• ๋‹น๋œ๋‹ค

  • Arguments
  • Return Address back to the caller
  • Local Variables


Stack ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค

  • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ Automatic Allocation์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ deallocated ๋œ๋‹ค.
  • Stack ์˜ ํฌ๊ธฐ๋Š” compile-time์— ๊ฒฐ์ •๋˜๋ฉฐ, OS ์— ๋”ฐ๋ผ ์ œํ•œ์ด ์กด์žฌํ•œ๋‹ค.
    (i.e. iOS ์˜ ๊ฒฝ์šฐ ๊ธฐ์ข…๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ 32bit ๋Š” 1MB ์˜ Stack ์„ ๊ฐ€์กŒ๊ณ , 64bit ๋Š” 8Mb ์˜ Stack ์„ ๊ฐ–๋Š”๋‹ค. macOS ์—ญ์‹œ 8MB ๋ฅผ ๊ฐ–๋Š”๋‹ค.)
  • Heap ๊ณผ ๋‹ฌ๋ฆฌ ๋นˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋‹จ์ง€ ํ˜„์žฌ Stack ์˜ Top ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋งŒ ํ•„์š”๋กœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํžˆ Push/Pop ์œผ๋กœ๋งŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์ƒ ์œ„์น˜๋ฅผ ์กฐ์ ˆํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

๋”ฐ๋ผ์„œ Heap ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด Stack ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

2. Heap

FIFO(First In First Out)๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ BSS Segment ์˜ ๋์—์„œ ์‹œ์ž‘ํ•ด ๋” ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.

Heap ์— ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  • compile-time ์— ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ(runtime ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •)
  • scope ๊ฐ€ ์ œํ•œ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ(static, global variables ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ฐธ์กฐ๋˜๋Š” ๋ณ€์ˆ˜)
  • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งค์šฐ ํฐ ๊ฒฝ์šฐ


Heap ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
  • ๊ฐœ๋ฐœ์ž์˜ ๋ช…์‹œ์  ํ• ๋‹น์— ์˜ํ•ด ์ž‘๋™ํ•˜๋ฏ€๋กœ Explicit Allocation์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.
  • ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ runtime๋•Œ Heap ์— ํ• ๋‹น๋˜๋ฏ€๋กœ Dynamic Allocation์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  • Heap ์˜ ํฌ๊ธฐ๋Š” runtime์— ๊ฒฐ์ •๋˜๋ฉฐ, Stack ๊ณผ ๋‹ฌ๋ฆฌ ํฌ๊ธฐ์— ์ œํ•œ์ด ์—†๋‹ค(๋‹จ, Stack Overflow ๋˜๋Š” Heap Overflow ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ฌด์ œํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค).
  • Dynamic Allocation ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋นˆ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ถ”๊ฐ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ƒ ์œ„์น˜ ์—ญ์‹œ ์กฐ์ ˆํ•ด์•ผํ•˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.
  • Heap ์— Allocation ๊ณผ Deallocation ์ด ๋ฐ˜๋ณต๋˜๋ฉฐ GC ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์˜์—ญ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ฅผ in used nodes์™€ unused nodes๊ฐ€ mixed ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์กฐ๊ฐ๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Ÿฐ ์ƒํƒœ๋ฅผ Fragmentation State๋ผ ํ•œ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์‹œ ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ์ธํ•œ Overhead ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚จ๋‹ค.
  • C ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ GC ๊ฐ€ ์กด์žฌํ•˜๋Š” ์–ธ์–ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ GC ๊ฐ€ Heap ์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด Memory Leak ์„ ๋ฐฉ์ง€ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด I/O ์ž‘์—… ํ›„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ์ž์›์ด ๋น ๋ฅด๊ฒŒ ํšŒ์ˆ˜๋˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ์ž‘์„ฑํ•ด Strong Reference Cycles ๊ฐ€ ๋ฐœ์ƒํ•ด GC ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผํ•œ๋‹ค.

3. BSS

Block Started by Symbol ์˜ ์•ฝ์–ด๋‹ค.

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ณผ์ •์„ ๋– ์˜ฌ๋ ค๋ณด์ž.

  1. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ• ๋‹น๋œ๋‹ค.
  2. ์ €์žฅํ•  ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
  3. ๊ทธ ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค.

ํ•˜์ง€๋งŒ BSS ๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ธฐ ์ „ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ณต๊ฐ„๋งŒ ํ• ๋‹นํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Segment ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Kernel ์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 0 ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์ง€๋งŒ Heap ์€ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ๋งŒ ํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ด์ „์— ์ €์žฅ๋˜์—ˆ๋˜ Garbage Data ๊ฐ€ ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ์–ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ž‘๋™์ด ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ฑฐ๋‚˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”์˜ ํ…€์„ ๊ธธ์ง€ ์•Š๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค.

์ฆ‰, BSS ๋Š” ์ผ์‹œ์ ์ธ ์ƒํƒœ๋กœ๋งŒ ์กด์žฌํ•ด์•ผํ•œ๋‹ค.

4. Data

BSS ์ƒํƒœ์—์„œ ์ดˆ๊ธฐํ™” ๋œ ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Segment ๋‹ค.

์ด Segment ๋Š” Read-only Space์™€ Read/Write Space๋กœ ๋‚˜๋‰œ๋‹ค.

5. Text

Read-only Space๋กœ ์•ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” Segment ๋‹ค.

์—ฌ๊ธฐ์— ์ €์žฅ๋˜๋Š” ์ฝ”๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก Compile ๋œ ๊ฐ€์žฅ ๋‚ฎ์€ low-level ์–ธ์–ด์ธ Machine Code ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค.


4. Stack vs. Heap ๐Ÿ‘ฉโ€๐Ÿ’ป

์ธํ„ฐ๋„ท์— ๋Œ์•„๋‹ค๋‹ˆ๋ฉด Value Types ๋Š” Stack, Reference Types ๋Š” Heap ์— ์ €์žฅ๋œ๋‹ค๋Š” ๊ธ€์„ ์ž์ฃผ ๋ณด๊ฒŒ ๋œ๋‹ค. ๋˜๋Š” Value Types ์ธ๋ฐ ์™œ Heap ์— ์ €์žฅ๋˜์—ˆ์ง€? ์•Œ๋‹ค๊ฐ€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค ํ•˜๋Š” ๊ธ€๋„ ๋งŽ๊ณ โ€ฆ

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

  • Compile-time ์— ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š”๊ฐ€? (= Dynamic Allocation ์ด ํ•„์š”ํ•œ๊ฐ€?)
  • Context ๊ฐ€ ์ œํ•œ๋˜๋Š”๊ฐ€? (= Global ํ•˜๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?)
  • Stack ์— ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ์ธ๊ฐ€?


๊ทธ๋ ‡๋‹ค๋ฉด ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด์ž.

Q1 ) Value Types ๋Š” Stack, Reference Types ๋Š” Heap ์— ์ €์žฅ๋œ๋‹ค?

๐Ÿ‘‰๐Ÿป๊ธฐ๋ณธ์ ์œผ๋กœ Value Types ๋Š” Stack, Reference Types ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค. ํ•˜์ง€๋งŒ Value Types ๋ผ ํ•˜๋”๋ผ๋„ Compile-time ์— ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ „์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์ด Context ๊ฐ€ ์ œํ•œ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋˜๋Š” Stack ์— ๋‹ด๊ธฐ ๋„ˆ๋ฌด ํฐ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ๋Š” Heap ์— ์ €์žฅ๋œ๋‹ค.

Q2 ) Collection ์€ ํ•ญ์ƒ Heap ์— ์ €์žฅ๋œ๋‹ค?

๐Ÿ‘‰๐Ÿป์ผ๋ฐ˜์ ์œผ๋กœ Collection ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ์šฐ Compile-time ์— ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†์–ด Runtime ์— Dynamic Allocation ์„ ํ•ด์•ผํ•˜๋งŒ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Heap ์— ์ €์žฅ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ๋ผ๋ฉด Stack ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Q3 ) Structures ๋Š” Value Types ์ธ๋ฐ ์—ฌ๊ธฐ์— Reference Types ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

๐Ÿ‘‰๐ŸปSwift ๋Š” First-Class Citizens ์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๋กœ Functions, Closures ๋ฅผ ํฌํ•จํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๋ณ€์ˆ˜/์ƒ์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋–ค Classes ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ Functions, Closures ๋ชจ๋‘ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค์€ Reference Types ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Swift ์—์„œ Structures ๊ฐ€ Value Types ์ด๋”๋ผ๋„ ๊ทธ ๋‚ด๋ถ€์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์—ญ์‹œ Value Types ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
Array ์™€ ๊ฐ™์€ Collection, String Types ๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค. Swift ์—์„œ String Types ๋Š” Structures ๋กœ ์ •์˜๋˜์–ด์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๋‚ด๋ถ€์— Characters ๋ฅผ Collection ์œผ๋กœ ์ €์žฅํ•œ๋‹ค. ๋”ฐ๋ผ์„œ String Types ์ž์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Stack ์— ์ €์žฅ๋˜์ง€๋งŒ, ๊ทธ ์•ˆ์˜ Characters ๋Š” Heap ์— ์ €์žฅ๋˜๊ณ , String Types ๋Š” ์ด Characters ์˜ Pointer ๋ฅผ ์ €์žฅํ•œ๋‹ค.

Q4 ) Structures ๋ฅผ Value Types ๋กœ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์•ˆ์— Heap ์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด Value Types ๋ผ๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”๊ฐ€?

๐Ÿ‘‰๐Ÿป๋ฌผ๋ก  Structures ๋‚ด๋ถ€์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ Value Types ์ผ ๊ฒฝ์šฐ์—๋งŒ ARC ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ Types ์ž์ฒด๊ฐ€ Value Types ์ธ ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋น„๋ก ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” Reference Types ๋กœ ์ธํ•ด ARC ๊ฐ€ ํ•„์š”ํ•˜๊ณ  Allocation, Deallocation ์— ๋น„์šฉ์ด ์ˆ˜๋ฐ˜๋จ์€ ๋ฌผ๋ก , Heap ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์„œ ์˜ค๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†์Œ์—๋„ Structures ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ์ด์ ์„ ๊ฐ€์ ธ๋‹ค์ค€๋‹ค.

Apple ์€ Swift ๋Œ€๋ถ€๋ถ„์˜ Types ๋ฅผ Structures ๋ฅผ ์ด์šฉํ•ด Value Types ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ WWDC ์—์„œ๋„ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ๋ณด์—ฌ์คŒ๊ณผ ํ•จ๊ป˜ Structures ๋ฅผ ์„ ํ˜ธํ•˜๋ผ๊ณ  ํ–ˆ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ Apple ์˜ ์ฒ ํ•™์ด ๋‹ด๊ฒจ์žˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ ์ด์ ์ด ์žˆ์Œ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‚ด๋ถ€์— ARC ๊ฐ€ ์ž‘๋™ํ•˜๋”๋ผ๋„ Structures ๋ฅผ Value Types ๋กœ ์ •์˜ํ•˜๊ณ  ์„ ํ˜ธํ•˜๋ผ๋Š” ์˜๋ฏธ๋Š” ์–ธ์ œ๋‚˜ ๋ณต์‚ฌ๊ฐ€ ๋˜๋„๋ก ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋”ฐ๋ผ์„œ Swift Compiler ์— ์˜ํ•ด Class ๋กœ ์„ ์–ธํ•  ๋•Œ๋ณด๋‹ค ๋” ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๋ณด์žฅํ•  ๋ฟ ์•„๋‹ˆ๋ผ Arguments ๋กœ ์ „๋‹ฌ๋  ๋•Œ Copy๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. Structures ๋Š” ๋” ์•ˆ์ •์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‹ค๋ฃจ๊ธฐ๊ฐ€ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ด Swift ์—์„œ Structures ๊ฐ€ ๊ฐ–๋Š” ์ตœ๊ณ ์˜ ์žฅ์ ์ด๋‹ค.


Stack ๊ณผ Heap ์„ ํ‘œ๋กœ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ย  Stack Heap
Speed Fast Slow
Empty Memory Tracing List X O
Fragmentation State X O
Size Decision Compile-time Runtime
Size Restriction 1 ~ 8 MB (Difference by OS and Devices) Non-limitation
Input/Output Model LIFO FIFO
Allocation Automatic Explicit/Dynamic
Deallocation Immediately after function exit Manual or GC or ARC

5. Stack/Heap Overflow ๐Ÿ‘ฉโ€๐Ÿ’ป

1. Stack Overflow

์ผ๋ฐ˜์ ์œผ๋กœ Recursive Functions ๊ฐ€ ๋„ˆ๋ฌด ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ Local Variables ์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฐ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Stack ์€ Heap ๊ณผ ๋‹ฌ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— Overflow ๊ฐ€ ๋ฐœ์ƒ๋˜๊ธฐ ์‰ฝ๋‹ค. ์‹ค์ˆ˜๋กœ ํ•จ์ˆ˜๊ฐ€ ์ˆœํ™˜ํ•˜๋Š” ์ผ์ด ์—†๋„๋ก ํ•ด์•ผํ•˜๋ฉฐ, Tail Recursive Functions ๋ฅผ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์˜ ๊ฒฝ์šฐ Optimization ์„ ์ผœ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Loops ๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•œ๋‹ค.

2. Heap Overflow

์ตœ๊ทผ์—๋Š” ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ปค์กŒ์„ ๋ฟ ์•„๋‹ˆ๋ผ ๋Œ€๋ถ€๋ถ„ GC ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Heap Overflow ๋Š” Stack Overflow ์™€ ๋‹ฌ๋ฆฌ ์‰ฝ๊ฒŒ ์ผ์–ด๋‚˜์ง€๋Š” ์•Š๋Š”๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ Heap ์— ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋ณด๋‹ค ๋” ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค ํ•˜๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋Š” Initializers ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ ๊ฒƒ๋ณด๋‹ค ๋„ˆ๋ฌด ํฌ๊ฑฐ๋‚˜ Array ์˜ Index ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค. ํŠนํžˆ Array ์˜ Index ์ ‘๊ทผ์— ์˜ํ•œ ๋ฌธ์ œ๋Š” ๋ฐ˜๋“œ์‹œ Error Handling ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

3. Security Vulnerability

Stack Overflow ์™€ Heap Overflow ๋Š” ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ ์ทจ์•ฝ์ ์œผ๋กœ ํ•ด์ปค์˜ ๊ณต๊ฒฉ ํƒ€๊ฒŸ์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ๋ฐฉ์–ด์ฑ…์„ ๋งˆ๋ จํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ๋ฐ, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํ•ด์ œ์— ๋Œ€ํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผํ•œ๋‹ค. ํŠนํžˆ Strong Reference Cycles ๋Š” ์ ˆ๋Œ€ ์ผ์–ด๋‚˜์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, Error Handling ์„ ๋ฐ˜๋“œ์‹œ ํ•˜๊ณ , ์•ˆ์ „ํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.




Reference

  1. โ€œIntroduction to RTOS.โ€ Digi-Key Electrons. accessed Apr. 05, 2023, Digi-Key.
  2. Yokoyama, Shohei. โ€œUnderstanding Memory Layout.โ€ Medium. last modified Nov. 10, 2018, Understanding Memory Layout.
  3. Teixeira, Nickolas. โ€œStack vs Heap. Whatโ€™s the Difference and Why Should I Care?.โ€ Linux.com last modified Jun. 28, 2018, Stack vs Heap. Whatโ€™s the Difference and Why Should I Care?.