Featured image of post COW(Copy-On-Write)

COW(Copy-On-Write)

COW ๐Ÿ‚ โ“

COW(Copy On Write)๋Š” Swift์—์„œ ์„ฑ๋Šฅํ–ฅ์ƒ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Swift์—์„œ Array ๋ณต์‚ฌ๋ฅผ ํ•  ๋•Œ ์‹ค์ œ๋กœ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋‹ค๊ฐ€ ์›๋ณธ์ด๋‚˜ ๋ณต์‚ฌ๋ณธ์— ์ˆ˜์ •์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ๊ทธ ๋•Œ ๋ณต์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ COW ๋ผ๊ณ  ํ•œ๋‹ค.

์ฃผ์†Œ๊ฐ’์„ ํ”„๋ฆฐํŠธํ•˜๋Š” address()ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  array1 ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜์—ฌ array2์— ํ• ๋‹นํ•˜๊ณ  ์ฃผ์†Œ๋ฅผ ์ฐ์–ด๋ณด๋ฉด ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

array2์— ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฃผ์†Œ๋ฅผ ์ฐ์–ด๋ณด๋ฉด array2์˜ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func address(of: UnsafeRawPointer) {
    let address = String(format: "%p", Int(bitPattern: of))
    print(address)
}

var array1 = [1,2,3,4]
var array2 = array1

address(of: array1) // 0x60000231a5e0
address(of: array2) // 0x60000231a5e0

//change array 2
array2.append(7)
address(of: array1) // 0x60000231a5e0
address(of: array2) // 0x6000019ecb60

๋ณต์‚ฌํ•œ ๋‚ด์šฉ์ด ๋™์ผํ•˜๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐํ•จ์œผ๋กœ์จ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์„ฑ๋Šฅํ–ฅ์ƒ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

Reference

https://medium.com/@lucianoalmeida1/understanding-swift-copy-on-write-mechanisms-52ac31d68f2f

https://ishtiz.com/swift/what-is-copy-on-writecow-in-swift

https://babbab2.tistory.com/18

Licensed under CC BY-NC-SA 4.0