태그 보관물: process-management

process-management

기본 프로세스 생성 메커니즘이 포크 인 이유는 무엇입니까? 공간 (텍스트 세그먼트 포함)을

프로세스 작성을위한 UNIX 시스템 호출 인 fork ()는 상위 프로세스를 복사하여 하위 프로세스를 작성합니다. 내 이해는 거의 항상 자식 프로세스의 메모리 공간 (텍스트 세그먼트 포함)을 대체하기 위해 exec ()를 호출한다는 것입니다. fork ()에서 부모의 메모리 공간을 복사하는 것은 항상 낭비 적 인 것처럼 보입니다 (메모리 세그먼트를 복사 할 때 복사하여 포인터 만 복사하면 낭비를 최소화 할 수 있음을 알지만). 어쨌든 프로세스 복제에 왜이 복제 방식이 필요한지 아는 사람이 있습니까?



답변

인터페이스를 단순화하는 것입니다. 에 대한 대안 fork과는 exec윈도우 같은 것 의 CreateProcess 기능. 얼마나 많은 매개 변수 CreateProcess가 있고 많은 매개 변수 가있는 구조체입니다. 때문입니다 모든 새 과정에 대해 제어 할 수있는가에 전달되어야한다 CreateProcess. 실제로 CreateProcess충분한 매개 변수가 없으므로 Microsoft는 CreateProcessAsUserCreateProcessWithLogonW 를 추가해야했습니다 .

fork/exec모델을 사용하면 모든 매개 변수가 필요하지 않습니다. 대신 프로세스의 특정 속성이에 유지 exec됩니다. 이것은 당신이 할 수 있습니다 fork, 다음 (일반적으로 사용하는 것과 동일한 기능을 사용하여) 당신이 원하는 속성을 어떤 과정을 변경 한 exec . Linux에서는 fork매개 변수 execve가 없으며 3 : 실행할 프로그램, 명령 줄 및 환경이 있습니다. (다른 exec기능이 있지만 execve일반적인 사용 사례를 단순화하기 위해 C 라이브러리에서 제공하는 래퍼 입니다.)

다른 현재 디렉토리와 프로세스를 시작하려면 : fork, chdir, exec.

stdin / stdout :을 ​​리디렉션하려면 fork파일을 닫거나 엽니 다 exec.

당신은 스위치 사용자가 원하는 경우 fork, setuid, exec.

이 모든 것을 필요에 따라 결합 할 수 있습니다. 누군가가 프로세스 속성의 새로운 종류와 함께 온다면, 당신은 변경할 필요가 없습니다 forkexec.

Larsk가 언급했듯이 대부분의 최신 Unix는 COW (Copy-On-Write)를 사용하므로 fork상당한 오버 헤드가 발생하지 않습니다.


답변

cjm의 답변과 함께 Single Unix Specification은이라는 함수를 정의합니다 vfork(). exec familly 함수를 호출하거나을 호출하는 것 이외의 다른 작업을 수행하는 경우 분기 된 프로세스에 정의되지 않은 동작이 있다는 점을 제외하면 해당 함수는 포크와 같이 작동합니다 _exit().

따라서 정의 된 동작에 대한 유일한 사용은 다음과 같습니다.

pid_t ret = vfork();
if(ret == 0)
{
    exec(...);
    _exit(EXIT_FAILURE); //in case exec failed for any reason.
}

그래서 무엇을 vfork합니까? 그것은 싸다 fork. 기록 중 복사가없는 구현에서는 결과 프로세스가 원래 프로세스와 메모리 공간을 공유하므로 정의되지 않은 동작이 발생합니다. 기록 중 복사 구현이 빠르기 때문에 기록 중 복사를 사용한 구현 vfork에서는와 동일 할 수 있습니다 fork().

새로운 프로세스를 직접 생성 할 수 있는 선택적 posix_spawn기능 (및 posix_spawnp기능)도 있습니다. (라이브러리 호출을 이용하여 이들을 구현하는 것도 허용된다 fork하고 exec, 및 구현 예들이 제공된다.)


답변