실행 후에 process를 보면 메인 밑에 [./a.out <defunct>]라는 메시지가 나옵니다.
이런메시지는 좀비 때문인걸로 알고 있는데요..
fork()시 부모 프로세스에서 SIGCLD에 대한 시그널핸들러를 달아주세요.
비권장 사항은 부모 프로세스에서 자식 프로세스의 사망시그널을 무시하는것입니다.
signal(SIGCLD, SIG_IGN);
래리버드 wrote:
그래서 혹시나 돌다가 나중에라도 무슨 문제가 있을 수 있는지가 궁금합니다.
프로세스 상태가 zombie로 바뀌게 되면, zombie 프로세스는 커널
프로세스테이블의 한 엔트리를 차지하고 있고,
모든 리소스는 반환합니다. 또한, 스케쥴링에서는 제외됩니다.
하나의 좀비프로세스인 경우, 프로세스테이블 엔트리 하나를 점유하지만,
이런 식의 프로세스가 증가하면, 무수히 많은 엔트리를 장악하게 될테고,
불필요하게 메모리를 점유하게 되는 현상이 되겠지요? 따라서 좀비는 없게끔
해야 합니다.
원초적으로 프로세스생성한 쪽에서 책임져라!(부모가 자식프로세스의
사망을 핸들링해라)라는 명제로 유닉스 설계자가 설계해서 이런 메카니즘이
만들어진 것입니다.
* KLDP BBS 검색에서 검색해보면 검색어: 좀비 zombie 좋은 답변이 아주 많겠지요?
비록 좀비프로세스가 어떠한 자원도 소모하지 않는다고는 하지만 커널입장에서 봤을때는 task 자료구조를 유지하기 위한 얼마간의 자원을 소모하고 있음을 알수 있다. 무엇보다 커널이 유지할수 있는 task 구조체의 리스트의 크기에 제한이 있음으로, 많은 좀비프로세스가 발생할경우 시스템성능에영향을 미칠수 있다. 또한 리스트의 크기가 크면 리스트를 순환하는데 걸리는 시간(각 프로세스를 스케쥴링하기 위한)도 더걸리게 됨으로 역시 성능에 좋지 않은 영향을 미칠수 있을것이다. 관리자가 ps 명령을 이용해서 시스템을 모니터링 할때 기분이 나뻐지는 심리적효과도 무시할 수 없다(정신적인 데미지를 입는다).
fork()시 부모 프로세스에서 SIGCLD에 대한 시그널핸들러를 달아주세요.
비권장 사항은 부모 프로세스에서 자식 프로세스의 사망시그널을 무시하는것입니다.
signal(SIGCLD, SIG_IGN);
그냥 참고입니다. ^^;
POSIX에서는 (제 기억에는..;; ) SIGCHLD를 SIG_IGN로 set하면 결과는 undefined입니다. 하지만 BSD계열의 유닉스에서는 SIGCHLD를 ignore하면 자동으로 자식 프로세스의 좀비화를 막아줍니다.
그래서 signal(SIGCHLD, SIG_IGN); 을 사용한 BSD 쪽 프로그램을 리눅스 등의 sysV계열에서 컴파일하면 문제가 종종 생기죠. 윗분 말씀대로 signal handler에서 wait()등을 호출해주는 것이 올바른 처리라고 생각합니다. :)
좀비는 당장은 눈에 보이는 어떤 영향은 없습니다.하지만 죽지는 않고
좀비는 당장은 눈에 보이는 어떤 영향은 없습니다.
하지만 죽지는 않고 메모리를 차지하고 있는 것이므로 쌓이면 메모리누수,
그러니까 사용 할 수 있는 메모리가 줄어들지요.
될 수 있으면 없는게 좋습니다.
wait() 같은 함수를 참고해 보세요.
SOrCErEr
Re: [질문] [./a.out <defunct>] 라는 메시지가...
fork()시 부모 프로세스에서 SIGCLD에 대한 시그널핸들러를 달아주세요.
비권장 사항은 부모 프로세스에서 자식 프로세스의 사망시그널을 무시하는것입니다.
signal(SIGCLD, SIG_IGN);
프로세스 상태가 zombie로 바뀌게 되면, zombie 프로세스는 커널
프로세스테이블의 한 엔트리를 차지하고 있고,
모든 리소스는 반환합니다. 또한, 스케쥴링에서는 제외됩니다.
하나의 좀비프로세스인 경우, 프로세스테이블 엔트리 하나를 점유하지만,
이런 식의 프로세스가 증가하면, 무수히 많은 엔트리를 장악하게 될테고,
불필요하게 메모리를 점유하게 되는 현상이 되겠지요? 따라서 좀비는 없게끔
해야 합니다.
원초적으로 프로세스생성한 쪽에서 책임져라!(부모가 자식프로세스의
사망을 핸들링해라)라는 명제로 유닉스 설계자가 설계해서 이런 메카니즘이
만들어진 것입니다.
* KLDP BBS 검색에서 검색해보면 검색어: 좀비 zombie 좋은 답변이 아주 많겠지요?
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
참조하세요~
http://www.joinc.co.kr/modules.php?name=News&file=article&sid=122&mode=nested&order=0&thold=0#147
해당 내용중 재미 있는 부분^^
실제로 전 저 데미지가 가장 크더군요... 8)
Be at a right place at a right time...
Re: [질문] [./a.out <defunct>] 라는 메시지가...
그냥 참고입니다. ^^;
POSIX에서는 (제 기억에는..;; ) SIGCHLD를 SIG_IGN로 set하면 결과는 undefined입니다. 하지만 BSD계열의 유닉스에서는 SIGCHLD를 ignore하면 자동으로 자식 프로세스의 좀비화를 막아줍니다.
그래서 signal(SIGCHLD, SIG_IGN); 을 사용한 BSD 쪽 프로그램을 리눅스 등의 sysV계열에서 컴파일하면 문제가 종종 생기죠. 윗분 말씀대로 signal handler에서 wait()등을 호출해주는 것이 올바른 처리라고 생각합니다. :)
----
Let's shut up and code.
댓글 달기