GNU/Linux >> Belajar Linux >  >> Linux

Apa yang Dilakukan Program Saat Mengirim Sinyal Sigkill?

Ketika saya menggunakan killall -9 name untuk membunuh sebuah program, negara menjadi zombie. Beberapa menit kemudian, itu benar-benar berhenti.
Jadi, apa yang terjadi selama beberapa menit itu?

Jawaban yang Diterima:

Program 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 lebih banyak waktu CPU untuk menjalankan kode ruang pengguna. Jika proses memiliki utas yang mengeksekusi kode ruang pengguna pada CPU/inti lain pada saat penjadwal membuat keputusan ini, utas tersebut juga akan dihentikan. (Dalam sistem inti tunggal, ini dulu jauh lebih sederhana:jika satu-satunya inti CPU dalam sistem yang menjalankan penjadwal, itu menurut definisi tidak menjalankan proses pada waktu yang sama!)

Jika proses/utas sedang mengeksekusi kode kernel (misalnya panggilan sistem, atau operasi I/O yang terkait dengan file yang dipetakan memori) pada saat SIGKILL, itu menjadi sedikit lebih rumit:hanya beberapa panggilan sistem yang dapat diinterupsi, jadi kernel secara internal menandai proses sebagai dalam status "sekarat" khusus sampai panggilan sistem atau operasi I/O diselesaikan. Waktu CPU untuk menyelesaikannya akan dijadwalkan seperti biasa. Panggilan sistem yang dapat diinterupsi atau operasi I/O akan memeriksa apakah proses yang memanggilnya mati pada titik penghentian yang sesuai, dan akan keluar lebih awal dalam kasus tersebut. Operasi yang tidak pernah terputus akan selesai, dan akan memeriksa status "sekarat" sebelum kembali ke kode ruang pengguna.

Setelah rutinitas kernel dalam proses diselesaikan, status proses diubah dari "sekarat" menjadi "mati" dan kernel mulai membersihkannya, mirip dengan saat program keluar secara normal. Setelah pembersihan selesai, kode hasil yang lebih besar dari-128 akan ditetapkan (untuk menunjukkan bahwa proses dihentikan oleh sinyal; lihat jawaban ini untuk detail yang berantakan), dan proses akan beralih ke status "zombie". . Induk dari proses yang dimatikan akan diberi tahu dengan sinyal SIGCHLD.

Akibatnya, proses itu sendiri tidak akan pernah mendapatkan kesempatan untuk benar-benar memproses informasi yang telah diterimanya dalam SIGKILL.

Ketika suatu proses dalam keadaan "zombie" itu berarti proses tersebut sudah mati, tetapi proses induknya belum mengakui hal ini dengan membaca kode keluar dari proses mati menggunakan wait(2) panggilan sistem. Pada dasarnya satu-satunya sumber daya yang dikonsumsi proses zombie lagi adalah slot di tabel proses yang menyimpan PID-nya, kode keluar, dan beberapa "statistik vital" lainnya dari proses pada saat kematiannya.

Terkait:Status dan dependensi layanan Solaris?

Jika proses induk mati sebelum anaknya, proses anak yatim secara otomatis diadopsi oleh PID #1, yang memiliki tugas khusus untuk terus memanggil wait(2) sehingga proses yatim piatu tidak akan bertahan sebagai zombie.

Jika proses zombie membutuhkan waktu beberapa menit untuk menyelesaikannya, ini menunjukkan bahwa induk proses zombie sedang berjuang atau tidak melakukan tugasnya dengan benar.

Ada deskripsi singkat tentang apa yang harus dilakukan jika terjadi masalah zombie di 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)


Linux
  1. Apa Artinya Dalam Keluaran Dari Ps?

  2. Apa arti &di akhir perintah linux?

  3. Apa artinya membunuh -3?

  1. Bagaimana Jika 'kill -9' Tidak Berfungsi?

  2. Apa Penyebab Berbagai Sinyal Terkirim?

  3. Apa yang terjadi saat mengirim SIGKILL ke Proses Zombie di Linux?

  1. tee:Apa sebenarnya yang dilakukan opsi --ignore-interrupts?

  2. Apa yang dilakukan ENV (“_”) untuk anti-debugging?

  3. Kapan sistem mengirimkan SIGTERM ke suatu proses?