부모 프로세스

Parent process

컴퓨팅에서 부모 프로세스는 하나 이상의 자식 프로세스를 생성한 프로세스입니다.

Unix 계열 시스템

Unix같은 운영체제시스템에서는 다른 프로세스가 fork() 시스템콜을 실행할 때 프로세스 0(스왑퍼)을 제외한 모든 프로세스가 생성됩니다.포크를 호출한 프로세스가 상위 프로세스이고 새로 생성된 프로세스가 하위 프로세스입니다.모든 프로세스(프로세스 0 제외)에는 하나의 상위 프로세스가 있지만 여러 하위 프로세스가 있을 수 있습니다.

운영 체제 커널은 각 프로세스를 프로세스 식별자로 식별합니다.프로세스 0은 시스템 부팅 시 생성되는 특수한 프로세스입니다.자녀 프로세스(프로세스 1)를 포킹한 후 프로세스 0이 스와퍼 프로세스('아이돌 태스크'라고도 함)가 됩니다.프로세스 1은 다음과 같습니다)init은 시스템 [1]내의 다른 모든 프로세스의 조상입니다.

리눅스

Linux 커널에서는 프로세스와 POSIX 스레드의 차이가 거의 없습니다.실제 부모 프로세스와 부모 프로세스의 2종류가 있습니다.부모란 자녀의 종료 SIGCHLD 신호를 수신하는 프로세스이며, 실제 부모는 멀티스레드 환경에서 실제로 이 자식 프로세스를 작성한 스레드입니다.일반 프로세스에서는 이 두 값이 동일하지만 프로세스로 동작하는 POSIX 스레드에서는 이 두 값이 [2]다를 수 있습니다.

좀비 프로세스

운영체제는 모든 프로세스를 프로세스 식별자(일반적으로 "pid"라고 함)로 기능에 필요한 데이터에 연관짓는 테이블을 유지합니다.프로세스의 수명 동안 이러한 데이터에는 프로세스에 지정된 메모리 세그먼트, 프로세스에 호출된 인수, 환경 변수, 리소스 사용에 대한 카운터, 사용자 ID, 그룹 ID 및 그룹 집합 및 기타 유형의 정보가 포함될 수 있습니다.

프로세스가 (암묵적으로 메인함수에서 리턴 명령어를 실행함으로써) 종료되거나 갑자기 종료되는 신호를 수신함으로써 프로세스가 종료되면 운영시스템은 프로세스와 관련된 자원과 정보의 대부분을 해방하지만 자원 사용률 및 자원 사용률에 관한 데이터는 그대로 유지합니다.종료 상태 코드. 부모 프로세스가 (종료 상태 코드를 디코딩하는 표준 함수를 사용하여) 자녀가 성공적으로 실행되었는지 여부와 실행 중에 소비된 시스템 리소스의 양을 알고 싶어할 수 있기 때문입니다.

디폴트로는 시스템은 부모 프로세스가 실제로 자녀의 종료 시에 그러한 정보에 관심이 있다고 가정하고, 따라서 부모에게 신호 SIGCHLD를 송신하여 수집해야 할 자녀에 관한 데이터가 있음을 경고한다.이러한 수집은 wait 패밀리의 함수(waitpid, waitid, wait4)를 호출함으로써 이루어집니다.이 수집이 이루어지면 시스템은 자 프로세스에 대한 마지막 정보를 공개하고 프로세스 테이블에서 해당 pid를 삭제합니다.그러나 상위 프로세스가 하위 데이터 수집에 지연되거나 전혀 실패하는 경우, 시스템은 하위의 PID 및 종료 데이터를 프로세스 테이블에 무기한으로 유지하는 것 외에 다른 옵션을 사용할 수 없습니다.

데이터가 수집되지 않은 이러한 종료된 프로세스를 UNIX 용어로 좀비 프로세스 또는 단순히 좀비 프로세스라고 합니다.종료된 프로세스를 "더 이상 살아있지 않음" 또는 "죽음"으로 간주하기 때문에 이 이름은 유머러스한 비유이며, 이는 실제로 "미생"인 "생물의 세계" 프로세스, 즉 "좀비" 프로세스에서 여전히 "인화"된 상태로 남아 있는 데드 프로세스를 "살아있는 세계" 프로세스, 즉 "좀비"로 간주하기 때문입니다.

좀비 프로세스는 리소스가 한정되어 있거나 크기가 제한된 프로세스 테이블을 가지고 있는 시스템에서 문제를 일으킬 수 있습니다.이는 좀비가 장기간 사용하는 리소스가 부족하기 때문에 새로운 활성 프로세스를 생성할 수 없기 때문입니다.

