포크()와 vfork()의 차이점은 무엇입니까?
와의 차이점은 무엇입니까? 그것은vfork()
와 같이 돌아오다.fork()
.
의 .vfork
때 전체 를 복사하는 이었습니다.exec*
어린 시절에왜냐면exec*
하위 프로세스의 전체 이미지를 대체하므로 상위 프로세스의 이미지를 복사할 필요가 없습니다.
if ((pid = vfork()) == 0) {
execl(..., NULL); /* after a successful execl the parent should be resumed */
_exit(127); /* terminate the child in case execl fails */
}
다른종류용도는로의,는,vfork
위험하고 예측할 수 없습니다.
리눅스를 에서는 리눅스의 .vfork
길 때문에 사라졌습니다.fork
구현됩니다.전체 이미지를 복사하는 것보다.fork
실행되며, 쓰기 시 복사 기술이 사용됩니다.
언급한 와 같이, 미언이듯했급이,이듯,vfork
맨 페이지는 차이점에 대해 명확합니다.이 항목에서는 다음에 대해 잘 설명합니다.fork
,vfork
,clone
그리고.exec
.
다음은 간과되는 몇 가지 차이점입니다.fork
그리고.vfork
Linux 2.6.3x 임베디드 시스템에서 작업한 적이 있습니다.
하더라도, 쓰기시 사용라도더하기을술복사,도▁even라,fork
메모리가 부족하여 상위 프로세스에서 사용하는 메모리를 복제할 수 없는 경우 실패합니다.를 들어, 프로세스가 상주 되는 메모리)를하는 경우, 예들상, 를프스즉의, 메세가어 2GB는를메 (모, 리되용사우경는않사리고지하모할용당되), 주상위로를▁thatgb▁for즉메모리▁(,경우),fork
남은 사용 가능한 메모리가 2GB 미만인 경우 실패합니다.당신이 단지 당신이 원할 때 좌절감을 느낍니다.exec
간단한 프로그램이기 때문에 부모 주소 공간이 크게 필요하지 않습니다!
vfork
에서는 부모 주소 공간이 중복되지 않으므로 이 메모리 문제가 없습니다.자식 프로세스는 호출할 수 있는 스레드와 더 유사합니다.exec*
또는_exit
부모님의 과정을 해치지 않고 말입니다.
되지 않기 에, 메리페테중않지기때문에복되,vfork
훨씬빠다보다 훨씬 .fork
그리고.vfork
의 실행 시간은 다음과 같이 상위 프로세스가 사용하는 메모리 양에 영향을 받지 않습니다. http://blog.famzah.net/2009/11/20/fork-gets-slower-as-parent-process-use-more-memory/
성능이 중요하거나 메모리가 제한된 상황에서는vfork
+exec*
따라서 에 대한 좋은 대안이 될 수 있습니다.fork
+exec*
문제는 그것이 덜 안전하다는 것이고 맨 페이지는 말합니다.vfork
앞으로 더 이상 사용되지 않을 가능성이 높습니다.
보다 안전하고 휴대성이 뛰어난 솔루션은 다음과 같습니다.posix_spawn
기능은 더 높은 수준이고 더 많은 옵션을 제공합니다.안전하게 사용할 수 있습니다.vfork
전달하는 옵션에 따라 가능한 경우.는 나는사수있다니습었할용다니를 사용할 수 있었습니다.posix_spawn
성적으그 이그를는짜중 "메확문인제리 "모공니극다 "라는 검사 합니다.fork
+exec
나에게 주는 것이었습니다.
내 남자 페이지에서
(POSIX.1에서) vfork() 함수는 fork(2)에서 생성된 프로세스가 vfork()에서 반환 값을 저장하는 데 사용된 pid_t 유형이 아닌 다른 데이터를 수정하거나 vfork()가 호출된 함수에서 반환하는 경우 동작이 정의되지 않는다는 점을 제외하고는 fork(2) 함수와 동일한 효과를 갖습니다.또는 _exec(2) 또는 exec(3) 함수 계열 중 하나를 호출하기 전에 다른 함수를 호출합니다.
vfork()는 자식이 종료될 때까지(일반적으로 _fork(2)를 호출하거나, 비정상적으로 치명적인 신호를 전달한 후) 부모가 중단되거나, 실행(2)을 위한 호출을 한다는 점에서 포크(2)와 다릅니다.이 시점까지 자식은 스택을 포함한 모든 메모리를 부모와 공유합니다.아이는 현재 함수에서 복귀하거나 exit(3)을 호출할 수 없지만 _exit(2)를 호출할 수 있습니다.
일부 시스템에는 vfork()라는 시스템이 있습니다. vfork()는 원래 fork()의 하위 오버헤드 버전으로 설계되었습니다.fork()는 프로세스의 전체 주소 공간을 복사하는 작업을 포함하기 때문에 비용이 많이 들기 때문에 vfork() 기능이 3.0BSD에 도입되었습니다.
그러나 vfork()가 도입된 이후, fork()의 구현은 크게 개선되었으며, 특히 'copy-on-write'의 도입으로 인해, 프로세스 주소 공간의 복사가 두 프로세스 중 하나가 수정할 때까지 동일한 물리적 메모리를 참조할 수 있도록 하여 투명하게 위조됩니다.이는 vfork()에 대한 정당성을 크게 제거합니다. 실제로 시스템의 많은 부분에서 vfork()의 원래 기능이 완전히 결여되어 있습니다.그러나 호환성을 위해 모든 vfork() 의미론을 에뮬레이트하지 않고 단순히 fork()를 호출하는 vfork() 호출이 존재할 수 있습니다.
따라서 포크()와 vfork()의 차이를 실제로 사용하는 것은 매우 현명하지 않습니다.실제로, 원하는 이유를 정확히 알지 못하는 한 vfork()를 사용하는 것은 현명하지 않을 수 있습니다.
둘 사이의 기본적인 차이점은 vfork()를 사용하여 새 프로세스를 생성하면 부모 프로세스가 일시적으로 일시 중단되고 자식 프로세스가 부모의 주소 공간을 빌릴 수 있다는 것입니다.이 이상한 상태는 자식 프로세스가 종료되거나 execve()를 호출할 때까지 계속되며, 이때 부모 프로세스가 계속됩니다.
즉, vfork()의 하위 프로세스는 상위 프로세스의 변수를 예기치 않게 수정하지 않도록 주의해야 합니다.특히 자식 프로세스는 vfork() 호출을 포함하는 함수에서 반환되어서는 안 되며 exit()을 호출해서는 안 됩니다(종료해야 하는 경우 _exit()을 사용해야 합니다. 실제로는 일반 포크의 자식 프로세스도 마찬가지입니다.
일부 시스템에서는 vfork()가 fork()와 동일합니다.vfork() 함수는 하위 프로세스가 호출 프로세스(상위 프로세스)와 코드 및 데이터를 공유할 수 있다는 점에서만 포크()와 다릅니다.
로 새로운 프로세스가 생성될 때입니다.vfork()
부모 프로세스가 일시 중단되고 자식 프로세스가 부모의 주소 공간을 빌릴 수 있습니다. 과정이 종료될 됩니다.execve()
상위 프로세스가 계속되는 시점입니다.
은 이은아과의 합니다.vfork()
에서는 상위 공정의 변수를 예기치 않게 수정하지 않도록 주의해야 합니다.특히 하위 프로세스는 다음을 포함하는 함수에서 반환되지 않아야 합니다.vfork()
전화를 걸면 전화를 걸면 안 됩니다.exit()
(종료할 필요가 있는 경우 다음을 사용해야 합니다._exit();
사실, 이것은 정상인의 아이에게도 해당됩니다.fork()
).
하만지 이후로, 그이로.vfork()
도입, 현구의 fork()
특히 프로세스 주소 공간의 복사가 두 프로세스 중 하나가 수정할 때까지 동일한 물리적 메모리를 참조할 수 있도록 하여 투명하게 위조되는 '쓰기 시 복사'의 도입으로 대폭 개선되었습니다.이로 인해 의 정당성이 크게 제거됩니다.vfork();
실제로, 시스템의 많은 부분은 현재 원래 기능이 부족합니다.vfork()
을 위해서는 도 하만호위해, 히존수있다니가 수 있습니다.vfork()
present, call present를 호출하는 것, 그은단순호출합니다히것▁call다니,호▁present출.fork()
모든 것을 모방하려고 시도하지 않고.vfork()
semantic
결과적으로, 사이의 차이를 실제로 사용하는 것은 매우 현명하지 않습니다.fork()
그리고.vfork()
실제로, 그것을 사용하는 것은 아마도 현명하지 않을 것입니다.vfork()
당신이 원하는 이유를 정확히 알지 못하는 한 말입니다.
언급URL : https://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork-and-vfork
'source' 카테고리의 다른 글
'Invoke-Sqlcmd'이(가) cmdlet의 이름으로 인식되지 않습니다. (0) | 2023.08.26 |
---|---|
Javascript에서 MVC의 모델 속성 액세스 (0) | 2023.08.26 |
src 원본 이미지를 찾을 수 없을 때 "이미지를 찾을 수 없음" 아이콘을 자동으로 숨기는 방법 (0) | 2023.08.26 |
스크립트를 입력합니다.FormGroupFormArray - 값별로 요소 객체를 하나만 제거합니다.앵귤러 24 (0) | 2023.08.26 |
MySQL--필드 목록의 알 수 없는 열 (0) | 2023.08.26 |