Memory Layout - Stack / Heap
Deep dive into memory layout
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 ๐ฉโ๐ป
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 ์ ์ฝ์ด๋ค.
๋ณ์๋ฅผ ์ ์ธํ๋ ๊ณผ์ ์ ๋ ์ฌ๋ ค๋ณด์.
- ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๋ณ์์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ ๋น๋๋ค.
- ์ ์ฅํ ๊ฐ์ ์ด๊ธฐํ ํ๋ค.
- ๊ทธ ๊ฐ์ ๋ณ์์ ํ ๋นํ๋ค.
ํ์ง๋ง 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
- โIntroduction to RTOS.โ Digi-Key Electrons. accessed Apr. 05, 2023, Digi-Key.
- Yokoyama, Shohei. โUnderstanding Memory Layout.โ Medium. last modified Nov. 10, 2018, Understanding Memory Layout.
- 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?.