씬디의 블로그

[운영체제] Copy-On-Write(COW) 본문

CS/운영체제

[운영체제] Copy-On-Write(COW)

cyndi 2023. 12. 24. 10:59

"Copy-On-Write가 뭔가요?"

네? copy,,뭐요,,?

저작권(Copyright) 관련된거 아닌가요?

 

ㅋ 아니 Copy-On-Write,,

그게 뭔데,,

 

Copy-On-Write, COW라고도 한다 음메~🐮

Copy-On-Write는 번역하면 '쓸 때 복사한다'는 의미이다

 

컴퓨터 프로그래밍에서 이 기법은

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

원본이나 복사본에서 수정이 일어날 경우 그때 복사를 하는 작업을 말한다

 

Copy-On-Write의 장점

복사를 하면 메모리가 두 배로 늘어나지만, 

수정이 일어나기 전까지는 메모리를 두배로 사용할 필요가 없다! 

따라서 실제 수정이 이뤄질 때만 복사를 하고 그 전에는 원본 리소스를 공유(즉 참조)함으로써

불필요한 복사를 줄이고 메모리를 효율적으로 사용할 수 있다

Swift에서는 값(Value) 타입의 복사는 깊은 복사 방식을 사용한다
그러나 컬렉션 타입(Array, Dictionary, Set)은 값(Value)타입이지만 힙 영역에 생성되어
매번 깊은 복사 방식을 사용하면 높은 메모리 오베허드가 발생할 수 있다

깊은 복사(Deep Copy)란?

깊은 복사는 데이터 자체를 복사하는 방법으로, 값 타입의 인스턴스들은 깊은 복사를 하게 된다
각 인스턴스가 독립적인 메모리를 차지하므로, 복사한 인스턴스의 데이터를 변경해도 원본에 영향을 주지 않는다

그럼 얕은 복사(Shallow Copy)란?

얕은 복사도 이름처럼 최소한의 복사만 진행하는 방법이다
복사를 해도 새로 인스턴스 메모리가 생기지 않고 주소값을 공유한다
원본과 복사본이 같은 주소값을 참조하므로 한쪽의 데이터를 변경하면 다른 쪽에도 영향을 준다
참조 타입에서 얕은 복사가 발생한다

 

컬렉션 타입과 힙 영역

값 타입은 스택에 저장되는거 아니였나?

컬렉션은 값(Value) 타입이지만, 동시에 데이터는 힙에 저장된다
네????

 

이는 컬렉션 타입이 아주 많은 양의 데이터를 담고 있기 때문이다
예를 들어, 문자열(String)에만 몇만 개의 글자가 들어갈 수 있고, 배열(Array)에 수십, 수백만 개의 데이터가 들어갈 수 있다


이 값이 프로그램 실행 중에 자주 할당되고 전달된다
이러한 경우 깊은 복사를 사용하면 많은 메모리와 시간이 소모될 수 있다

이러한 문제를 해결하기 위해 컬렉션은 Copy-On-Write(COW)라는 최적화 기법을 사용한다

Copy-On-Write는 컬렉션 타입(Array, Dictionary, Set)을 복사해서 사용할 때 일어난다

var array1: [Int] = [1,2,3]
let array2: [Int] = array1 // array2가 array1을 참조하고 있는 형태

print(array1) // 0x60000006e420
print(array2) // 0x60000006e420

// 원본(array1)이나 복사본(array2) 둘 중 하나를 수정
array1.append(4)

// 원본(array1)에 대한 수정이 일어났으니 이때 복사가 되어 복사본(array2)의 값이 메모리에 할당된다
print(array1) // 0x600000376ca0
print(array2) // 0x60000006e420

 

위 예제에서 볼 수 있듯이 데이터가 복사되어 사용되지만,

원본 데이터를 공유하다가 변경이 발생할 때만 실제로 복사하여 독립적인 데이터를 가지게 된다

 

Copy-On-Write는 대용량의 데이터를 다룰때 유용하다

var bigArray = Array(1...1000) // 1000개의 원소를 가진 배열
var copyArray = bigArray // copy on write 적용

데이터가 1000개보다 더 크다면 복사하는데 많은 시간과 메모리가 필요하다

 

하지만 Copy-On-Write가 적용되면

'bigArray'를 공유하다가 변경이 발생했을 때만 복사가 생성되어 메모리 사용을 줄일 수 있다

'CS > 운영체제' 카테고리의 다른 글

[운영체제] 메모리 구조 - 코데힙스  (3) 2024.05.18