Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Copy On Write는 어떤 방식으로 동작하는지 설명하시오. #3

Open
Do-hyun-Kim opened this issue Jul 27, 2023 · 5 comments
Labels
Swift Swift CS 개념 공부

Comments

@Do-hyun-Kim
Copy link
Contributor

No description provided.

@Do-hyun-Kim Do-hyun-Kim added the Swift Swift CS 개념 공부 label Jul 27, 2023
@Do-hyun-Kim
Copy link
Contributor Author

Do-hyun-Kim commented Aug 1, 2023

Swift 에서 Value Type or Reference Type Copy 방식

  • Deep Copy(깊은 복사)
    • 데이터를 그대로 복사하며, 복사된 두 객체는 각각의 메모리를 가지게 된다. 즉 독립적인 객체가 된다.
    • 기본적으로 Value Type의 객체들을 생성하면 Deep Copy로 이루어 지게 된다.
  • Shallow Copy(얕은 복사)
    • 데이터를 복사해도 인스턴스의 메모리가 생성되는 것이 아닌 값의 주소를 복사하여 같은 값을 가르치게 된다.
    • 기본적으로 Reference Type 객체들을 생성하면 Shallow Copy로 이루어 지게 된다.
  • NSCopying
    • Copy()을 사용하여 Reference Type 에서도 Deep Copy를 가능하게 해주는 Protocol이 있다.

Copy - On - Write에 대해

  • Copy - On - Write는 Swift 자체 기능이라기 보다 컴퓨터 프로그래밍에서 사용되는 리소스 관리 기법이다.
    • Copy - On - Write는 메모리 할당과 해체를 최적화 하는 기법중 하나이며, Swift의 Collection Type들(String, Array, Set, Dictionary)에서 Copy - On - Write가 동작 한다.
    • Custom Value Types 같은 경우 Copy - On - Write가 구현되어 있지 않기 때문에 직접 구현 해야 한다.
    • Copy - On - Write는 Deep CopyShallow Copy의 장점을 모두 가지고 있는 기능이다.

Copy - On - Write의 장점

  • Copy - On - Write는 복사 시에 실제로 값을 복사하지 않고 동일한 값을 참조 하고 있다가 수정(Write)가 발생 하면 그 때 값을 복사해 변경을 적용하기에 메모리 낭비를 줄일 수 있을 뿐만 아니라 오버헤드의 문제점을 해결할 수 있다.
  • Copy - On - Write는 특별한 코드를 작성하지 않고 동작하기에 사용하기가 쉽다.

Copy - On - Write의 단점

  • 사용자 지정 Value Types 뿐만 아닌 Reference Types 에는 Copy - On - Write를 지원하지 않기에 직접 구현해야 한다.
  • 데이터가 자주 수정되는 경우 메모리 공간을 할당하여 복사하기에 불필요한 메모리 낭비와 오버헤드를 부를 수 있기 때문에 설계에 마쳐서 구현을 해 나가야 한다.

📝 참고 사이트

@vichye-1
Copy link

vichye-1 commented Aug 2, 2023

Copy-on-Write란?

Value Type의 복사를 하는 Collection Type(array, dictionary, string) 등에서 사용되는 기법이다. 원본 값이 복사될 때, 복사본은 바로 복사되지 않고 원본 값의 메모리 주소를 참조하다가, 복사된 값이 변경되는 시점에 독립적인 메모리 공간으로 복사된다.

Copy-on-Write의 동작 방식

  1. Collection 타입의 데이터를 선언한다.
    • Collection 타입의 데이터는 힙 영역에 값을 저장한다.
  2. 원본 데이터를 복사하면 복사본은 바로 복사 되는 것이 아니라, 원본 데이터와 같은 메모리 주소를 참조 한다.
  3. 복사본이 수정되면, 수정되기 바로 직전에 원본 데이터와 다른 메모리 주소에 저장된다.

Copy-on-Write를 사용하는 이유

