Clone 과 fork 호출의 차이점과 연결
Linux 에서는 fork, vfork, clone 의 세 가지 프로세스 생성 방법을 주로 제공합니다.
문제
Linux 소스 코드에서 이 세 호출의 실행 프로세스는 fork (), vfork (), clone () 을 실행할 때 시스템 호출 테이블을 통해 sys_fork (), sys_vfork (), sys _ vfork (), sys 에 매핑되는 것입니다
Fork
Fork 가 프로세스를 작성할 때 하위 프로세스는 상위 프로세스의 리소스만 완전히 복사하고, 복사된 하위 프로세스는 고유한 task_struct 구조와 PID 를 가지지만 상위 프로세스의 다른 모든 리소스는 복사합니다. 예를 들어 상위 프로세스에서 5 개의 파일을 열면 하위 프로세스에도 5 개의 열린 파일이 있으며 이러한 파일의 현재 읽기 및 쓰기 포인터도 같은 위치에 정지됩니다. 그래서 이 단계에서 하는 일은 복제입니다. 이렇게 생성된 하위 프로세스는 상위 프로세스와 독립적이며 동시성이 좋지만, pipe, * * * 메모리와 같은 특수 통신 메커니즘을 통해 fork 를 통해 하위 프로세스를 만들려면 위에서 설명한 각 리소스를 복제해야 합니다. 따라서 fork 는 비용이 많이 드는 시스템 호출입니다. 이러한 오버헤드가 모든 경우에 필요한 것은 아닙니다. 예를 들어, 어떤 프로세스인 fork 가 하위 프로세스를 낸 후 하위 프로세스는 exec 를 호출하여 다른 실행 파일을 실행하기 위한 것일 뿐입니다. 그러면 fork 프로세스 중 가상 공간 복사는 불필요한 프로세스가 될 것입니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), Northern Exec (미국 TV 드라마), 성공명언 하지만 현재 Linux 에서는 copy-on-write(COW-On-Write) 기술을 채택하고 있기 때문에 오버헤드를 줄이기 위해 fork 는 처음에는 실제로 두 개의 다른 복제본을 생성하지 않았습니다. 그 당시 대량의 데이터가 정확히 같았기 때문입니다. 쓰기 시 복제는 실제 데이터 복제본을 지연시키는 것입니다. 나중에 쓰기가 실제로 발생하면 parent 와 child 의 데이터가 일치하지 않아 복제 작업이 발생하고 각 프로세스가 자체 복사본을 받게 되므로 시스템 호출의 오버헤드를 줄일 수 있습니다. 그래서 글을 쓸 때 복제한 후, vfork 의 실현의 의미는 크지 않다.
Fork () 호출 실행은 한 번에 두 개의 값을 반환하고, 상위 프로세스의 경우 하위 프로그램의 프로세스 번호를 반환하고, 하위 프로그램의 경우 fork 함수는 0 을 반환합니다. 이는 한 함수가 두 번 반환하는 본질입니다.
Fork 이후 하위 프로세스와 상위 프로세스 모두 fork 호출 후 지시어를 계속 실행합니다. 하위 프로세스는 상위 프로세스의 복사본입니다. 상위 프로세스의 데이터 공간, 스택 및 스택 복사본을 가져옵니다. 이러한 복사본은 상위-하위 프로세스가 이 부분의 메모리를 즐기지 않습니다. 즉, 하위 프로세스가 상위 프로세스에서 같은 이름의 변수를 수정해도 상위 프로세스의 값에는 영향을 주지 않습니다. 그러나 부자과정은 또 * * * 무언가를 즐긴다. 간단히 말하면 프로그램의 본문 단락이다. 본문 세그먼트에는 CPU 가 실행하는 기계 명령 (일반적으로 read-only) 이 들어 있습니다.
Vfork
Vfork 시스템 호출은 fork 와 달리 vfork 로 생성된 하위 프로세스는 상위 프로세스 * * * 와 주소 공간을 공유합니다. 즉, 하위 프로세스는 상위 프로세스의 주소 공간에서 완전히 실행됩니다. 하위 프로세스가 변수를 수정하면 상위 프로세스에 영향을 줍니다.
따라서 위의 예제에서 vfork () 로 전환하면 A 를 두 번 인쇄하면 B 의 값이 같고 주소도 같습니다.
그러나 여기서 주목할 점은 vfork () 를 사용하여 만든 하위 프로세스는 exit () 호출을 표시하여 종료해야 한다는 것입니다. 그렇지 않으면 하위 프로세스가 끝나지 않고 fork () 는 그렇지 않습니다.
Vfork 는 상위 프로세스에서 하위 프로세스를 반환하는 프로세스 번호이며 하위 프로세스에서 0 을 반환합니다.
Vfork 를 사용하여 하위 프로세스를 작성하면 하위 프로세스가 exec(exec) 를 호출하고 새 실행 파일을 주소 공간에 로드하여 실행할 때까지 상위 프로세스가 차단됩니다. ) 또는 종료. Vfork 의 장점은 하위 프로세스가 생성된 후 exec 를 호출하여 다른 프로그램을 실행하는 경우가 많다는 것입니다. 이는 상위 프로세스의 주소 공간에 대한 참조가 없기 때문에 주소 공간의 복제가 불필요하기 때문에 vfork*** 를 통해 메모리를 공유하면 불필요한 오버헤드를 줄일 수 있기 때문입니다.
클론
시스템 호출 fork () 및 vfork () 는 매개 변수가 없는 반면 clone () 은 매개 변수가 있습니다. Fork () 는 전체 복제이고 vfork () 는 * * * 공유 메모리이고 clone () 은 상위 프로세스 리소스를 하위 프로세스에 선택적으로 복사할 수 있으며, 복제되지 않은 데이터 구조는 포인터 복사를 통해 하위 프로세스 * * * 를 즐길 수 있습니다 또한 clone () 은 하위 프로세스의 PID 를 반환합니다.