Zombie Process
by Petra on Aug.23, 2008, under Programming
Salah satu hal yang menarik saat kemarin kuliah IF4038 Pemrograman Sistem adalah tentang zombie process. Zombie process adalah sebuah proses pada sistem operasi yang telah menyelesaikan eksekusinya tetapi terdapat pada entry process.
Di dalam sistem operasi UNIX terdapat sebuah konsep parent process dan child process. Dengan menggunakan system call fork. Sebuah process dapat menciptakan sebuah process lain yang menduplikasikan seluruh image dari process tersebut.
/* fork1.c */
#include <stdio.h>
int main(int argc, char * argv[])
{
fork();
puts("Hello World!");
}
System call fork() memberikan nilai kembalian process id child pada parent dan nilai 0 pada child process. Jika forking gagal dilakukan maka nilai kembaliannya adalah bilangan negatif. Dengan cara ini child process dan parent process dapat diatur sehingga dapat melakukan aksi yang berbeda. Sebagai contoh.
/* fork2.c */
#include <stdio .h>
#include <sys /types.h>
int main(int argc, char * argv[])
{
pid_t childpid = fork();
if (childpid == 0) /* Child proces */
printf("I am the child. My PID is %d. My Parent ID is %d\n", getpid(), getppid());
else if (childpid > 0) /* Parent process */
printf("I am the parent. My PID is %d. My Child ID is %d\n", getpid(), childpid);
else /* Failed */
puts("Failed to fork");
}
Hasilnya bisa dilihat,
petra@petra-desktop:~/IF4038$ ./fork2 I am the child. My PID is 5463. My Parent ID is 5462 I am the parent. My PID is 5462. My Child ID is 5463
Mari kita coba-coba lihat pada process table untuk kode di bawah ini
/* fork3.c */
#include <stdio.h>
#include <sys/types.h>
int main(int argc, char * argv[])
{
pid_t childpid = fork();
if (childpid == 0) /* Child proces */
for( ; ; ) printf("C [%d]\n", getpid());
else if (childpid > 0) /* Parent process */
for( ; ; ) printf("P [%d]\n", getpid());
else /* Failed */
puts("Failed to fork");
}
Process tablenya jika kode dieksekusi
petra@petra-desktop:~/IF4038$ ps axj PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 5420 6006 6006 5420 pts/1 6006 R+ 1000 0:00 ./fork3 6006 6007 6006 5420 pts/1 6006 R+ 1000 0:00 ./fork3 5470 6010 6010 5470 pts/2 6010 R+ 1000 0:00 ps axj
Zombie process akan terjadi kalau PID 6007 kita beri signal kill
petra@petra-desktop:~/IF4038$ kill -9 6007 petra@petra-desktop:~/IF4038$ ps axj PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 5420 6006 6006 5420 pts/1 6006 R+ 1000 0:53 ./fork3 6006 6007 6006 5420 pts/1 6006 Z+ 1000 0:49 [fork3] <defunct> 5470 6053 6053 5470 pts/2 6053 R+ 1000 0:00 ps aj
Bisa dilihat 6007 tetap berada pada process table hanya saja ditandai dengan <defunct> Process ini lah yang disebut dengan zombie process. Sebenarnya process ini sudah berhenti dieksekusikan oleh CPU. Ketika process ini berhenti dieksekusi process ini akan mengirimkan signal SIGCHLD ke parent process. Ketika parent process tidak menghandle signal tersebut maka child process akan seakan-akan tetap hidup.
Lain halnya kalau tadi kita memberi signal kepada parent process
petra@petra-desktop:~/IF4038$ ./fork3
petra@petra-desktop:~/IF4038$ ps axj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
5420 6104 6104 5420 pts/1 6104 R+ 1000 0:01 ./fork3
6104 6105 6104 5420 pts/1 6104 R+ 1000 0:01 ./fork3
5470 6107 6107 5470 pts/2 6107 R+ 1000 0:00 ps aj
petra@petra-desktop:~/IF4038$ kill -9 6104
petra@petra-desktop:~/IF4038$ ps axj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1 6105 6104 5420 pts/1 5420 R 1000 0:12 ./fork3
5470 6115 6115 5470 pts/2 6115 R+ 1000 0:00 ps aj
Child process akan diadopsi oleh process dengan PID 1 yakni init. Sepertinya parent process tidak perlu memberitahu child process saat berhenti eksekusi.
Untuk mencegah hal ini dibutuhkan satu syscall lagi, yakni wait() atau waitpid()
/* fork4.c */
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char * argv[])
{
int stat;
pid_t childpid = fork();
if (childpid == 0) /* Child proces */
for( ; ; ) printf("C [%d]\n", getpid());
else if (childpid > 0) /* Parent process */
{
printf("Waiting....\n");
wait(&stat);
printf("Child end result %d\n", stat);
}
else /* Failed */
puts("Failed to fork");
}
Moral dari cerita ini adalah,
Anak itu kalau maumatipergi harusnya salaman baik-baik sama bapaknya~ Pak Riza Satria Perdana S.T. M.T.
Akan tetapi agak sedikit rancu, bagaimana kalau si Bapaknya yang ngusir? Sebagai contoh
/* fork5.c */
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char * argv[])
{
int stat;
pid_t childpid = fork();
if (childpid == 0) /* Child proces */
for( ; ; ) printf("C [%d]\n", getpid());
else if (childpid > 0) /* Parent process */
{
int i;
for (i = 0; i < 5; i++)
{
sleep(1);
}
kill(childpid, SIGKILL);
for ( ; ; );
}
else /* Failed */
puts("Failed to fork");
}
Pada kode di atas, setelah 5 detik, parent process akan mengirimkan signal SIGKILL kepada child process kemudian masuk ke infinite loop.
sebelum detik ke 5
petra@petra-desktop:~/IF4038$ ps aj PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 5420 6611 6611 5420 pts/1 6611 S+ 1000 0:00 ./fork5 6611 6612 6611 5420 pts/1 6611 R+ 1000 0:00 ./fork5
setelah detik ke 5
petra@petra-desktop:~/IF4038$ ps aj PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 5420 6611 6611 5420 pts/1 6611 R+ 1000 0:00 ./fork5 6611 6612 6611 5420 pts/1 6611 Z+ 1000 0:02 [fork5]
Salah satu solusinya ya jelas dengan menambahkan syscall wait() setelah kill()
Jelas kebijaksanaan Pak Riza di atas dapat ditambahkan
Anak itu harus tau diri, sebelummati dibunuhpergi diusir bapaknya harus salaman baik-baik~ Petra Novandi Barus (calon) S.T.
Ada satu hal lagi yang masih belum diklarifikasikan. Bagaimana kalau child process yang memberi signal SIGKILL kepada parent process?
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char * argv[])
{
int stat;
pid_t childpid = fork();
if (childpid == 0) /* Child proces */
{
pid_t parentpid = getppid();
int i;
for (i = 0; i < 5; i++)
{
sleep(1);
}
kill(parentpid, SIGKILL);
for( ; ; ) ;
}
else if (childpid > 0) /* Parent process */
for( ; ; ) printf("P [%d]\n", getpid());
else /* Failed */
puts("Failed to fork");
}
Kode di atas hanya dibalik dari kode sebelumnya. Child process akan mengirimkan signal SIGKILL kepada parent process setelah 5 detik.
Hasilnya setelah 5 detik adalah
petra@petra-desktop:~/IF4038$ ps aj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1 6884 6883 5420 pts/1 5420 R 1000 0:00 ./fork6
Kurang ajar banget! Abis ngusir bapaknya, dia langsung cari orang tua baru….. (sebenarnya sudah bisa diduga sih)
Well, ternyata *NIX mengajarkan moral yang tidak bagus. *sigh*
Ya sudah lah. Gak usah ditiru.
August 23rd, 2008 on 5:51 pm
hihihi.. pelajaran apa ini?
August 23rd, 2008 on 7:38 pm
wah hebat ya……!:-j
tapi sayang gua gak mudeng apa itu?:))
August 23rd, 2008 on 8:11 pm
wah…. mumet euy ma angka-angka matrix gitu…..
klo nggak dicobain memang spt itu seh ….
August 23rd, 2008 on 9:54 pm
Biar nggak dikill sama child, waktu ngespawn childnya bisa :
1. Ganti ppid dan uid
2. Pake ptrace
3. Matiin capabilitynya (nggak standar ni, di linux bisa jadi gak bisa hehehe)
-Kurniady
August 24th, 2008 on 10:00 am
Exp +1. Itung2 nambah ilmu walaupun harus sambil ketawa…
August 24th, 2008 on 10:30 am
var
a=10;
b=10;
begin
c=a+b
write(‘10 ditambah 10 = ‘, c);
end.
ughhh…. *belajar matematika*
August 25th, 2008 on 2:59 pm
mas mau nanya
apa kegunaan zombie process ini di aplikasi real-world ?
ataukah ini memang semacam bug ?
August 25th, 2008 on 3:06 pm
zombie process itu hanya sebuah fenomena saja
ketika sebuah child process telah selesai dieksekusi maka child process tersebut akan mengirimkan signal SIGCHLD kepada parent process. jika signal SIGCHLD ini tidak dihandle maka akan terjadi zombie process.
August 25th, 2008 on 4:20 pm
‘Abis ngusir bapaknya, dia langsung cari orang tua baru…..’
hahaaha
anaknya gak tau diri tuh..
August 25th, 2008 on 4:56 pm
haha…
sebenernya yang lebih bener
“Abis ngusir bapaknya, dia langsung cari orang tua baru yang lebih kaya….”
August 26th, 2008 on 12:22 pm
Weqs, apaan nih, pet, nampak pernah denger istilah fork sewaktu di kuliah OS dulu, tapi lupa,.
August 26th, 2008 on 12:59 pm
wkwkwkwk
gw pas itu pas lagi masuk kuliah
September 12th, 2008 on 2:57 pm
Kirim juga dong artikel ke web-ku di http://www.liputankita.com. bisa taruh link kok di bawah artikel yg dikirim. Jangan Lupa http://WWW.LIPUTANKITA.COM
February 13th, 2009 on 2:36 am
hmmmm om petra…
trik ini kek nya digunain sm pihak game online dehh… jd ga bisa cheat lg skrg.
karena process nya di hide gitu…
bisa kasih tau cara kill zombie process ??
February 13th, 2009 on 5:34 am
masak sih?
March 18th, 2009 on 3:17 pm
k petra, kalau kita pake pcntl_fork() punya php sama ya fungsinya?
March 18th, 2009 on 3:23 pm
harusnya yah….
May 13th, 2009 on 4:10 pm
wew .. keren mas .. mantap dah, ane jadi lebih ngerti … pantesan aq kill dari tadi koq loncat2 mulu pid na
… programming na oke juga ..
bisa juga baca disini :
http://www.linuxquestions.org/questions/linux-server-73/how-to-kill-zombie-process-592732/
matur nuwun
salam knal
cheers
deanet