COW 확인하기

Kyo Pak·2023년 3월 25일
1
post-thumbnail

1️⃣ 일단 COW가 뭘까?


소? 아니다.

값 타입과 참조타입의 큰 차이중 하나다.
값 타입은 새로운 변수할당을 하거나 파라미터로 전달될떄 값 복사가 일어난다.
다만 값복사의 경우 Cost가 크기 때문에 이를 Optimal하게 만들기 위해 나온 기법이다.

Copy on Write 쓰기 시 복사

일단 주소값을 공유한 후에 실질적인 데이터의 변경이 이루어졌을 때, 메모리를 복사 후 변경할 값을 변경하는 기법이다.

예를 들어서, Swift의 Array가 값타입인데, 값타입은 복사하면 Stack에 쌓인다고 알고있다.
하지만 Array역시 COW기법을 사용한다.


2️⃣ COW의 이점은 뭘까?


아무리 값 타입이라고 해서 그냥 값 복사를 한다면 변경이 없는 동일한 데이터에 대해서도 메모리를 낭비할 뿐만 아니라, 매우 큰 데이터의 경우에 복사 Cost가 크게 발생한다.

때문에 변경이 일어났을 때만, 실질적인 복사가 이루어져 메모리를 효율적으로 사용할 수 있게 되는 것이다.

즉, 메모리 효율적으로 사용이 가능해진다.


3️⃣ COW인 것들은 뭘까?


https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures/

Note
Collections defined by the standard library like arrays, dictionaries, and strings use an optimization to reduce the performance cost of copying. Instead of making a copy immediately, these collections share the memory where the elements are stored between the original instance and any copies. If one of the copies of the collection is modified, the elements are copied just before the modification. The behavior you see in your code is always as if a copy took place immediately.

Array, Dictionary, String과 같은 컬렉션타입은 복사 코스트를 낮추기위해 최적화가 되어있다.
원본과 복사본 간에 저장되는 메모리를 공유하다가 복사본 중 하나가 수정되면 수정 직전에 복사가 이루어진다.
즉, 컬렉션 타입들을 Copy on Write를 지원한다.


4️⃣ 확인해보자


📌 Array 확인해보기

  • CoW가 되는 것을 확인 할 수 있다.

📌 String 확인해보기

저 주소값은 뭘까?
아 전역에 찍어서 Data영역의 주소값이 나왔다.

다시,

요로코롬 찍힌다. 그럼 영역확인을 해보자!

야무지게 스택과 힙에 찍히는 것을 볼 수 있다.

근데, str2 = st1을 했는데 왜 주소값이 다를까?
생각을 해본결과, 가변적으로 길이가 변경되기 때문에 힙에 저장되고 그 힙의 주소값을 스택에 저장한다. 스택은 다를지언정 가리키고 있는 힙영역은 같지 않을까? 확인해보자.

내부의 값이 똑같다는 것을 확인 할 수 있다.
그럼 값변경을 해보자

내부의 값이 완전 달라지는 것을 확인 할 수 있다.
즉 COW가 동작한다.


5️⃣ COW동작이 아닌 애들을 COW를 어떻게 만들까?


구조체의 경우 애초부터 다른 주소값을 가지고 있다.

이렇게 클래스 내부에 구조체를 담아서 내부의 구조체 인스턴스에 저장하고자 하는 구조체 데이터를 저장하면 어떻게 될까?

위와 같이 여전히 다르다. 그럼 내부의 값은 어떻게 될까?

오 비슷한 값을 가지고 있는 것으로 보인다. 뒤에는 살짝 다른데 좀더 알아볼 필요가 있겠다.
이렇게 test2의 값을 변경하고 다시 내부의 값을 본다면?

위와 같이 완전히 내부의 값도 달라지는 것을 알 수 있다. 즉 CoW가 일어나는 것으로 생각할 수 있다.


참고
김정님의 스위프트 타입별 메모리 분석 실험

profile
iOS 자문자답

0개의 댓글