좀비 프로세스에 관한 질문입니다
글쓴이: yanggak / 작성시간: 수, 2004/05/19 - 10:56오후
while(1) { ...... ...... if( (pid = fork()) == 0){ printf("\n\nexec\n\n); exit(); } if(ground != BACKGROUND) { wait(&status); } else { ground = 0; printf("Child process PID : %d\n", pid); } }
다음과 같이 실행되었을때
부모프로세스보다 자식 프로세스의 실행이 먼저 끝나게 되면
자식프로세스는 어떻게 되나요??
background의 개념이 이런거 아닌가요?
답변부탁드립니다.
Forums:
[code:1]부모프로세스보다 자식 프로세스의 실행이 먼저 끝나게 되면
부모프로세스보다 자식 프로세스의 실행이 먼저 끝나게 되면
자식 프로세서가 끝나고 부모 프로세서가 wait 하기전까진
좀비 프로세서가 됩니다..( <defunct> )
프로세서 실행중 ps 해보면 자식프로세서의 ppid 는 부모 프로세서의 pid
인데 부모 프로세서가 먼저죽으면 자식프로세세의 ppid는 1 이 됩니다.
언제나 시작
parent, child 관계에서 child 보다 parent 가 먼저
parent, child 관계에서 child 보다 parent 가 먼저 종료 될 경우.. child의 parent는 init가 됩니다.
따라서 나중에 child가 종료되면 init 가 알아서 child 에 할당된 자원을 해제해 줍니다.
이런 것을 이용해서 concurrent server 를 짤때 좀비가 생기지 않도록 double fork를 사용하기도 합니다.
자세한 것은 Advanced Programming in the Unix Environment 202 page를 보시면 소스가 나와있습니다.
Dream, Passion and Challenge..
[좀비프로세서]Zombie Process
좀비프로세스란 왜톨이 부모가 버린 프로세스란 말이다.
부모가 버렸으니, 상식적으로 할아버지와 할머니의 손에서 양육되어야 할것이다.
부모 프로세스가 자식을 버리니, 이는 가화만사성이 깨지고 할아버지 init 프로세스가 그자식을 살피니 이는 비극이요, 있을수 없는 일이로다.
zombie process 란 process가 종료후 parent pro
zombie process 란 process가 종료후 parent process가 child process의
상태를 wait(or waitpid) 등으로 종료 반환 값을 읽어가고 관련 리소스를
해제해주기를 대기하는 상태를 말합니다.
parent가 이를 호출하지 않고, child 보다 먼저 죽었을 경우 init 이 해당 process의
parent가 되어 child의 zombie 상태를 해제하게 됩니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
구체적으로 init이 좀비가 된 프로세스를 언제 어떻게 죽이는지에 대한
구체적으로 init이 좀비가 된 프로세스를 언제 어떻게 죽이는지에 대한 답변은 안나온것 같군요...
예를 들어서 위의 소스에서 계속해서 루프를 돌면서 fork를 한다면 계속 좀비프로세스가 생기지 않을까요?
제가 실력이 없는 터라 프로그램을 돌리다 위와 같은 상황을 초래한것같습니다..
linux server로 접속하려하니 이런 메시지가 뜨더군요.
fork:resource temporarily unavailble
뭣 땜에 이러는 건가요? vitual memory하고 관계있는것 같다고 어떤 사람이 얘기해 주던데...궁금합니다.
If you can dream it,
you can do it
[quote]fork:resource temporarily unava
virtual memory 때문이라기 보다는 시스템에서 허용된 process의 갯수를 초과했기 때문일 것 같습니다.
위에서 ground 변수가 정확히 언제 setting 되는 건가요?
상태가 BACKGROUND라면 계속 fork 하게 되는 거 아닌가요?
실제로 명시적인 wait는 없이 말이죠.
BACKGROUND의 경우에 sig_handler를 사용해서, waitpid로 처리하시면 zombie 문제는 사라질 것 같습니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
init 프로세서가 부모잃은 child 프로세서를 정상적으로 처리한다면
init 프로세서가 부모잃은 child 프로세서를 정상적으로 처리한다면
<defunct> 는 왜 생기는 건가요? (궁금 :shock: )
언제나 시작
[quote="alwaysN00b"]init 프로세서가 부모잃은 chil
<defunct>는 부모가 살아있고 자식이 죽었을 때 생기는 거 아닌가요?
부모까지 죽어야 init 프로세스가 처리하죠...
물론 그전에 부모가 거두어 줘야 되겠지만.
[quote="맹고이"][quote="alwaysN00b"]init 프로
프로세스는 일단 종료하면 좀비상태가 됩니다.
정확히 말하자면 exit한 프로세스는 부모 프로세스가 wait()하기 전까지는
좀비 상태입니다.
프로세스가 exit()하면 모든 자원을 되돌려주지만, 커널 프로세스 구조체에는
여전히 프로세스 ID와 종료상태 등의 값을 가지고 있습니다.
왜 가지고 있냐 하면 부모 프로세스가 종료된 자식 프로세스의 PID, 종료상태,
리턴값등을 확인할 필요가 있기 때문입니다.
만약 프로세스가 종료하는 즉시 자원과 함께 커널 프로세스(스케쥴)구조체를 날려
버린다면 부모 프로세스는 자식 프로세스의 상태를 알 방도가 없을 겁니다.
wait()를 하면 비로서 해당 커널 프로세스 구조체를 정리하고 좀비상태에서 벗어나게
되고 부모프로세스는 죽은 자식프로세스의 정보를 얻게 됩니다.
물론 SIGCHLD등을 무시하도록 해서 exit호출후 곧바로 프로세스 구조체를
날려버려서 좀비가 발생하지 않도록 하는 방법도 있긴 합니다.
[quote="yundream"]프로세스는 일단 종료하면 좀비상태가 됩니
허접했지만 제 말이 그 말이었는데...
제 글을 인용하셨길래 남겨봅니다. ;;
wait를 써도 부모 프로세서는 정지되지 않게 하는 방법 없나요?
안녕하세요.
wait를 써도 부모 프로세서는 정지되지 않게 하는 방법 없나요?
wait를 쓰면 좀비가 없어서 좋긴한데, 부모 프로세서가 정지가 되어서
제가 원하는 기능으로 동작않네요. 방법이 없나요?
OTL 즐!!!! (좌절 금지!!!)
Re: wait를 써도 부모 프로세서는 정지되지 않게 하는 방법 없나
signal과 함께 wait/waitpid를 이용합니다...
왠만한 유닉스 시스템 프로그래밍 책을 보시면 당연히 나오는 이야기입니다... :(
그럼 signal을 고려해 보시는건 어떻습니까?SIGCHLD 를
그럼 signal을 고려해 보시는건 어떻습니까?
SIGCHLD 를 이용해 보심이..
child process가 종료하면 child process는 parent process에게
SIGCHLD를 보내게 되어 있습니다.
하나의 parent process에 child process가 여러놈이면 한꺼번에 SIGCHLD가
여러번 넘어 올 수 있으므로(signal은 queueing을 할 수 없습니다.) 그것을 고려해 주어야 하겠지만..
단순히 parent - child 의 쌍이라면 별 고민없이 사용하시면 될 듯합니다.
예제 소스 좀 부탁 드립니다.
답변 감사드립니다.
제가 프로그래밍 초보이고 지금 책이 없습니다.
예제 소스를 받을수 있는 곳이나 또는 직접 예제를 올려주시면 안될까요?
OTL 즐!!!! (좌절 금지!!!)
[quote="vness"]하나의 parent process에 chi
그렇습니다.. 때문에 거의 모든 문서의 예제에는 while()안에 wait()을 넣고 있습니다.. -_-;
다음 소스를 참고하세요.
참고하세요.
자식 프로세스의 종료처리에 대한 SIGCHLD 를 핸들러에서 처리하고
waitpid() 는 wait() 과 동일하지만 블로킹문제를 해결하는 기능이 있습니다.
With Everlasting Passion about new Tech. and Information!
감사합니다.
감사합니다. 좋은 하루 되세요. :)
OTL 즐!!!! (좌절 금지!!!)
인용:물론 SIGCHLD등을
이 방법은 어떤 식으로 할 수가 있나요 ?
지금 제가 처한 상황이 위와 같은 상황입니다.
한번에 엄청나게 fork 를 했다가 비주기적으로 종료가 되기 때문에 시그널이 많이 겹치는 상황이라
정상적으로 처리를 해도 좀비 프로세스가 꽤 남고 있습니다.
일단, while 문으로
일단, while 문으로 좀비가 남지 않을때까지 wait, waitpid 을 반복하여 급한 불은 껐지만...
생각외로 좀비가 늦게 죽네요.
exit 호출 후에 곧바로 프로세스 구조체를 날려버릴 수 있는 방법을 아시는 분이 계시면 알려주시면 감사하겠습니다.
댓글 달기