우리는 COW의 포스트포크 동작을 이해합니다(예: 설명된 대로).여기) 다음과 같이: 포크는 하위 프로세스에 대한 상위 프로세스의 페이지 테이블 복사본을 생성하고 물리적 페이지를 읽기 전용으로 표시하므로 두 프로세스 중 하나라도 쓰기를 시도하면 페이지 오류가 발생하고 페이지가 복사됩니다.
하위 프로세스가 실행된 후에는 어떻게 되나요? 우리는 부모 프로세스가 페이지 부재를 유발하지 않고 해당 페이지에 다시 쓸 수 있다고 가정했지만 이를 달성하는 방법에 대한 정확한 정보를 찾는 것이 어려웠습니다.
코드를 포함한 모든 조언을 환영합니다!
답변1
하위 프로세스가 실행되면 현재 페이지가 모두 새로운 실행 가능 이미지(힙, 스택 등 포함)에 해당하는 완전히 새로운 페이지 세트로 대체됩니다.
최신 운영 체제는 상위 프로세스와 하위 프로세스 간에 공유되는 물리적 페이지의 참조 횟수를 유지하여 CoW를 구현합니다. 페이지가 상위 프로세스와 하위 프로세스 간에 공유되는 경우 참조 횟수는 2가 됩니다. 하위 프로세스가 exec를 실행하면 공유 페이지의 참조 수가 감소하므로(예: 다시 1로 돌아가므로) 상위 프로세스의 모든 쓰기는 CoW 없이 성공합니다.
재미를 위해 포크를 수행한 다음 하위 프로세스가 몇 초 동안 휴면 상태를 유지한 다음 실행하고 실행하는 간단한 프로그램을 만듭니다. 이제 /proc/PID/smaps
분기 전(물론 상위 프로세스만 해당), 분기 후 exec 전, exec 후 두 프로세스의 내용을 관찰합니다. Shared_XXX 페이지와 해당 주소 범위를 확인하세요.
코드 측면에는 쓰기 중 복사를 지원하는 몇 가지 간단한 XV6 확장이 있습니다. 간단한 구글 검색만으로도 충분할 수 있습니다. 살펴볼 가치가 있는 또 다른 장소는 다음과 같습니다.https://github.com/torvalds/linux/blob/master/kernel/fork.c. 포크 입구부터 추적을 시작하고 재미있게 보내십시오.
Fork는 일단 익숙해지면 매우 간단하지만 메모리 관리는 번거로울 수 있습니다. "mm/memory.c": "copy_page_range()"를 참조하세요.