์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- widget
- System call
- scaffold
- algorithm
- stack growth
- flutter
- pintos
- vm
- Copy-on-write
- icon button
- create
- file
- materialapp
- Cow
- Flutter
- BFS
- Today
- Total
JunHyeok
[CS] Copy-On-Write ๋ณธ๋ฌธ
๐ฆ Copy-On-Write (COW)
1. ์ด์ ์ฒด์ ์์์ Copy-On-Write
์ด์ ์ฒด์ ์์ fork
์์คํ
์ฝ์ ์ฌ์ฉํ ๋, ์์ ํ๋ก์ธ์ค๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํฉ๋๋ค. ์ด๋ Copy-On-Write (COW) ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ํจ์จ์ฑ์ ํฌ๊ฒ ๋์ผ ์ ์์ต๋๋ค. COW์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ด๊ธฐ ๋ณต์ฌ ์ง์ฐ
fork
ํธ์ถ ์ ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๋ ๋์ผํ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ์๊ณ , ๋ถ๋ชจ์ ์์์ด ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ์ฝ์ต๋๋ค.
์ด ํ์ด์ง๋ค์read-only
๋ก ์ค์ ๋ฉ๋๋ค.
- ์ค์ ์ฐ๊ธฐ ์์ ์์์ ๋ณต์ฌ:
๋ถ๋ชจ ๋๋ ์์ ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง์write
์์ ์ ์๋ํ๋ฉด ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด์ ์ฒด์ ๋ ์ด ์์ ์์ ํด๋น ํ์ด์ง๋ฅผ ๋ณต์ฌํ๊ณ , ์ฐ๊ธฐ ๊ฐ๋ฅํ ํ์ด์ง๋ฅผ ์๋ก ํ ๋นํฉ๋๋ค.
์ดํ, ๋ ํ๋ก์ธ์ค๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
- ํจ์จ์ฑ:
๋ฉ๋ชจ๋ฆฌ์ CPU ์์์ ์ ์ฝํ ์ ์์ต๋๋ค.
์ด๊ธฐfork
์์ ์์๋ ํ์ด์ง๋ฅผ ๋ณต์ฌํ์ง ์์ผ๋ฏ๋ก, ์๋๊ฐ ๋นจ๋ผ์ง๋๋ค.
2. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์์ Copy-On-Write
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ COW๊ฐ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๐ฅ
์ด๊ธฐ ๋ณต์ฌ ์ง์ฐ
๋ฐ์ดํฐ๋ฅผ ์ฒ์์๋ ๊ณต์ ํ๋๋ก ํฉ๋๋ค.
๋ณต์ฌ๊ฐ ํ์ํ ์์ ๊น์ง ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ์์ต๋๋ค.์ค์ ์ฐ๊ธฐ ์์ ์์์ ๋ณต์ฌ
๋ฐ์ดํฐ๊ฐ ์์ ๋ ๋๊น์ง ๋ณต์ฌ๋ฅผ ์ง์ฐ์ํต๋๋ค.
์์ ์ด ๋ฐ์ํ ๋๋ง ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
3. ๋ ๊ฒฝ์ฐ์ ์ ์ฌ์ ๊ณผ ์ฐจ์ด์
์ ์ฌ์
๋ ๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ ๋ณต์ฌํฉ๋๋ค.
์ค์ ์ฐ๊ธฐ ์์ ์ด ๋ฐ์ํ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค. (Lazy)
์ด๊ธฐ์๋read-only
์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํฉ๋๋ค.์ฐจ์ด์ :
- ์ฉ๋:
๐ฟ ์ด์ ์ฒด์ ์์๋ ์ฃผ๋ก ํ๋ก์ธ์ค ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๐ฆ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ์ฃผ๋ก ํฐ ๋ฐ์ดํฐ์ ๋ณต์ฌ ์ ์ฑ๋ฅ ํฅ์์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. - ๊ตฌํ ๋ ๋ฒจ:
์ด์ ์ฒด์ ์ COW๋ ํ๋์จ์ด ๋ ๋ฒจ์ ํ์ด์ง ํ ์ด๋ธ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋(MMU)์ ์ํด ๊ตฌํ๋ฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ COW๋ ์ํํธ์จ์ด ๋ ๋ฒจ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ด๋ จ๋ ์ฐธ์กฐ ์นด์ดํ ๋ฐ ๋ณต์ฌ ๋ก์ง์ ํตํด ๊ตฌํ๋ฉ๋๋ค.
- ์ฉ๋:
๐ฆข Copy-On-Write in Swift!
์ค์ํํธ์์์ Copy-On-Write(COW) ๊ธฐ๋ฒ์ ๊ฐ ํ์
(value type)์ธ ๋ฐฐ์ด(Array), ๋์
๋๋ฆฌ(Dictionary), ์ธํธ(Set) ๋ฑ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ธฐ๋ฒ์ ๋ฐฐ์ด์ ๋ณต์ฌํ ๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํด ๊ตฌํ๋ฉ๋๋ค.
์ค์ํํธ์์์ COW๋
์ฐธ์กฐ ์นด์ดํ
(reference counting)๊ณผ
์ฐ๊ธฐ์ ๋ํ ๋ณต์ฌ(copy-on-write) ๋ ๊ฐ์ง ํต์ฌ ๊ฐ๋
์ ๋ฐํ์ผ๋ก ์๋ํฉ๋๋ค.
1. ์ฐธ์กฐ ์นด์ดํ (Reference Counting)
- ์ด๊ธฐ ์ํ ๋ฐฐ์ด
array1
์ ์์ฑํ๊ณ , ์ด๋ฅผarray2
์ ํ ๋นํ๋ฉด ๋ ๋ฐฐ์ด์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด ์ํ์์ ๋ฐฐ์ด์ ์ค์ ๋ฐ์ดํฐ๋ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ณต์ ํฉ๋๋ค. - ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ
array1
๊ณผarray2
๋ชจ๋ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์นด์ดํธ๋ 2๊ฐ ๋ฉ๋๋ค.
var array1: [Int] = [0, 1, 2, 3]
var array2 = array1
// ์ฐธ์กฐ ์นด์ดํธ๋ 2
2. ์ฐ๊ธฐ์ ๋ํ ๋ณต์ฌ (Copy-On-Write)
- ์์ ์์
array2
์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋, ์ค์ํํธ๋ COW๋ฅผ ํตํดarray2
์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๊น์ง ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. ํ์ง๋งarray2
๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ์ค์ํํธ๋ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ฌ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ํ์ธํ์ฌ, ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1 ์ด์์ผ ๊ฒฝ์ฐ์๋ง ๋ณต์ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
array2.append(4)
// ์ด ์์ ์์ array2๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋น๋ฐ์ต๋๋ค.
// ์ฐธ์กฐ ์นด์ดํธ๋ 1๋ก ๊ฐ์ (array2๊ฐ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ฐ์ง๊ธฐ ๋๋ฌธ)
์ค์ํํธ์์์ CoW์ ์ฐธ์กฐ
- ์ด๊ธฐ ์ํ:
array1
๊ณผarray2
๋ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ณ , ์ฐธ์กฐ ์นด์ดํธ๋ 2์ ๋๋ค. - ๋ฐ์ดํฐ ๋ณ๊ฒฝ:
array2
์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด, ์ค์ํํธ๋array2
์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ์ฌ ๋ณต์ฌํฉ๋๋ค. ์ด๋ก ์ธํดarray2
๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
โ๏ธ OS์ CoW์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ CoW ๋น๊ต
OS์ CoW (์: fork
์์คํ
์ฝ)
- ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ(PTE) ๋ณต์ฌ:
fork
์์คํ ์ฝ์ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ๋ฅผ ์์ ํ๋ก์ธ์ค์ ๋ณต์ฌํ์ฌ ๋ ๋ค ๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ๋๋ก ํฉ๋๋ค. ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ๋ ์ด ํ์ด์ง๋ ๋ ์ค ํ๋๊ฐ ์ฐ๊ธฐ๋ฅผ ์๋ํ ๋ ๋ณต์ฌ๋ฉ๋๋ค. - ํ์ด์ง ํดํธ ์ฒ๋ฆฌ: ์ฐ๊ธฐ ์๋๊ฐ ์์ ๋ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๊ณ , ํด๋น ํ์ด์ง๊ฐ ๋ณต์ฌ๋์ด ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ CoW (์: ์ค์ํํธ)
- ์ฐธ์กฐ ์นด์ดํ ๋ฐฐ์ด์ด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ ์งํฉ๋๋ค. ์ฌ๋ฌ ์ฐธ์กฐ๊ฐ ์์ ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํฉ๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ณต์ฌ ์ฐ๊ธฐ ์๋๊ฐ ์์ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณต์ฌํ์ฌ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ณตํฉ๋๋ค.
Lazy-Loading..?๐น
Copy-On-Write(COW)
- ๋ชฉ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ํจ์จ์ฑ ๊ทน๋ํ.
- ์๋ ๋ฐฉ์ ์ด๊ธฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ๋ค๊ฐ, ์ค์ ๋ก ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ์์ ์ ๋ณต์ฌ๋ฅผ ์ํํฉ๋๋ค.
- ์ฌ์ฉ ์ฌ๋ก ์ด์ ์ฒด์ ์
fork
์์คํ ์ฝ, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ฐ ํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ(์: ์ค์ํํธ์ ๋ฐฐ์ด).
Lazy Loading
- ๋ชฉ์ ์ฑ๋ฅ ์ต์ ํ ๋ฐ ์ด๊ธฐํ ์ง์ฐ์ ํตํ ๋ฆฌ์์ค ์ฌ์ฉ ์ต์ํ.
- ์๋ ๋ฐฉ์ ์ค์ ๋ก ํ์ํด์ง ๋๊น์ง ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ์ง ์๊ณ ๋๊ธฐํ๋ค๊ฐ, ํด๋น ๋ฆฌ์์ค๊ฐ ์ฒ์ ํ์ํด์ง๋ ์์ ์ ๋ก๋๋ฅผ ์ํํฉ๋๋ค.
- ์ฌ์ฉ ์ฌ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ํ์น, ๊ฐ์ฒด ์ด๊ธฐํ, ์ด๋ฏธ์ง ๋ก๋ฉ ๋ฑ.
COW์ Lazy Loading์ ์ ์ฌ์
- ์ง์ฐ๋ ์์ ์ํ ๋ ๋ค ์ด๊ธฐํ ์์ ์ ๋ชจ๋ ์์ ์ ์ํํ์ง ์๊ณ , ์ค์ ๋ก ํ์ํด์ง๋ ์์ ๊น์ง ์์ ์ ์ง์ฐ์ํต๋๋ค.
- ํจ์จ์ ์ธ ๋ฆฌ์์ค ์ฌ์ฉ ๋ ๋ค ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ๋ญ๋น๋ฅผ ์ค์ด๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค.
COW์ Lazy Loading์ ์ฐจ์ด์
- ์ ์ฉ ๋ฒ์
- COW๋ ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ๋ฐ ๋ฐ์ดํฐ ๋ณต์ฌ ์ต์ ํ๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- Lazy Loading์ ์ฃผ๋ก ์ฑ๋ฅ ์ต์ ํ ๋ฐ ์ด๊ธฐํ ์ง์ฐ์ ํตํด ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์
์ ์ข
๋ฅ
- COW๋ ๋ฐ์ดํฐ์ ์ค์ ๋ณต์ฌ ์์ ์ ์ง์ฐ์ํต๋๋ค.
- Lazy Loading์ ๋ฐ์ดํฐ๋ ๋ฆฌ์์ค์ ๋ก๋ฉ ๋๋ ์ด๊ธฐํ๋ฅผ ์ง์ฐ์ํต๋๋ค.
COW์ Lazy Loading์ ๋ชจ๋ ํ์ํ ๋๊น์ง ์์
(๋ณต์ฌ,์ด๊ธฐํ)์ ์ง์ฐ์์ผ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ์ ๋ต์
๋๋ค.
๊ทธ๋ฌ๋ COW๋ ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ์ต์ ํ์ ๊ด๋ จ์ด ์๊ณ .
Lazy Loading์ ๋ฆฌ์์ค ์ด๊ธฐํ ๋ฐ ๋ก๋ฉ ์ต์ ํ์ ๊ด๋ จ์ด ์๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค!