적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift] Copy On Write 동작 방식

hongssup_ 2022. 12. 7. 16:09
반응형
Copy-on-write란 컴퓨터 프로그래밍에서 리소스의 복제를 효율적으로 구현하기 위한 리소스 관리 기술로,
Swift에서는 Collection Type을 복사해서 사용할 때, Value Type의 성능을 최적화하기 위해 COW를 사용한다. 
실제 수정이 이뤄질 때 값을 복사해서 메모리에 할당하고, 그 전에는 참조를 통해 불필요한 복사 및 메모리 사용을 줄이고자 하는 것.

Copy-On-Write (COW) 란?

Copy-on-write (COW), sometimes referred to as implicit sharing or shadowing, is a resource-management technique used in computer programming to efficiently implement a "duplicate" or "copy" operation on modifiable resources. 
If a resource is duplicated but not modified, it is not necessary to create a new resource; the resource can be shared between the copy and the original. Modifications must still create a copy, hence the technique: the copy operation is deferred until the first write.
By sharing resources in this way, it is possible to significantly reduce the resource consumption of unmodified copies, while adding a small overhead to resource-modifying operations
- wikipedia

컴퓨터 프로그래밍에서 수정 가능한 리소스에 대하여 복제 / 복사 작업을 효율적으로 구현하기 위한 리소스 관리 기술이다. 

리소스가 복제 되더라도 수정되지 않은 경우에는, 굳이 새 리소스를 생성할 필요가 없다.

따라서 수정이 되기 전까지는 복사작업을 미루고 원본 리소스를 공유하고, 수정이 일어나면 그 때 복사하는 것

수정 작업에 약간의 오버헤드를 추가하면서(?), 수정되지 않은 복사본들의 리소스를 크게 줄일 수 있다. 

 

Swift에서의 COW 동작 방식

Swift에서는 Collection 등의 Value Type을 복사해서 사용할 때 COW를 사용한다.

ex) Array, Dictionary, Set 

@frozen struct Array<Element>
@frozen struct Dictionary<Key, Value> where Key : Hashable
@frozen struct Set<Element> where Element : Hashable

위의 collection type들은 struct 구조체 형식으로, 다음과 같이 대입해주면 값 복사가 일어난다. 

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

메모리 주소를 찍어보면 다음과 같다. 

값 복사가 일어나면 array2도 새로운 메모리를 할당해서 array1의 값을 복사해 가지고 있을 것 같지만, 

cow 를 사용하여 array2는 array1의 값을 참조하고 있게 된다. (값이 저장된 메모리 주소가 동일)

둘 중 하나가 수정이 되기 전까지는!

 

그러다 둘 중 하나가 수정이 되면 그 때 실제 복사가 일어나서 array2 값이 새로운 메모리에 할당된다.

즉, 값을 복사하더라도 값을 복사한 시점이 아니라 원본 or 복사본 값이 수정(write)되는 시점에 실제 복제(copy)가 일어나 메모리에 할당이 된다는 것. → copy-on-write

 

COW 사용하는 이유? 

실제 수정이 이뤄질 때 복사를 하고, 그 전엔 참조를 통해  불필요한 복사 및 메모리 사용을 줄이자!

 

* 상단 위키피디아 설명에도 나와있듯이, COW 를 사용하게 되면 값이 실제로 복사되는 첫번째 수정 작업을 할 때 시간이 조금 더 걸리고 약간의 오버헤드가 발생할 수 있다고 하지만 딱히 신경쓸 정도는 아니라고 한다. 

 

 

 


참고 : Understanding Swift Copy on write Mechanisms, 개발자 소들이, naljin - value type 의 메모리 주소, github - High performance Swift code

728x90
반응형