Bagaimana linux menangani proses zombie

12

Proses zombie dibuat dalam sistem Unix / Linux. Kami dapat menghapusnya melalui killperintah.

Tetapi apakah ada mekanisme pembersihan di Linux untuk menangani proses zombie?

Atur
sumber

Jawaban:

18

Proses zombie sudah mati. Anda tidak dapat membunuh mereka. The killperintah atau system call tidak berpengaruh pada proses zombie. (Anda dapat membuat zombie pergi kill, tetapi Anda harus menembak orang tua, bukan zombie, seperti yang akan kita lihat sebentar lagi.)

Proses zombie sebenarnya bukan proses, itu hanya entri di tabel proses. Tidak ada sumber daya lain yang terkait dengan proses zombie: tidak memiliki memori atau kode apa pun yang sedang berjalan, tidak ada file yang terbuka, dll.

Ketika suatu proses mati, hal terakhir yang harus dilakukan, setelah semua sumber daya lainnya dibersihkan, adalah entri dalam tabel proses. Entri ini disimpan di sekitar, membentuk zombie, untuk memungkinkan proses induk untuk melacak status keluar anak. Orang tua membaca status keluar dengan memanggil salah satu waitkeluarga syscalls; pada titik ini, zombie menghilang. Memanggil waitdikatakan menuai anak, memperluas metafora zombie mati tetapi dalam beberapa cara masih belum sepenuhnya diproses menjadi kehidupan setelah kematian. Induk juga dapat menunjukkan bahwa ia tidak peduli (dengan mengabaikan sinyal SIGCHLD, atau dengan memanggil sigactiondengan SA_NOCLDWAITbendera), dalam hal ini entri dalam tabel proses segera dihapus ketika anak meninggal.

Jadi zombie hanya ada ketika proses telah mati dan orang tuanya belum menelepon wait. Keadaan ini hanya bisa bertahan selama orang tua masih berjalan. Jika orang tua meninggal sebelum anak atau mati tanpa membaca status anak, proses orang tua zombie diatur ke proses dengan PID 1, yaitu init. Salah satu tugasnya initadalah menelepon waitdalam satu lingkaran dan karenanya menuai setiap proses zombie yang ditinggalkan oleh orang tuanya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6

Anda bukan killproses zombie, karena sudah mati.

Proses zombie harus waitdiedit oleh orang tua mereka, sehingga status keluar mereka harus dikumpulkan.

Satu-satunya "mekanisme pembersihan built-in" yang ada di Linux, bekerja untuk kasus dimana setiap proses orangtua mati sebelum mengumpulkan status keluar anak-anaknya. Dalam hal ini, setiap anak diwarisi oleh initproses, yang akan waitpada anak itu, mengumpulkan status keluarnya dan menghapus entri di tabel proses.

chrk
sumber
3

Segera setelah orang tua dari suatu proses mati, proses menjadi yatim piatu - mengabaikan apakah itu zombie atau bukan. Apa yang terjadi pada anak yatim? Mereka mendapatkan orangtua baru, yang disebut init. initakan waitpada setiap anak yatim yang dikumpulkan, sehingga menuai anak yatim (yang mungkin juga menjadi zombie juga).

Philipp Murry
sumber
1
Tidak. Tepatnya, inittidak membunuh proses apa pun . Hanya waitpada anak-anaknya untuk mengumpulkan status mereka.
chrk
1
@ chrk, Philipp: istilah yang biasa adalah menuai .
Gilles 'SO- berhenti menjadi jahat'
1

Tidak, tidak ada mekanisme pembersihan bawaan untuk zombie. Zombi pergi ke surga zombie setelah orang tua mereka terbunuh. Sampai saat itu, OS menjaga mereka untuk mengembalikan status keluar ke induk.

unxnut
sumber
jadi .. bukankah ini memiliki efek negatif dari memori dll?
1
sebenarnya, ketika induk dari dies zombie, yang initproses mengambil alih dan akan memanggil waititu
Tidak, semua sumber daya yang dialokasikan untuk proses dilepaskan, kecuali untuk entri dalam tabel proses.
unxnut