자식 프로세스

자식 프로세스, 차일드 프로세스(child process), 하위 프로세스(subprocess)는 다른 프로세스(상위 프로세스)에 의해 생성된 프로세스이다. 이 기술은 멀티태스킹 운영체제와 관련이 있다.

하위 프로세스를 생성하는 데에는 두 가지 주요 절차가 있다. 즉, [[포크 시스템 호출(유닉스 계열 시스템 및 POSIX 표준에서 선호됨)과 spawn(마이크로소프트 윈도우의 최신(NT) 커널 및 일부 역사적 운영 체제에서 선호됨)이다.

역사 
하위 프로세스는 하위 작업을 도입한 IBM OS/360 운영 체제의 MFT-II(Fixed Number of Tasks Version II) 형식을 사용한 다중 프로그래밍의 이후 개정판의 초기 형식과 함께 1960년대 후반으로 거슬러 올라간다(태스크 문서 참고). 유닉스의 현재 형식은 멀틱스(1969)를 기반으로 하는 반면, 윈도우 NT 형식은 RSX-11(1972)의 OpenVMS(1978)를 기반으로 한다.

포크로 만든 차일드 프로세스 
하위 프로세스는 파일 설명자와 같은 대부분의 속성을 상위 프로세스로부터 상속받는다. 유닉스에서 하위 프로세스는 일반적으로 포크(fork) 시스템 호출을 사용하여 상위 프로세스의 복사본으로 생성된다. 그런 다음 하위 프로세스는 필요에 따라 exec를 사용하여 다른 프로그램과 오버레이될 수 있다.

각 프로세스는 많은 하위 프로세스를 생성할 수 있지만 최대 하나의 상위 프로세스를 갖는다. 프로세스에 상위 프로세스가 없으면 일반적으로 커널에서 직접 생성되었음을 나타낸다. 리눅스 기반 시스템을 포함한 일부 시스템에서는 첫 번째 프로세스(init)가 부팅 시 커널에 의해 시작되며 절대 종료되지 않는다(리눅스 시작 프로세스 문서 참고). 사용자 공간에서 다양한 데몬 작업을 수행하기 위해 다른 부모 없는 프로세스가 시작될 수 있다. 프로세스가 부모 없이 끝나는 또 다른 방법은 부모가 죽어 고아 프로세스를 떠나는 것이다. 그러나 이 경우 init에 의해 곧 입양이 된다.

SIGCHLD 신호는 하위 프로세스가 종료되거나, 중단되거나, 중단된 후 다시 시작될 때 하위 프로세스의 상위 프로세스로 전송된다. 기본적으로 신호는 단순히 무시된다.

수명 종료 
하위 프로세스가 종료되면 일부 정보가 상위 프로세스로 반환된다.

부모가 wait를 호출하기 전에 자식 프로세스가 종료되면 커널은 부모가 나중에 wait를 호출할 수 있도록 종료 상태와 같은 프로세스에 대한 일부 정보를 유지한다. 하위 프로세스가 여전히 시스템 리소스를 소비하지만 실행하지 않기 때문에 이를 좀비 프로세스라고 한다. 대기 시스템 호출은 일반적으로 SIGCHLD 핸들러에서 호출된다.

POSIX.1-2001에서는 SIGCHLD의 처리를 SIG_IGN으로 명시적으로 설정하여 종료되는 하위 프로세스를 커널이 자동으로 회수하도록 상위 프로세스를 선택할 수 있다. (무시가 기본값이지만 처리가 명시적으로 무시하도록 설정된 경우에만 자동 회수가 발생함). 아니면 SIGCHLD 신호에 대한 SA_NOCLDWAIT 플래그를 설정하여 가능하다. 리눅스 2.6 커널은 이 동작을 준수하며 FreeBSD는 버전 5.0부터 이 두 가지 방법을 모두 지원한다. 그러나 SIGCHLD 무시와 관련하여 시스템 V와 BSD 동작 간의 역사적 차이로 인해 wait 호출은 분기된 하위 프로세스 후 정리를 위한 가장 이식성 있는 패러다임으로 남아 있다.

같이 보기 
 pstree

외부 링크 
 

프로세스