🏷️Copy on Write
📌fork
- 쓸 때 복사한다는 뜻이다.
- fork system call은 부모 프로세스의 메모리를 자식 프로세스에 전부 복사하지 않는다.
- page table만 복사한다.
- page table이 같기 때문에, 실제로 두 프로세스는 물리 메모리를 공유하고 있는 상태다.
- page table entry에 쓰기 권한을 나타내는 필드가 존재하는데, 이 필드에 invalid표시를 한다.
- 이 후, 페이지를 read하기만 한다면, 양쪽 프로세스 모두 공유된 물리 페이지에 접근하여 읽을 수 있다.
- 그러다가 부모나 자식 프로세스가 어떤 페이지에 write하려고 하면, 다음과 같은 흐름으로 메모리 공유를 해제한다.
- 페이지에 write를 허용하지 않기 때문에, write하려고 하면 cpu에 page fault가 발생한다.
- page fault handler가 호출되고, handler는 접근한 페이지를 그제야 다른 장소에 복사하고 write하려고 한 프로세스에 할당한다.
- 양쪽 page table에 공유가 해제된 페이지에 대응하는 entry를 업데이트 한다.
- write를 한 프로세스 쪽 entry에 새롭게 할당된 물리 페이지를 매핑하고 write 권한을 허가한다.
- 이 페이지는 메모리 공유가 해제됐으므로, 다른 쪽 프로세스의 엔트리에도 write 권한을 부여한다.
- fork 시스템 콜을 호출 할 때 복사가 되는 것이 아니라, 실제로 write를 할 때서야 비로소 물리 메모리를 복사하기 때문에 이 방식을 CoW라고 부른다.
📌File System
- 파일 시스템 깨짐을 방지하기 위해 사용되는 매커니즘이다.
- 일단 어떤 파일을 write할 때, 새로운 공간에 그 파일의 내용을 복사를 한다.
- 그리고 그 복사한 새로운 공간에서 작업을 한 후, 링크 작업같은 것을 한다.
- 그리고 기존의 파일은 삭제한다.