본문 바로가기

iOS/Swift

Swift) COW (Copy-on-Write)

 

안녕하세요 소들입니다 😞 오늘은 뭔가 축축 쳐지는 날이네요

며칠 째 계속되는 장마 탓도 있고.. (비 혐오자)

개발과는 참 애증의 관계인 것인지..

공부할 건 너~~~~~~무 많고..ㅜㅜ 멋진 개발자가 되는 게 꿈인데 쩝..

 

이러나 저러나..

울적하다 해서 공부를 안할 순 없죠 :)

 

계속 옵셔널에 대해 공부를 해왔는데 이번엔 잠깐 쉬는 타임으로

흥미로운 내용을 갖고 왔어요

 

아실 분은 다 아시겠지만 저는 잘 몰랐던 내용이라

이렇게 포스팅을 합니다 👀

 

정말 간단한 개념입니다 :)

모든 포스팅은 편의 말투로 합니다~~

 

 

 

 

1. COW

 

🐂

COW? COW가 뭐임? 소?

 

여러분 이 카테고리가 Swift에 있지만

COW는 원래 Swift를 포함한 모든 프로그래밍에서 쓰이는 기술 중 하나임

 

그래서 뭐냐고

 

 COW (Copy-on-Write) 

- 컴퓨터 프로그래밍에서 복사 동작을 할 때,

실제 원본이나 복사본이 수정되기 전까지는 복사를 하지 않고 원본 리소스를 공유함

원본이나 복사본에서 수정이 일어날 경우, 그때 복사하는 작업을 함

 

 

.

.

 

이 작업을 Swift에선 Collection Type을 복사해서 사용할 때 일어남

Array, Dictionary, Set 요론고

 

OTL

먼소리셈

다음을 보면 이해할 수 있셈

 

 

 

 

자 위와 같은 array1이라는 배열이 있음

메모리상에는

 

 

 

 

이렇게 되겠찌?!

자 근데 여기서 array2를 만들어 보자

 

 

 

 

그리고 array1의 값을 array2에 대입했음

님드라 Swift는 array가 무슨 형식이다?

 

 

 

 

 

 

구조체 형식이다

 

따라서 저렇게 대입한 것은

array1에서 array2로 복사가 일어났다는 것임

 

 

자 그럼 원래 대로라면

 

 

 

 

 

 

이렇게 array2가 바로 새로운 메모리를 할당해서 array1의 값을 복사해서 들고 있어야 정상임

 

근데 COW를 쓰면 뭐다?

바로 복사를 하지 않는다!

 

COW를 사용하면 Swift에선 자주 안 쓰이는 단어지만

다음처럼 array2가 array1참조하고 있는 형태가 됨

 

 

 

 

이런 식으루! 

 

근데 이러다가

원본(array1)이나 복사본(array2) 둘 중 하나를 수정한다????!!

 

 

 

 

요롷게 말이징

 

그럼 이때!!! 첫 수정이 일어난 이 때!!

비로소 찐 복사가 일어나서 array2의 값이 메모리에 할당됨

 

 

 

 

이해감? 위 그림이 처음 복사 했을 때 나오는 게 아니라

첫 수정이 일어 났을 때 나오는 것임 ㅇㅋ?

 

 

이것이 바로 COW 🐂 임

 

실제 swift 결과물을 봐도 알 수 있셈!!

 

 

 

 

 

 

실제 수정이 일어나야 주소값이 바뀌는 거 보임? 👀

원본이든 복사본이든 수정이 먼저 일어난 놈의 주소값이 바뀌는 것을 알 수 있다!

 

 

 

 

2.  사용 용도

 

그럼 왜써..??

결국 수정 일어날 때 복사해야 하는 거 아냐?

 

라고 생각할 수도 있지만

 

녀러분

복사를 한다고 해서 꼭 수정을 하는 것은 아님

 

만약 10000000개의 element를 가지는 배열 array1이 있을 때,

이를 array2로 복사 했음

근데 COW가 아니라면 메모리가 그만큼 두 배로 늘어났을 거 아님?

 

근데 내가 원본이나 복사본이나 수정을 안함.

앞으로도 할 일 없음.

 

이럴 경우엔 COW를 사용했을 때보다 

2배의 메모리를 먹고 있는 것임

 

이렇듯

 

실제 수정이 이뤄질 때 복사를 하고 

그 전엔 참조를 통해  불필요한 복사 를 줄이자!

 

라는 것이 COW의 장점이자 사용 이유임

 

 

 

 

3. 특징? 한계?

 

한계라고 하긴 좀 애매한데

맨 처음 COW를 이해하고 든 생각

 

그럼 첫 수정 작업을 할 땐 COW 때문에 실행 시간이 더 걸리겠네?

 

 

그래서 시도해봤음

 

 

 

 

참고로 위에서 결과값은 ms임

쨋든 맞음

 

결과적으로 COW 때문에 첫 번째 수정 작업 때 시간 작업이 더 걸림

복사 작업을 이때 해야하니께

 

찾아보니까

 

 

 

약간의 오버헤드를 발생시킨다 함

 

 

근데 뭐 대략 위에선 23.3ms(0.023초) 정도 차이 나고

물론 데이터가 커질수록 더 커지겠지만 .. 

딱히 신경 쓸 필요는 없을듯!

 

 

 

 

 

.

.

.

 

쩄든 이번 포스팅은 끝

정말 별거 아닌 기능 같아 보여도 그냥 첨 들었을 때 신기했고

컴퓨터는 정말 똑똑하고 효율적으로 일하는구나 싶었음 (나랑 다르게 🌝)

 

개발자라면 알아둘 상식 하나 추가 하면서

이만 포스팅 마침

 

 🐂

 

(피드백 언제나 환영)

 



Calendar
«   2024/05   »
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
최근 댓글
Visits
Today
Yesterday