따라서 자녀 프로세스를 발생시킬 수 있는 프로그램에서는 원래 자녀로부터 오래 지속되는 좀비의 형성을 막는 코드를 갖는 것이 좋은 프로그래밍 관행이다.가장 확실한 접근법은 새로운 프로세스를 만든 후 대기자 또는 그 친척 중 하나를 호출하는 코드를 어딘가에 두는 것입니다.프로그램이 비동기적으로 실행되어 예측 불가능한 순서로 종료되는 많은 하위 프로세스를 생성할 것으로 예상되는 경우, 일반적으로 수집되지 않은 하위 데이터가 남아 있지 않을 때까지 루프에서 대기 패밀리 함수 중 하나를 호출하는 SIGCHLD 신호용 핸들러를 만드는 것이 좋습니다.부모 프로세스가 자녀의 종료를 완전히 무시하고 좀비를 생성하지 않을 수도 있지만, 이를 위해서는 특별한 옵션플래그 SA_NOCLDWAIT를 [3]사용하여 시그니처 호출을 통해 SIGCHLD용 핸들러를 명시적으로 정의해야 합니다.

고립된 프로세스

고립된 프로세스는 좀비 프로세스와 반대되는 상황입니다.이는 부모 프로세스가 자녀 프로세스보다 먼저 종료되는 경우로, 부모 프로세스가 "고정"되었다고 합니다.자녀 프로세스가 종료되었을 때(SIGCHLD 신호를 통해) 발생하는 비동기 자녀 간 알림과는 달리 자녀 프로세스는 부모가 종료했을 때 즉시 알림을 받지 않습니다.대신 시스템은 하위 프로세스의 데이터에 있는 "부모 PID" 필드를 시스템 내의 다른 모든 프로세스의 "조상" 프로세스로 재정의합니다. PID의 값은 일반적으로 1이고 이름은 전통적으로 "init"입니다(Linux 커널 3.4 이상에서는 제외).따라서 init은 [4][5]시스템상의 모든 고아 프로세스를 "채택"한다고 합니다.

UNIX를 처음 접하는 프로그래머들은 종료 프로세스의 자식 프로세스가 이 프로세스의 직접적인 부모 프로세스에 의해 채택될 것이라는 다소 일반적인 가정(따라서 자식 프로세스의 "대단한")을 가지고 있습니다.물론 "대단한" 것이 초기화 그 자체인 경우를 제외하고, 이러한 가정은 올바르지 않았습니다.

Linux 커널 3.4 이후, 이것은 더 이상 사실이 아닙니다.실제로 프로세스는 PR_SET_CHILD_SUBREAPER 옵션을 사용하여 prctl() 시스템콜을 발행할 수 있습니다.그 결과 프로세스 #1이 아닌 프로세스에서 분리된 하위 프로세스의 부모가 됩니다.이것이 systemd, upstart, nosh 서비스 매니저 등의 최신 서비스 매니저와 데몬 감시 유틸리티의 작업 방식입니다.

이것은 매뉴얼 페이지의 개요이며, 다음과 같은 내용을 보고합니다.

서브리퍼는 그 하위 프로세스에 대해 init(1)의 역할을 수행한다.프로세스가 고립된 경우(즉, 직계 부모가 종료됨) 그 프로세스는 아직 살아있는 가장 가까운 상위 서브리퍼로 다시 양육됩니다.그 후 고립된 프로세스에서 getppid()에 대한 호출은 서브리퍼 프로세스의 PID를 반환합니다.이 호출이 종료되면 서브리퍼 프로세스가 SIGCHLD 신호를 수신하여 프로세스에서 종료 [6]상태를 검출하기 위해 대기할 수 있습니다(2).

레퍼런스

  1. ^ Tanenbaum, Andrew (2007). Modern operating systems (3rd ed.). Pearson Prentice Hall. p. 752. ISBN 0136006639.
  2. ^ Srinivasan, Sundar (2010-09-01). "An Engineer's Options & Futures: A Sneak-Peek into Linux Kernel - Chapter 2: Process Creation". Sunnyeves.blogspot.com. Retrieved 2014-04-30.
  3. ^ "wait man page - System Calls". www.mankier.com.
  4. ^ "init comes first".
  5. ^ "An overview of Linux processes". IBM. 26 March 2012.
  6. ^ "Linux Programmer's Manual".