본문 바로가기
면접 스터디

면접스터디 : Copy-on-Write

by iOS 개린이 2022. 12. 22.

CoW : Copy on Write 

-컴퓨터 프로그래밍에서 복사 동작을 할 때 복사본과 원본이 수정되지 않을 경우 새 리소스를 만들지 않고 원본 리소스를 공유하고, 복사본이나 원본에서 수정이 일어났을 때만 새 리소스를 만드는 관리 기법이다.

 

-우리가 사용하는 Swift에서는 CoW작업이 Collection Type(Array, Dictionary, Set)을 복사해서 사용할 때 실행된다. 

 

-미리 알고가야 할 점은 Swift에서는 Reference Type(클래스)과 Value Type(구조체, 열거형 등)이 있다.

이 중 Value Type은 copy semantic을 가지고 있어 만약 Value Type의 값을 다른 변수에 넣었을 때, 해당 값의 데이터가 복사되어 2개의 서로 다른 메모리 주소로 저장된다.

 

 

ex)

1. 배열을 하나 만들었다.

var array1 : [Int] = [1, 2, 3, 4]

 

 

2. array2라는 배열을 하나 더 만들어서 array1의 값을 그대로 넣어주자.

var array1 : [Int] = [1, 2, 3, 4]

var array2 : [Int] = array

 

 

Swift에서 배열은 Struct로 만들어져 있어 Value Type 이다.

그러면 array의 값을 array2에 넣었을 때

 

출처 : https://babbab2.tistory.com/18

메모리에서는 다음 그림과 같이 array2 라는 새로운 리소스를 만들어 주고, array1의 값을 복사해서 넣어주었다고 생각할 수 있다.

 

하지만 Swift의 CoW 작업이 발생하면 array1(원본)값과 array2(복사본)이 수정되지 않은 경우에는 array1(원본)값을 array2(복사본)이 공유한다.

 

출처 : https://babbab2.tistory.com/18

 

위 그림과 같이 array2는 array1의 값을 공유하고 있다.

 

여기서 array1(원본)이나 array2(복사본)을 처음 수정하는 작업을 하면

array1[0] = 1

 

비로소 새로운 리소스를 할당해주는 작업이 실행된다.

출처 : https://babbab2.tistory.com/18

 

CoW의 장점

-원본데이터나 복사본데이터를 수정하지 않는 경우 CoW를 사용하지 않으면, 각자 리소스를 만들기 때문에 그만큼 메모리를 잡아먹고 있는데 CoW를 사용함으로 메모리 낭비를 줄일 수 있다.

 

-우리가 무거운 값의 데이터를 다른 변수에 대입해주거나, 매개변수로 넘겨줄 때 무거운 연산 작업을 해주어야 하는데 CoW 작업을 통해서 참조를 통해 가볍게 작업을 마무리 할 수 있다.

 

CoW의 단점?

-원본, 복사본의 첫 수정에 새로운 리소스를 복사하는 작업을 실행하기 때문에 첫 수정 작업에는 시간이 좀 더 걸리고, 약간의 오버헤드를 발생시킨다. (장점에 비해 단점이라고 하기엔 애매)

-원본의 데이터는 참조 횟수가 없었는데, CoW 작업을 통해서 참조 횟수가 늘어남. (사본 수를 확인하기 위해 Reference Counting 해주어야 함.)

 

 

 

 

 

 

 

 

Reference :

https://babbab2.tistory.com/18

https://sihyungyou.github.io/iOS-copy-on-write/