아래 비교 차트의 도움으로 fork ()와 vfork () 사이의 차이점을 찾아 보겠습니다.
비교 차트
비교의 근거 | 포크() | vfork () |
---|---|---|
기본 | 하위 프로세스와 상위 프로세스에는 별도의 주소 공간이 있습니다. | 하위 프로세스와 상위 프로세스는 동일한 주소 공간을 공유합니다. |
실행 | 부모와 자식 프로세스가 동시에 실행됩니다. | 부모 프로세스는 자식 프로세스가 실행을 완료 할 때까지 일시 중단 상태를 유지합니다. |
가감 | 자식 프로세스가 주소 공간의 페이지를 변경하면 주소 공간이 별도이므로 부모 프로세스에서는 보이지 않습니다. | 하위 프로세스가 주소 공간의 페이지를 변경하면 동일한 주소 공간을 공유하기 때문에 상위 프로세스에서 볼 수 있습니다. |
복사하여 복사 | fork ()는 부모와 자식이 공유 페이지를 수정할 때까지 부모와 자식이 같은 페이지를 공유하는 대안으로 copy-on-write를 사용합니다. | vfork ()는 copy-on-write를 사용하지 않습니다. |
fork () 정의
fork () 는 새로운 프로세스 를 생성하기 위해 사용되는 시스템 호출입니다. fork () 호출로 작성된 새 프로세스는 fork () 시스템 호출을 호출 한 프로세스의 하위 프로세스입니다. 하위 프로세스의 코드는 상위 프로세스의 코드와 동일합니다. 자식 프로세스를 생성 한 후에 부모 프로세스와 자식 프로세스는 모두 fork () 후에 다음 명령문에서 실행을 시작하고 두 프로세스가 동시에 실행됩니다.
부모 프로세스와 자식 프로세스는 별도의 주소 공간을 가지고 있습니다. 따라서 프로세스 중 하나가 코드의 명령문이나 변수를 수정하는 경우. 다른 프로세스 코드에는 반영되지 않습니다. 자식 프로세스가 부모 프로세스에 영향을 미치지 않는 코드를 수정한다고 가정 해 봅시다.
생성 된 자식 프로세스는 즉시 exec ()를 호출합니다. exec () 시스템 호출 은 프로세스 를 해당 매개 변수에 지정된 프로그램으로 바꿉니다 . 그런 다음 하위 프로세스의 개별 주소 공간은 아무 소용이 없습니다. 여기서 한 가지 대안은 copy-on-write입니다.
copy-on-write 는 상위 프로세스와 하위 프로세스가 동일한 주소 공간을 공유하도록합니다. 임의의 프로세스가 주소 공간의 페이지에 쓰는 경우 프로세스가 독립적으로 작동 할 수 있도록 주소 공간의 사본이 작성됩니다.
vfork ()의 정의
fork ()의 수정 된 버전은 vfork ()입니다. vfork () 시스템 호출은 새 프로세스를 만드는데도 사용됩니다. fork ()와 비슷하게 여기에 생성 된 새 프로세스는 vfork ()를 호출 한 프로세스의 자식 프로세스입니다. 하위 프로세스 코드는 상위 프로세스 코드와 동일합니다. 여기서 자식 프로세스 는 두 프로세스가 동일한 주소 공간을 공유하므로 실행이 완료 될 때까지 상위 프로세스 의 실행 을 일시 중단합니다 .
자식 프로세스와 부모 프로세스는 동일한 주소 공간을 공유합니다. 프로세스 중 하나라도 코드를 수정하면 동일한 페이지를 공유하는 다른 프로세스에서 코드를 볼 수 있습니다. 부모 프로세스가 코드를 변경한다고 가정 해 봅시다. 그것은 자식 프로세스의 코드에 반영됩니다.
vfork ()를 사용하면 자식 프로세스와 부모 프로세스에 대해 별도의 주소 공간을 만들지 않습니다. 따라서 자식 프로세스가 생성 된 직후 exec ()를 호출 하는 곳에서 구현 되어야합니다. 따라서 주소 공간의 낭비가 없으며 프로세스를 만드는 효율적인 방법입니다. vfork는 copy-on-write를 사용하지 않습니다.
fork ()와 vfork () 사이의 주요 차이점
- fork와 vfork의 주된 차이점은 fork에 의해 생성 된 자식 프로세스가 부모 프로세스와는 별도의 메모리 공간 을 가지고 있다는 것입니다. 그러나 vfork 시스템 호출로 작성된 하위 프로세스는 상위 프로세스 와 동일한 주소 공간 을 공유합니다.
- fork를 사용하여 생성 된 하위 프로세스는 상위 프로세스와 동시에 실행 됩니다. 반면, vfork를 이용하여 생성 된 자식 프로세스는 실행이 완료 될 때까지 부모 프로세스의 실행을 일시 중단 합니다.
- 부모와 자식 프로세스의 메모리 공간이 다른 프로세스에 의해 수행 된 별도의 수정이므로 다른 페이지에도 영향을 미치지 않습니다. 그러나 부모 및 자식 프로세스 공유가 동일한 프로세스에 의해 수행 된 메모리 주소 수정은 주소 공간에 반영됩니다.
- 시스템 호출 fork ()는 대안으로 copy-on-write 를 사용하여 child와 parent 프로세스가 페이지를 수정하기 전까지 동일한 주소 공간을 공유하게합니다. 반면에 vfork는 copy-on-write를 사용하지 않습니다.
결론:
자식 프로세스가 fork ()를 사용하여 생성 한 직후 exec ()를 호출하면 vfork () 시스템 호출을 구현해야합니다. 자식 프로세스와 부모 프로세스를위한 별도의 주소 공간은 여기서 사용되지 않습니다.