Zombies

Good parents don't let their children become zombies!

Child process가 종료되었음에도 여전히 kernel process table을 차지하는 경우 zombie process입니다. 또한 이 zombie process들은 process ID, exit status 등등 정보를 여전히 가지고 있습니다. 오직 child process가 waited on이 되었을 때 이 slot은 사용이 가능해지고 나머지 정보도 parent에 의해 access될 수 있습니다.

오랫동안 동작하는 프로그램은 지속적으로 프로세스를 만들고 wait을 하지 않음으로써 많은 좀비를 만들어낼수 있습니다.


What would be effect of too many zombies?

결국 Kernel process table에 새로운 프로세스를 만들 공간이 부족해질 것입니다. 그러므로 fork가 실패하게 되고, 시스템을 사용하기 어렵거나 불가능하게 됩니다(예를 들어, 로그인하는 것도 새로운 프로세스가 필요합니다)


What does the system do to help prevent zombies?

일단 프로그램이 끝나게 되면, 그 프로그램의 children들은 모두 init에 할당됩니다(pid가 1인 최초의 프로세스). 즉, 이러한 children들의 getppid 리턴값은 1이 됩니다.  이러한 고아들은 짧은 순간 zombie가 되었다가 종료되게 됩니다. 다행이 init process에서는 자동적으로 이러한 children들을 wait하므로, system에서 좀비를 제거할 수 있습니다.

How do I prevent zombies?

wait을 사용하면 됩니다!
waitpid(child, &status, 0); // Clean up and wait for my child process to finish.

위의 경우에선 SIGCHLD event가 발생하는 것은 오직 child process가 종료되었을 때만이라고 가정하고 있습니다.(이는 사실이 아닙니다- man page 참조)
잘 짜여진 코드는 interrupt status를 체크하고 위의 loop를 포함시키는 것입니다.


How can I asynchronously wait for my child using SIGCHLD?(ADVANCED)


주의 : 이 section은 아직 소개하지 않은 signal을 사용합니다. Parent는 child가 종료되면 SIGCHILD signal을 받게 되어 signal handler가 그 프로세스를 기다릴 수 있습니다. 약간 단순화한 코드는 아래와 같습니다.


So what are environment variables?

환경 변수는 모든 프로세스가 사용하기 위해 system이 가지고 있는 변수입니다. 시스템은 이미 이러한 변수를 가지고 있습니다. bash에서 이러한 환경 변수는 다음과 같이 확인할 수 있습니다.

$ echo $HOME
/home/bhuvy
$ echo $PATH
/usr/local/sbin:/usr/bin:...

만약 C/C++에서 얻으려면 어떻게 해야할까요?
이 떄는 getenv나 setenv를 사용합니다.

char* home = getenv("HOME"); // Will return /home/bhuvy
setenv("HOME", "/home/bhuvan", 1 /*set overwrite to true*/ );

Right, so how do these environment variables mean anything to parent/child?

각각의 프로세스는 스스로의 환경변수 사전을 가지고 있습니다. 또한 이것은 child process에게 복사되어집니다. 즉, 만약 부모의 환경 변수가 바뀌어도 자식의 환경 변수에는 영향을 미치지 않습니다. 반대의 경우도 마찬가지입니다. 이것은 fork-exec-wait 패턴에서 부모와 다른 환경 변수를 가진 프로그램을 exec할 경우 매우 중요합니다. 

예를 들어, 모든 time zone을 돌아다니며 data command를 실행해 모든 local의 data와 time을 print하는 C 프로그램을 짠다고 생각해봅시다. 환경변수는 모든 종류의 프로그램에서 사용되기 떄문에 수정하는 일은 매우 중요합니다.



'Angrave System Programming > Processes' 카테고리의 다른 글

Process Control : Signals  (0) 2019.01.11
Process Control : Wait macros  (0) 2019.01.11
Forking: Fork, Exec, Wait(1)  (0) 2019.01.11
Forking Introduction  (0) 2019.01.10
Process Introduction  (0) 2019.01.10
Posted by 몰랑&봉봉
,