값 복사를 하게되면 heap에 값이 저장되는 깊은 복사 방식을 채택하게 되는데, 매번 깊은 복사를 하게되면 높은 메모리 오버헤드가 발생한다. 따라서 Copy-on-Write 방식을 사용하여 복사가 필요한 시점, 즉 수정이 발생할 때만 복사를 수행함으로써 메모리를 효율적으로 관리할 수 있다.

📝 참고

@ronick-grammer
Copy link
Contributor

Copy-On-Wirte (COW)

Copy-On-Write 란 데이터간에 값 복사가 이루어질때, 바로 복사가 이루어 지지 않고 데이터 수정시에 값복사가 이루어지는 메커니즘을 의미한다.

Copy-On-Write 동작 조건

Copy-On-Write 동작 과정

  1. Collection 타입인 A와 B를 선언
  2. A를 B에 대입 B = A : 동일한 메모리를 가르키고 있음(할당받은 메모리 주소가 같음)
  3. A or B 의 값을 수정: 값을 수정한 변수에 새로운 메모리를 할당하여 복사 (Copy-On-Write)

Copy-On-Write 의 이점

단일 데이터가 아닌 복수 데이터를 복사한 후 수정이 없을 경우, 메모리 할당에 드는 오버헤드를 줄일 수 있어 성능에 도움을 준다.

Copy-On-Write 의 단점

데이터 복사후 첫 수정시에 새로운 메모리 할당이 이루어지고 값 복사가 이루어지므로 이때 실행속도가 저하될 수 있다.

📝 참고 사이트

@Hminchae
Copy link
Member

Hminchae commented Aug 3, 2023

Copy - On - Write(COW)란

  • 컴퓨터 프로그래밍에서 수정 가능한 리소스에 대한 복제/복사 작업을 효율적으로 구현하기 위한 리소스 관리 기술
  • 실제 수정이 이뤄질 때 복사를 하고, 그 전엔 참조를 통해 불필요한 복사 및 메모리 사용을 줄임
  • COW는 원시타입 구조체인 int, Double, String에 구현되어 있고 컬렉션 구조체인 Arrey, set, Dictionary등에 구현되어 있음
  • 사용자 정의 구조체(Struct)에는 COW가 구현되어있지 않음. 필요 시 커스텀 하여 구현

Copy - On - Write(COW) 예제

아래 코드에서 기본적으로 array1을 생성하고 array2에 할당한다. 여기서 Copy-on-write로 인해 복사되지 않으므로 둘 다 동일한 주소를 가리킴

import Foundation

func print(address o: UnsafeRawPointer ) {
    print(String(format: "%p", Int(bitPattern: o)))
}

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

print(address: array1) //0x600000078de0
print(address: array2) //0x600000078de0

//아래와 같이 array2값이 변경될 때만 복사된다.

array2.append(4)
print(address: array2) //0x6000000aa100

Copy - On - Write(COW)의 단점

  • COW를 사용하게 되면 실제로 복사하는 첫번째 수정 작업을 할 때 시간이 조금 더 걸리며 오버헤드가 발생할 수 있음

📝 참조

@Do-hyun-Kim
Copy link
Contributor Author

Do-hyun-Kim commented Aug 6, 2023

🗣️ Copy - On - Write 추가 공유

  • Copy - On - Write 같은 경우 Collection Type 뿐만이 아닌 Data, URL 등에 몇몇 자료형에서도 Copy - On - Write가 지원이 된다.
  • Standard Library 에서는 Copy - On - Write 동작 하지 않으며, String 같은 경우에는 Copy - On - Write 가 지원 되지만 글자수가 15 글자를 초과해야 Copy - On - Write가 동작 하며, appendingMethod 를 사용하면 Copy - On - Write 동작 하지 않고 서로 같은 주소를 바라 보는 것을 확인 할 수 있다.

📝 참고 사이트

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Swift Swift CS 개념 공부
Projects
None yet
Development

No branches or pull requests

4 participants