Copy-on-Write가 어떤 기능을 하는지 알아보자
Copy on Write는 기본적으로 forks 기능과 관련이 있다.
forks는 parent process를 이용해서 child process를 만들어 내는 것으로 볼 수 있다. (기본적으로 부모 프로세스를 복제함)
대부분의 자식 프로세스들은 이후에 exec을 이용해서 새로운 process로 Overwite한다.
그러면 부모로부터 복사해온 페이지들은 다 쓸모없는 것들이 되고 만다.
복사를 하고 바로 exec을 통해서 새로운 process를 만들어 낼 텐데 굳이 복사를 할 필요가 있는가? 라는 의문에 의해서 탄생한 것이 Copy on Write 라는 방법이다.
Copy on Write : parent process의 이미지를 child에 복사하지 않고 parent process가 가지고 있는 pysical memory의 주소를 공유하는 방식을 통해 child process를 사용하는 방법.
child process가 생성될 때, parent process의 page들을 read-only 상태로 바꿔준다
(read는 동시에 여러개가 가능하지만 write는 한 번에 하나만 가능하기 때문 -> write를 하려면 허가를 받고 해야함)
data가 실제로 공유된 page에 write될 때(여기서는 process1에서 pageC에 data를 write 한다고 가정)
protection fault가 발생한다(read-only page에 write 하려고 시도하므로)
자식 프로세스가 공유된 물리 메모리의 공간에 있는 데이터를 수정하는 등의 쓰기 작업을 할 때, OS는 새로운 physical memory 를 할당(copy of page C)하고, mapping table을 바꿔주는 작업을 한다.
즉, 공유한 페이지는 내용이 바뀌지 않을 때까지 공유하게되고, 내용이 불가피하게 바뀌게 되면 새로운 page를 할당해서 그 때 복사를 해준다. (복사를 최대한 뒤로 미루는 것, 복사 오버헤드 감소)
이제 하나의 page를 여러개의 process가 사용하게 되므로 각각의 physical page는 '몇 개의 process에 의해서 공유되고 있는지'를 나타내는 Reference counter가 필요하게 된다.
copyuvm 이 실행되면 parent process의 내용을 child process에게 모두 복사하는 작업을 한다.
(copy on write를 하기 위해서는 위 함수를 수정해야 한다)
첫 번째 if문의 d = setupkvm() : d라는 child process를 위한 page table에 page directory를 만들어 준다.
for loop의 i : 가상주소를 의미한다
if((mem = kalloc()) == 0) : 새로운 physical page 할당, mem은 새로 할당 받은 page의 가상 주소
memmove(mem, (char*)P2V(pa), PGSIZE) : pa를 가상주소로 바꾼 후 PGSIZE만큼 mem(child process의 가상주소)에 복사하는 작업
mappages(d, (void*)i, PGSIZE, V2P(mem), flags) : child process의 page table에 방금 만들었던 child process의 가상 주소의 page table entry를 생성한다.
'CS > OS' 카테고리의 다른 글
[운영체제] Locks #2 (0) | 2021.06.11 |
---|---|
[운영체제] Locks #1 (2) | 2021.06.11 |
[운영체제] Page Replacement Policy (페이지 교체 알고리즘) (0) | 2021.06.09 |
[운영체제] Swapping (가상 메모리) (0) | 2021.06.09 |
[XV-6 운영체제] Copy-on-Write #2 구현 (1) | 2021.06.04 |