fork ()의 ​​COW (복사시 복사)는 여러 개의 포크를 어떻게 처리합니까?


23

Wikipedia에 따르면 (잘못 될 수 있음)

fork () 시스템 호출이 발행되면, 상위 프로세스에 해당하는 모든 페이지의 사본이 작성되고 하위 프로세스의 OS에 의해 별도의 메모리 위치에로드됩니다. 그러나 특정 경우에는 필요하지 않습니다. 자식이 " exec"시스템 호출 (C 프로그램 내에서 실행 파일을 실행하는 데 사용됨)을 실행하거나을 종료 한 직후에 종료되는 경우를 고려하십시오 fork(). 자식 프로세스가 부모 프로세스에 대한 명령을 실행하기 만하면 부모 프로세스의 페이지 exec공간 을 복사 할 필요가 없습니다. 호출 한 프로세스의 주소 공간이 실행되는 명령으로 바뀝니다.

이러한 경우 COW (Copy-On-Write)라는 기술이 사용됩니다. 이 기술을 사용하면 분기가 발생할 때 상위 프로세스의 페이지가 하위 프로세스에 복사되지 않습니다. 대신, 페이지는 하위 프로세스와 상위 프로세스간에 공유됩니다. 프로세스 (부모 또는 자식)가 페이지를 수정할 때마다 수정을 수행 한 해당 프로세스 (부모 또는 자식)에 대해 특정 페이지 만 별도의 복사본이 만들어집니다. 이 프로세스는 이후의 모든 참조에서 공유 된 페이지 대신 새로 복사 된 페이지를 사용합니다. 다른 프로세스 (공유 페이지를 수정하지 않은 프로세스)는 계속 페이지의 원본을 계속 사용합니다 (이제 더 이상 공유되지 않음). 일부 프로세스가 페이지를 쓸 때 페이지가 복사되므로이 기법을 쓰기시 복사라고합니다.

프로세스 중 하나가 페이지에 쓰려고 할 때 페이지의 새 사본이 페이지 결함을 생성 한 프로세스에 할당되고 할당 된 것으로 보입니다. 원본 페이지는 나중에 쓰기 가능으로 표시됩니다.

내 질문은 : fork()프로세스가 공유 페이지에 쓰려고 시도하기 전에 여러 번 호출되면 어떻게됩니까 ?


이 경우 Wikipedia는 더 높은 수준입니다.
Didi Kohen

1
예, 기록 중 복사가 게으른 복사입니다. 자식 프로세스는 페이지를 쓰려고 할 때 페이지를 복사합니다. 따라서 기본적으로 포크 후에 거의 어린이의 기억이 부모와 공유됩니다. 그러나 프로세스를 만들기 전에 모든 자식 프로세스에는 여전히 부모 또는 새로운 할당에서 수정 된 일부 개인 메모리가 있습니다. 이는 아무런 조치 없이도 분기 된 하위 프로세스에 일부 개인 메모리가 있음을 의미합니다. pmap -XX PID또는로 확인할 수 있습니다 cat /proc/PID/smap.
where 23

"원본 페이지는 나중에 쓰기 가능으로 표시됩니다."와 관련하여 누가 소유합니까? 여기에 쓰지 않은 다른 프로세스가 있습니까?
Adil

사랑 스럽습니다. 유치원에서 이것을 가르치기 시작합니다
ed22

답변:


18

특별한 일은 없습니다. 모든 프로세스는 동일한 페이지 세트를 공유하고 있으며 각 페이지는 페이지를 수정하려고 할 때 고유 한 개인 사본을받습니다.


권리. 요점은 특별한 하위 프로세스이며 공유 페이지에 쓰려고하면 복사 작업이 필요하다는 것입니다. 변경 사항이 올바르게 수행되면 부모 나 다른 자녀 모두 변경에 대해 알 필요가 없습니다.
Charles Stewart

9
자식 프로세스는 그렇게 특별하지 않습니다. 자식 프로세스와 부모 프로세스 모두 포크 후에 읽기 전용 페이지가 동일합니다. 이러한 페이지에 관한 한 페이지 처리는 대칭입니다.
jlliagre

3

fork ()의 ​​동작은 * nix 시스템에 MMU가 있는지 여부에 따라 다릅니다. 초기 PDP-11과 같은 비 MMU 시스템에서 fork () 시스템 호출은 각 자식에 대한 부모의 모든 메모리를 복사했습니다. MMU 기반 * nix 시스템에서 커널은 스택이 아닌 모든 페이지를 R / O로 표시하고 부모와 자식간에 공유합니다. 그런 다음 두 프로세스 중 하나가 페이지에 쓰면 MMU가 시도를 트랩하면 커널은 쓰기 가능한 페이지를 할당하고 현재 쓰기 가능한 페이지를 가리 키도록 MMU 페이지 테이블을 업데이트합니다. 이 Copy-on-Write 동작은 초기에 각 하위 프로세스마다 개인 스택 만 할당 및 복제하기 때문에 속도가 향상됩니다.

각 fork () 호출 사이에 일부 상위 코드를 실행하면 결과 하위 프로세스는 상위 프로세스가 변경 한 페이지에 따라 달라집니다. 반면에, 부모가 단순히 여러 개의 fork () 호출을 루프처럼 발행하면 자식 프로세스는 거의 동일합니다. 로컬 루프 변수가 사용되면 각 하위 스택 내에서 달라집니다.


0

시스템이 포크를 수행 할 때 (보통 구현에 따라 다름) 페이지를 읽기 전용으로 표시하고 상위 프로세스를이 페이지의 마스터로 표시합니다.
이러한 페이지에 쓰려고 할 때 페이지 오류가 발생하고 OS가 대신하여 전체 페이지 목록 또는 변경된 페이지를 복사 (구현에 따라 다름)하므로 쓰기 프로세스에는 쓰기 가능한 사본이 있습니다.
동일한 프로세스에서 분기 된 여러 프로세스가있는 경우 "마스터"프로세스가 메모리에 쓸 때 다른 프로세스는 동등한 페이지를 복사합니다.


어떤 시스템이이 작업을 수행합니까? 리눅스는 copy-on-write 구현을 사용합니다
brauliobo

이것이 바로 기록 중 복사 방식입니다.
Didi Kohen

3
@DavidKohen 그것은 내가 들어 본 어떤 버전에서도 copy-on-write가 작동하는 방식이 아닙니다. "마스터"프로세스는 없습니다. 경우 어떤 하나의 프로세스가 공유 페이지를 쓰는 다른 모든 프로세스가 공유를 계속하면서, 그 사본은 개인 하나에 충돌됩니다.
Celada

1
데이비드 코헨 (David Kohen)이 어느 시점에 맞다고 생각합니다. 이것은 기록 복사를 구현하는 한 가지 방법입니다. 요점은이 표시를 사용하여 해당 페이지에 쓰면 페이지 결함 처리기를 트리거하여 적절한 조치 (예 : 쓰기 중 복사)를 수행하는 것입니다. 불행히도이 세부 사항 (시스템에 따라 다름)은 대부분 질문과 관련이 없습니다. CoW에는 두 가지 차원이 있습니다. 하나는 프로세스에서 볼 수있는 것과 다른 하나는 커널이이를 구현할 수있는 것입니다.
0xC0000022L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.