대기(시스템 호출)

wait (system call)

컴퓨터 운영 체제에서 프로세스(또는 태스크)는 실행을 완료하기 위해 다른 프로세스에서 대기할 수 있다.대부분의 시스템에서 상위 프로세스는 독립적으로 실행되는 하위 프로세스를 생성할 수 있다.그런 다음 상위 프로세스는 대기 시스템 호출을 발생시킬 수 있으며, 이는 하위 프로세스가 실행되는 동안 상위 프로세스의 실행을 중지한다.하위 프로세스가 종료되면 종료 상태를 운영 체제에 반환하고, 종료 상태는 대기 중인 상위 프로세스로 반환된다.그런 다음 상위 프로세스는 실행을 재개한다.null

또한 현대의 운영체제는 프로세스의 스레드가 다른 스레드를 만들고 유사한 방식으로 스레드가 종료("조인")될 때까지 기다릴 수 있도록 시스템 호출을 제공한다.null

운영 체제는 프로세스가 하위 프로세스가 종료될 때까지 기다리거나 특정 단일 하위 프로세스(프로세스 ID로 식별됨)가 종료될 때까지 기다릴 수 있도록 대기 호출의 변형을 제공할 수 있다.null

일부 운영 체제는 하위 프로세스가 종료될 때 상위 프로세스에 신호(SIGCHLD)를 발급하여 상위 프로세스를 통지하고 하위 프로세스의 종료 상태를 검색할 수 있도록 한다.null

하위 프로세스에 의해 반환되는 종료 상태는 일반적으로 프로세스가 정상적으로 종료되었는지 또는 비정상적으로 종료되었는지 여부를 나타낸다.정상 종료의 경우, 이 상태는 프로세스가 시스템에 반환한 종료 코드(일반적으로 정수 값)도 포함한다.UNIX의 첫 20년 동안, 대기 중인 부모에게는 출구 코드의 낮은 8비트만 이용 가능했다.1989년 SVR4와 함께,[citation needed] 구조 멤버 si_status에서 siginfo_t라고 하는 구조로, 출구 호출의 모든 비트를 반환하는 새로운 통화 waitid가 도입되었다.[citation needed]Waitid는 2001년부터 POSIX 표준의 필수 부분이다.null

좀비와 고아

아동 프로세스가 종료되면 좀비 프로세스가 되며, 더 이상 능동적으로 실행 중인 프로그램이 아님에도 불구하고 시스템 프로세스 테이블의 항목으로 계속 존재하게 된다.정상 작동에서는 일반적으로 부모가 즉시 대기한 다음 시스템에 의해 수집되어 리소스(프로세스 테이블 항목)를 회수한다.부모가 아이를 기다리지 않는 경우, 아이는 이 자원을 무한정 소비하므로 자원 유출이 된다.이러한 상황은 일반적으로 좀비를 찾고 운영 체제가 리소스를 할당 해제할 수 있도록 하는 특별한 "리퍼" 프로세스로[citation needed] 처리된다.null

반대로 부모 과정이 끝나기 전에 종료되는 자식 프로세스는 고아 과정이 된다.이러한 상황은 일반적으로 부모 프로세스가 종료될 때 프로세스의 새 부모로 할당되는 특별한 "루트"(또는 "초기") 프로세스로 처리된다.이 특수 프로세스는 고아 프로세스가 종료된 시기를 감지한 다음 종료된 자식 프로세스의 할당을 해제할 수 있도록 하기 위해 종료 상태를 검색한다.null

자식 프로세스가 신호를 수신하면 대기 중인 부모는 고아 프로세스를 남겨두고 실행을 계속한다.[citation needed]따라서 wait, waitpid 또는 waitid에 의해 설정된 인수를 점검해야 하는 경우가 있으며, WIFSIGNALED가 참인 경우 하위 프로세스가 리소스를 할당 해제할 때까지 다시 기다리십시오.[citation needed]null

참고 항목

참조