GGURUPiOS

[Swift] Copy-on-Write과 메모리할당 본문

Swift/문법 파헤치기

[Swift] Copy-on-Write과 메모리할당

꾸럽 2023. 10. 31. 16:39

안녕하세요.

이번 시간에는 Copy-on-Write 가 무엇인지 알아보도록 하겠습니다.


Copy-on-Write(CoW)란 무엇일까?

컴퓨터 프로그래밍에서 수정 가능한 리소스에 대한 '복제' 또는 '복사' 작업을 효율적으로 구현하는 데 사용되는 리소스 관리 기법입니다.

 

이렇게 말하면 와닿지 않는데, 간단히 이야기하면

값이 변경 되기 전까지는 copy를 하지 않고 원본을 바라보는 것 입니다.

 

아래의 예시를 볼게요.

Array값을 할당한 numberArrays의 값을 다시 copyArrays에 할당하게 되면 CoW가 사용된걸 보실 수 있습니다.

처음에는 같은 메모리주소를 바라보다가, numberArrays의 값이 변경되면, 다른 메모리 주소를 가집니다.

(copyArrays의 값을 수정해도 마찬가지, 먼저 수정된 변수가 메모리 주소가 바뀜)

 

왜 사용할까?

즉, 위에서도 말했지만 복사할 때 낭비되는 리소스를 줄이는 목적입니다.

만약 1000개의 값을 가지고 있는 배열이 있다고 가정하고, 그 값이 변경되지 않는다고 가정해봅시다.

그러면 관리 측면에서 배열을 복사하는 작업 보다는 원본 배열의 메모리 주소만 가지고 있으면 복사에 낭비되는 리소스가 없을것입니다.

 

약간 참조타입과 비슷해 보이죠?

 

그렇다면 Array는 힙영역에 저장되는걸까요? 스택영역에 저장되는걸까요? 

결론을 둘다입니다.

 

우리는 기본적으로 이런 개념을 가지고 있습니다.

 

값 타입 -> 스택 영역

참조 타입 -> 힙 영역

 

그런데 CoW가 사용된 Array는 구조체인데도 불구하고 힙 영역과 스택 영역 둘다에 저장됩니다.

 

즉, 상황에 따라서는 값 타입도 힙 영역에 저장될 수 있다는 것입니다. 

 

일단 처음 할당될 때 힙 영역에 메모리 주소를 가지며,

스택영역에는 힙 영역의 메모리 주소만 저장되어 있습니다.

 

즉, 위에 했던 말들을 요약하자면 

  • CoW를 사용하면 값 타입을 참조 타입처럼 복사할 때 참조할 수 있다.
  • 실제 복사는 해당 복사본을 수정하려고 할 때만 발생한다.(수정 작업시, 새로운 힙 영역 할당)

정도로 요약할 수 있습니다.

 

저는 Array만을 가지고 설명했지만

사실 String, Set, Array, Dictionary 등 CoW가 사용되고 있습니다. 


아래의 링크 출처들에서 더 자세히 기술되어 있습니다.

 


내가 만든 구조체에서 CoW 사용하기

스위프트 docs에 따르면, 큰 값을 복사하는데 드는 비용을 없애려면 cow를 사용하라고 조언한다.

final class Ref<T> {
  var val: T
  init(_ v: T) { val = v }
}

struct Box<T> {
  var ref: Ref<T>
  init(_ x: T) { ref = Ref(x) }

  var value: T {
    get { return ref.val }
    set {
      if !isKnownUniquelyReferenced(&ref) {
        ref = Ref(newValue)
        return
      }
      ref.val = newValue
    }
  }
}

위와 같이 구현할 수 있다. isKnownUniquelyReferenced(object: &T) 메소드를 이용해
유일하게 참조되고 있는지 여부를 파악하고 값을 할당한다.

더 자세한 내용은 아래 링크에서 확인할 수 있다.

https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#advice-use-copy-on-write-semantics-for-large-values

 

 


참고

https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#advice-use-copy-on-write-semantics-for-large-values

https://www.vadimbulavin.com/value-types-and-reference-types-in-swift/

 

Value Types and Reference Types in Swift

Value types and reference types are the core concepts in Swift. Let's study what are value and reference semantics; how Swift structs and classes are stored in memory; compare Swift structs and classes performance and suggest when to use what.

www.vadimbulavin.com

https://medium.com/@marthin.pasaribu_72336/copy-on-write-cow-with-swift-ce6c6583de38

 

Copy On Write (COW) with SWIFT

What is Copy On Write?

medium.com

https://medium.com/@jungkim/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%ED%83%80%EC%9E%85%EB%B3%84-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B6%84%EC%84%9D-%EC%8B%A4%ED%97%98-4d89e1436fee

 

스위프트 타입별 메모리 분석 실험

struct와 class 가 메모리 영역을 어디를 사용하는지 분석한 실험 결과

medium.com