지난 포스팅의 Deep Copy(깊은 복사)와 Shallow Copy(얕은 복사)에 대해 학습한 뒤 이어서 CoW에 대한 내용을 다루고 싶었지만
CS(Coputer Science)와 함께 다루기에는 주제가 어울리지 않을 것 같아 CoW에 대해서만 작성해봅니다!
이번 주제는 제목에서처럼 2가지 시각으로 접근해보려고합니다.
1. Swift에서의 Copy-on-Write
2. OS(Operating System)에서의 Copy-on-Write (with Paging 기법)
네.. 처음에 들었을때는 🐮❓ 🐄.. 🐃.. 🐂..❓❓❓
(글을 작성하며 알게되었는데 기본 이모티콘에서 소를 나타내는 이모지만 4가지나 되는군요!)
Copy-on-Write에 대한 정의를 나타내는 문장은 다음과 같습니다.
실제 원본이나 복사본이 수정되기 전까지는 복사가 이루어지지 않고 원본 자원을 공유하며
수정이 일어났을 때, 복사가 이루어진다.
(이전 포스팅 내용) 즉, 쉽게 생각하여 복사하고싶어요❗️라고 말해도 즉시 복사하지 않는 것이죠❗️
복사 직후에는 얕은 복사를 진행하고 데이터에 변형이 일어나면 그때 깊은 복사를 진행합니다.
진짜 그렇게 이루어지는지 확인 작업이 필요하겠죠❗️
메모리 주소를 통해 확인해보도록 하였습니다.
func address(of object: UnsafeRawPointer) -> String {
let address = Int(bitPattern: object)
return String(format: "%p", address)
}
var array: [Int] = [1, 2, 3, 4 ,5]
var copyArray: [Int] = array
print("[ Copy-on-Write 적용 전 ] ❌")
print("배열의 값 = \(array), 배열의 주소값 = \(address(of: array))")
print("배열의 값 = \(copyArray), 배열의 주소값 = \(address(of: copyArray))")
print("")
array.append(6)
print("[ Copy-on-Write 적용 전 ] ⭕️")
print("배열의 값 = \(array), 배열의 주소값 = \(address(of: array))")
print("배열의 값 = \(copyArray), 배열의 주소값 = \(address(of: copyArray))")
이렇게 주소값이 바뀐 것을 확인할 수 있었습니다❗️
그럼 왜 우린 이런 복사 매커니즘을 알아야할까..❓ 🧐
A) 메모리를 효율적으로 쓰기 위해서!! 즉, 불필요한 복사를 줄이자!!
여기서 좀 더 나아가 OS(Operating System)에서 메모리를 효율적으로 관리하기 위해 배우게되는 항목 중
Paging(페이징) 기법에 대해서 학습한 부분을 함께 이해하면 좋을 것 같았습니다.
Swift에서 CoW를 먼저 접했지만 사실 OS에서 더 많이 사용되는 표현이였습니다.
사전 지식이 조금 필요하기에 간단히 목차로 정리해보자면...
Copy-on-Write가 발생하지 않았을 때
Copy-on-Write가 발생했을 때
결과적으로 Copy-on-Write의 기본적인 매커니즘은 동일합니다.
자원에 쓰기(Write)작업이 발생했을 때 복사 진행❗️
이라는 것이 말이죠.
그리고 사용하는 이유는 메모리의 효율을 극대화
시키기였습니다.
Swift) COW (Copy-on-Write) - 개발자 소들이 - 티스토리
[Swift] COW(Copy On Write) - 메모리 절약 방법 - Structure 응용편, OS응용편
[컴퓨터 공학 기초 강의] 40강. 페이징의 이점과 계층적 페이징