Ketika saya biasa killall -9 name
membunuh program, negara menjadi zombie. Beberapa menit kemudian, itu benar-benar berhenti. Jadi, apa yang terjadi selama menit-menit itu?
Program ini sebenarnya tidak pernah menerima sinyal SIGKILL, karena SIGKILL sepenuhnya ditangani oleh sistem operasi / kernel.
Ketika SIGKILL untuk proses tertentu dikirim, penjadwal kernel segera berhenti memberikan proses itu lagi waktu CPU untuk menjalankan kode ruang pengguna. Jika proses memiliki utas yang mengeksekusi kode ruang pengguna pada CPU / core lain pada saat penjadwal membuat keputusan ini, utas tersebut akan dihentikan juga. (Dalam sistem single-core ini dulunya jauh lebih sederhana: jika satu-satunya inti CPU dalam sistem menjalankan penjadwal, itu menurut definisi tidak menjalankan proses pada saat yang sama!)
Jika proses / utas mengeksekusi kode kernel (mis. Panggilan sistem, atau operasi I / O yang terkait dengan file yang dipetakan memori) pada saat SIGKILL, prosesnya menjadi sedikit rumit: hanya beberapa panggilan sistem yang dapat disela, sehingga kernel secara internal menandai proses sebagai "sekarat" khusus sampai sistem panggilan atau operasi I / O diselesaikan. Waktu CPU untuk menyelesaikannya akan dijadwalkan seperti biasa. Panggilan sistem yang dapat terputus atau operasi I / O akan memeriksa apakah proses yang memanggilnya sekarat pada titik pemberhentian yang sesuai, dan akan keluar lebih awal dalam kasus itu. Operasi tanpa gangguan akan selesai, dan akan memeriksa keadaan "sekarat" sebelum kembali ke kode ruang pengguna.
Setelah rutinitas kernel dalam proses diselesaikan, status proses diubah dari "mati" menjadi "mati" dan kernel mulai membersihkannya, mirip dengan ketika sebuah program keluar secara normal. Setelah pembersihan selesai, kode hasil yang lebih besar dari 128 akan diberikan (untuk menunjukkan bahwa proses tersebut terbunuh oleh sinyal; lihat jawaban ini untuk detail yang berantakan ), dan proses akan beralih ke keadaan "zombie" . Induk dari proses yang terbunuh akan diberitahukan dengan sinyal SIGCHLD.
Akibatnya, proses itu sendiri tidak akan pernah mendapatkan kesempatan untuk benar-benar memproses informasi bahwa ia telah menerima SIGKILL.
Ketika suatu proses dalam keadaan "zombie" itu berarti proses tersebut sudah mati, tetapi proses induknya belum mengakui ini dengan membaca kode keluar dari proses mati menggunakan wait(2)
panggilan sistem. Pada dasarnya satu-satunya sumber daya yang dikonsumsi proses zombie adalah slot dalam tabel proses yang menyimpan PID-nya, kode keluar dan beberapa "statistik vital" lainnya dari proses pada saat kematiannya.
Jika proses orang tua meninggal sebelum anak-anaknya, proses anak yatim secara otomatis diadopsi oleh PID # 1, yang memiliki tugas khusus untuk terus menelepon wait(2)
sehingga setiap proses anak yatim tidak akan bertahan sebagai zombie.
Jika proses zombie perlu beberapa menit untuk dihapus, ini menunjukkan bahwa proses induk zombie sedang berjuang atau tidak melakukan tugasnya dengan baik.
Ada deskripsi yang tidak jelas tentang apa yang harus dilakukan jika terjadi masalah zombie dalam sistem operasi mirip Unix: "Anda tidak dapat melakukan apa pun untuk zombie itu sendiri, karena mereka sudah mati. Sebaliknya, bunuh master zombie jahat! " (Yaitu proses induk dari zombie yang merepotkan)
ps
: 'S' adalah untuk I / O menunggu bahwa kernel dapat membatalkan untuk mengirimkan sinyal, dan 'D' untuk mereka yang tidak bisa.