Swift와 운영체제의 CoW(Copy on Write) 에 대하여

Jason·2023년 10월 27일
0


지난 포스팅의 Deep Copy(깊은 복사)와 Shallow Copy(얕은 복사)에 대해 학습한 뒤 이어서 CoW에 대한 내용을 다루고 싶었지만
CS(Coputer Science)와 함께 다루기에는 주제가 어울리지 않을 것 같아 CoW에 대해서만 작성해봅니다!

이번 주제는 제목에서처럼 2가지 시각으로 접근해보려고합니다.
1. Swift에서의 Copy-on-Write
2. OS(Operating System)에서의 Copy-on-Write (with Paging 기법)

🅰️ Swift & Copy-on-Write

네.. 처음에 들었을때는 🐮❓ 🐄.. 🐃.. 🐂..❓❓❓
(글을 작성하며 알게되었는데 기본 이모티콘에서 소를 나타내는 이모지만 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(페이징) 기법에 대해서 학습한 부분을 함께 이해하면 좋을 것 같았습니다.

🅱️ OS에서의 Copy-on-Write (with Paging 기법)

Swift에서 CoW를 먼저 접했지만 사실 OS에서 더 많이 사용되는 표현이였습니다.
사전 지식이 조금 필요하기에 간단히 목차로 정리해보자면...

  • 프로세스는 기본적으로 자원을 공유하지 않는다.
  • 프로세스는 서로 전혀 다른 메모리 공간을 가지고있다.
  • 부모 프로세스가 적재된 별도의 공간에 자식 프로세스가 통째로 복사되어 적재
    (프로세스 생성 지연, 메모리 낭비)
  • 부모 프로세스와 동일한 자식 프로세스가 복제되어 생성되면
    자식 프로세스는 부모 프로세스와 동일한 프레임을 가리킴 (쓰기 작업이 없다면 이 상태 유지)
  • 부모 프로세스 / 자식 프로세스 둘 중 하나가 페이지에 쓰기 작업 수행 시 헤당 페이지는 별도의 공간으로 복제
    (프로세스 생성 시간 절약, 메모리 절약)
  1. Copy-on-Write가 발생하지 않았을 때

  2. Copy-on-Write가 발생했을 때

결과적으로 Copy-on-Write의 기본적인 매커니즘은 동일합니다.
자원에 쓰기(Write)작업이 발생했을 때 복사 진행❗️이라는 것이 말이죠.
그리고 사용하는 이유는 메모리의 효율을 극대화시키기였습니다.

🌐 Reference Site

Swift) COW (Copy-on-Write) - 개발자 소들이 - 티스토리
[Swift] COW(Copy On Write) - 메모리 절약 방법 - Structure 응용편, OS응용편
[컴퓨터 공학 기초 강의] 40강. 페이징의 이점과 계층적 페이징

profile
🧑🏼‍💻 iOS developer

0개의 댓글