fork()와 vfork()의 차이점에 대해 더 알고 싶습니다. 매뉴얼 페이지를 잘 이해할 수 없습니다.
또한 동료 중 한 사람이 한 논평을 명확히 하고 싶습니다."현재 Linux에는 vfork()가 없습니다. 호출하더라도 내부적으로는 fork()를 호출하게 됩니다.".
답변1
매뉴얼 페이지는 일반적으로 간결한 참조 문서입니다.위키피디아개념에 대한 설명을 찾기에 더 좋은 곳입니다.
Fork는 프로세스를 복사합니다. 즉, 상위 프로세스와 거의 동일한 하위 프로세스를 생성합니다(가장 분명한 차이점은 새 프로세스의 프로세스 ID가 다르다는 점입니다). 특히, 포크는 (개념적으로) 상위 프로세스의 모든 메모리를 복사해야 합니다.
이것은 꽤 비용이 많이 들기 때문에 복사가 필요하지 않은 일반적인 특수한 경우를 처리하기 위해 vfork가 발명되었습니다. 일반적으로 자식 프로세스가 가장 먼저 하는 일은 새 프로그램 이미지를 로드하는 것이므로 다음과 같은 일이 발생합니다.
if (fork()) {
# parent process …
} else {
# child process (with a new copy of the process memory)
execve("/bin/sh", …); # discard the process memory
}
이 execve
호출은 새 실행 프로그램을 로드하고 프로세스의 코드와 데이터 저장소를 새 실행 파일의 코드와 새 데이터 저장소로 바꿉니다. 따라서 생성된 전체 메모리 복사본이 fork
낭비됩니다.
그게 다야vfork
전화기가 발명되었습니다. 메모리를 복사하지 않습니다. 매우 vfork
저렴하지만 자식 프로세스에 있는 모든 프로세스의 스택이나 힙 공간에 액세스하지 않도록 해야 하기 때문에 사용하기 어렵습니다. 부모 프로세스가 여전히 실행 중이기 때문에 읽는 것조차 문제가 될 수 있습니다. 예를 들어, 다음 코드는 깨졌습니다(자식 또는 부모가 타임슬라이스를 먼저 받는지에 따라 작동할 수도 있고 작동하지 않을 수도 있습니다).
if (vfork()) {
# parent process
cmd = NULL; # modify the only copy of cmd
} else {
# child process
execve("/bin/sh", "sh", "-c", cmd, (char*)NULL); # read the only copy of cmd
}
vfork가 발명된 이후 더 나은 최적화가 개발되었습니다. Linux를 포함한 대부분의 최신 시스템은 양식을 사용합니다.쓰기 중 복사, 여기서 프로세스 메모리의 페이지는 호출될 때 복사되지 않고 fork
대신 상위 또는 하위가 페이지에 처음 쓸 때 복사됩니다. 즉, 각 페이지는 처음에 공유되고 쓰기 프로세스가 동일한 가상 주소를 가진 새로운 물리적 페이지를 얻을 때까지 공유된 상태로 유지됩니다. 쓰기 중 복사는 가능한 fork
경우 복사본이 만들어지지 않기 때문에 vfork를 거의 쓸모 없게 만듭니다.vfork
Linux는 vfork를 유지합니다. 시스템 fork
호출은 실제 메모리를 복사하지 않더라도 프로세스의 가상 메모리 테이블을 복사해야 합니다 vfork
. 대부분의 응용 프로그램에서 성능 향상은 무시할 수 있습니다.
답변2
fork()
시스템 호출과는 vfork()
다릅니다 .
시스템 fork()
호출은 독립 메모리를 가진 두 개의 동일한 프로세스를 생성합니다. 시스템 vfork()
호출은 동일한 메모리를 공유하는 두 개의 프로세스를 생성합니다.
상위 프로세스는 vfork()
하위 프로세스가 종료될 때까지 기다립니다. 부모는 프로그램이 공유하는 변수를 상속받습니다. 따라서 자식 프로세스가 호출된 후에도 자식 프로세스 내에서 수정된 모든 변수는 여전히 부모 프로세스 내에서 수정됩니다.
자세한 내용을 보려면 클릭하세요.여기