zombie가 무엇인가?
-------------------------
하나의 프로그램이 fork를 수행하고 자식 프로세스가 부모 프로세스 이전에
끝나면, 커널은 부모 프로세스가 필요할 경우를 위한 자식 프로세스의 일부
정보를 계속 유지하게 된다. 예를 들어 부모 프로세스는 자식 프로세스의 exit
코드 점검을 필요로 한다. 이 정보를 얻기 위해서 부모 프로세스는 wait()를
호출한다. 이것이 호출되면 커널은 그 정보를 무시할 수 있다.
자식 프로세스가 수행 중지되고 부모 프로세스가 wait()호출 하기까지의 사이에
자식 프로세스는 zombie라고 불리게 된다(만약 여러분이 ps명령을 호출하면 자식
프로세스는 'Z'상태(zombie)를 갖게 된다). 비록 이것이 실행상태를 뜻하는 것은
아니지만 여전히 프로세스 테이블을 차지하고 있게 된다.( 물론 프로세스 테이블
이외의 다른 자원을 소비하는 것은 아니다 그러나 몇몇 유틸리티는 가짜의 정보를
보여 주기도 한다. 예를 들어 CPU타임을 차지 하는 것 처럼 보이기도 하는데
이것은 프로세스 테이블 엔트리의 몇몇 뿐이 스페이스를 줄이기 위한 어카운팅
정보에 의해 오버레이 되기 때문이다.
이것이 좋은 것은 물론 아니다. 프로세스 테이블 자체는 정해진 숫자의 크기를
갖기 때문에 자칫 zombie대문에 프로세스가 더이상 발생 하지 못할 가능성도 있다
심지어 시스템 프로세스 테이블 자원이 고갈되지 않는다고 해도 각 사용자는
사용자 마다 한정된 자원의 프로세스 테이블이 있기 때문에 시스템 프로세스
테이블 자원이 소진되지 않았다고 해도 사용자의 fork() 시스템 호출이 실패
할 수 있다. 따라서 fork()를 사용할 때는 fork()가 실패하지는 않았는지
반드시 확인해야 한다.
만약 부모 프로세스가 wait() 없이 중지 되면 자식 프로세스는 1번 시스템 프로세스
인 init프로세스의 양자로 들어가게 되어 init가 자식 프로세스의 프로세스 cleanup을
담당하게 된다.
-------------------------
하나의 프로그램이 fork를 수행하고 자식 프로세스가 부모 프로세스 이전에
끝나면, 커널은 부모 프로세스가 필요할 경우를 위한 자식 프로세스의 일부
정보를 계속 유지하게 된다. 예를 들어 부모 프로세스는 자식 프로세스의 exit
코드 점검을 필요로 한다. 이 정보를 얻기 위해서 부모 프로세스는 wait()를
호출한다. 이것이 호출되면 커널은 그 정보를 무시할 수 있다.
자식 프로세스가 수행 중지되고 부모 프로세스가 wait()호출 하기까지의 사이에
자식 프로세스는 zombie라고 불리게 된다(만약 여러분이 ps명령을 호출하면 자식
프로세스는 'Z'상태(zombie)를 갖게 된다). 비록 이것이 실행상태를 뜻하는 것은
아니지만 여전히 프로세스 테이블을 차지하고 있게 된다.( 물론 프로세스 테이블
이외의 다른 자원을 소비하는 것은 아니다 그러나 몇몇 유틸리티는 가짜의 정보를
보여 주기도 한다. 예를 들어 CPU타임을 차지 하는 것 처럼 보이기도 하는데
이것은 프로세스 테이블 엔트리의 몇몇 뿐이 스페이스를 줄이기 위한 어카운팅
정보에 의해 오버레이 되기 때문이다.
이것이 좋은 것은 물론 아니다. 프로세스 테이블 자체는 정해진 숫자의 크기를
갖기 때문에 자칫 zombie대문에 프로세스가 더이상 발생 하지 못할 가능성도 있다
심지어 시스템 프로세스 테이블 자원이 고갈되지 않는다고 해도 각 사용자는
사용자 마다 한정된 자원의 프로세스 테이블이 있기 때문에 시스템 프로세스
테이블 자원이 소진되지 않았다고 해도 사용자의 fork() 시스템 호출이 실패
할 수 있다. 따라서 fork()를 사용할 때는 fork()가 실패하지는 않았는지
반드시 확인해야 한다.
만약 부모 프로세스가 wait() 없이 중지 되면 자식 프로세스는 1번 시스템 프로세스
인 init프로세스의 양자로 들어가게 되어 init가 자식 프로세스의 프로세스 cleanup을
담당하게 된다.
'Linux' 카테고리의 다른 글
내 프로그램이 daemon프로세스처럼 동작하게 하려면? (0) | 2013.09.26 |
---|---|
zombie발생을 막으려면? (0) | 2013.09.26 |
부모 프로세스와 자식 프로세스는 어떻게 통신을 하는가? (0) | 2013.09.26 |
왜 자식프로세스에서 exit대신에 _exit를 일반적으로 더 사용 하는가? (0) | 2013.09.26 |
fork() 로 인해 부모에서 자식에게 상속 되는 부분 (0) | 2013.09.26 |