+ 프로세스 & 좀비프로세스 +
OS/리눅스 & 유닉스 2011. 11. 8. 16:07파일과 같이 프로세스도 생성 못지않게 소멸이 중요하다. 만약 대충 소멸해 놓으면 이 소멸되지 않은 프로세스들이 돌아다니게 된다.
프로세스가 생성되고 실행을 완료 하면 사라져야하는데 사라지지 않고 시스템의 중요한 리소스를 차지하기도 한다.
이 상태의 프로세스를 좀비 프로세스 라고 하는데 시스템에 아주 큰 부담을 주는 원인이 된다.
좀비 생성이유
- 인자를 전달하면서 exit를 호출하는 경우
- main함수에서 return 문을 실행하면서 값을 반환하는 경우
exit함수로 전달되는 인자 값과 main 함수의 return문에 의해 반환되는 값 모두 운영체제로 전달된다. 운영체제는 이 값이 자식프로세스를 생성한 부모 프로세스에게 전달될 때까지 자식 프로세스를 소멸시키지 않는데, 이것을 좀비 프로세스라고 한다. 즉, 자식 프로세스를 좀비 프로세스로 만드는 주체는 운영체제이다.
" 해당 자식프로세스를 생성한 부모 프로세스에게 exit함수의 인자 값이나 return 문의 반환 값이 전달 되어야 한다."
이렇게 해야 좀비프로세스는 소멸이 된다.
첫번째 그림이 좀비 프로세스가 되는 경우 이다.
그러나 두번째 그림 처럼 부모 프로세스가 운영체제에게 자식프로세스를 소멸해달라고 전해주게 되면 좀비프로세스가 생기지 않는다.
부모프로세스가 커널에게 자식프로세스가 리턴한 값을 건네달라고 요청을 해야만 커널은 부모프로세스에게 자식프로세스로 부터 건네 받은 값을 전달한다.
+ 좀비 프로세스의 소멸1 +
부모프로세스가 커널에게 자식프로세스가 종료할때 건네준 값을 달라고 요청하는것이 wait()함수이다.
wati()함수의 원형이다.
#include <sys/wait.h>
pid_t wait(int * statloc);
wait함수가 호출되었을때, 이미 종료된 자식프로세스가 있다면, 자식프로세스가 종료되면서 전달한 값이 매개변수로 전달된 주소의 변수에 저장된다.
statloc : 포인터 statloc이 가리키는 변수에 자식 프로세스 종료시 리턴하거나 exit함수 호출시 전달한 인자값이 저장됨.
* WIFEXITED : 자식 프로세스가 정상 종료한 경우 'TRUE'반환
* WEXITSTATUS : 자식 프로세스의 전달 값을 반환한다.
wait(&statue); <- wait함수호출( 종료된 프로세스 관련정보는 statue에 담기게 된다.)
if(WIFEXITED(status) ) //정상종료 했나?
{
printf("child pass num : %d", WEITSTATUS(status) ); // 반환값을 출력 해~
}
+ 좀비 프로세스의 소멸2 +
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);
pid : 종료를 확인하고자 하는 자식프로세스의 ID전달 대신 -1을 전달하면 wait함수와 마찬가지로 임의의 자식 프로세스가 종료되기를 기다린다.
statloc : wait함수 와 동일한 의미
options : WNOHANG을 인자로 전달하면, 종료된 자식 프로세스가 존재하지 않아도 블로킹 상태에 있지않고 0을 반환하며 함수 빠져나온다.
ex)
pid_t pid= fork();
while(waitpid(-1, &status, WNOHANG) ); <- waitpid함수호출(종료된 프로세스 status에 저장, WNOHANG을 전달하였으므로, 종료된 자식 프로세스가 없으면 0을 반환)
printf("child pass num : %d", WEITSTATUS(status) ); // 반환값을 출력 해~
프로세스가 생성되고 실행을 완료 하면 사라져야하는데 사라지지 않고 시스템의 중요한 리소스를 차지하기도 한다.
이 상태의 프로세스를 좀비 프로세스 라고 하는데 시스템에 아주 큰 부담을 주는 원인이 된다.
좀비 생성이유
- 인자를 전달하면서 exit를 호출하는 경우
- main함수에서 return 문을 실행하면서 값을 반환하는 경우
exit함수로 전달되는 인자 값과 main 함수의 return문에 의해 반환되는 값 모두 운영체제로 전달된다. 운영체제는 이 값이 자식프로세스를 생성한 부모 프로세스에게 전달될 때까지 자식 프로세스를 소멸시키지 않는데, 이것을 좀비 프로세스라고 한다. 즉, 자식 프로세스를 좀비 프로세스로 만드는 주체는 운영체제이다.
" 해당 자식프로세스를 생성한 부모 프로세스에게 exit함수의 인자 값이나 return 문의 반환 값이 전달 되어야 한다."
이렇게 해야 좀비프로세스는 소멸이 된다.
첫번째 그림이 좀비 프로세스가 되는 경우 이다.
그러나 두번째 그림 처럼 부모 프로세스가 운영체제에게 자식프로세스를 소멸해달라고 전해주게 되면 좀비프로세스가 생기지 않는다.
부모프로세스가 커널에게 자식프로세스가 리턴한 값을 건네달라고 요청을 해야만 커널은 부모프로세스에게 자식프로세스로 부터 건네 받은 값을 전달한다.
+ 좀비 프로세스의 소멸1 +
부모프로세스가 커널에게 자식프로세스가 종료할때 건네준 값을 달라고 요청하는것이 wait()함수이다.
wati()함수의 원형이다.
#include <sys/wait.h>
pid_t wait(int * statloc);
wait함수가 호출되었을때, 이미 종료된 자식프로세스가 있다면, 자식프로세스가 종료되면서 전달한 값이 매개변수로 전달된 주소의 변수에 저장된다.
statloc : 포인터 statloc이 가리키는 변수에 자식 프로세스 종료시 리턴하거나 exit함수 호출시 전달한 인자값이 저장됨.
* WIFEXITED : 자식 프로세스가 정상 종료한 경우 'TRUE'반환
* WEXITSTATUS : 자식 프로세스의 전달 값을 반환한다.
wait(&statue); <- wait함수호출( 종료된 프로세스 관련정보는 statue에 담기게 된다.)
if(WIFEXITED(status) ) //정상종료 했나?
{
printf("child pass num : %d", WEITSTATUS(status) ); // 반환값을 출력 해~
}
+ 좀비 프로세스의 소멸2 +
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);
pid : 종료를 확인하고자 하는 자식프로세스의 ID전달 대신 -1을 전달하면 wait함수와 마찬가지로 임의의 자식 프로세스가 종료되기를 기다린다.
statloc : wait함수 와 동일한 의미
options : WNOHANG을 인자로 전달하면, 종료된 자식 프로세스가 존재하지 않아도 블로킹 상태에 있지않고 0을 반환하며 함수 빠져나온다.
ex)
pid_t pid= fork();
while(waitpid(-1, &status, WNOHANG) ); <- waitpid함수호출(종료된 프로세스 status에 저장, WNOHANG을 전달하였으므로, 종료된 자식 프로세스가 없으면 0을 반환)
printf("child pass num : %d", WEITSTATUS(status) ); // 반환값을 출력 해~
'OS > 리눅스 & 유닉스' 카테고리의 다른 글
waitpid (0) | 2011.11.08 |
---|---|
wait(), waitpid() (0) | 2011.11.08 |
shmget(), shmat(), shmdt() - 공유메모리 공간 할당/첨부/분리 (0) | 2011.11.08 |
유닉스(리눅스) 시그널 종류 (0) | 2011.11.08 |
vim 메뉴얼 (0) | 2011.11.02 |