Zombie-prosessi

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 8.6.2019 tarkistetusta versiosta . tarkastukset vaativat 5 muokkausta .

Zombie-prosessi , zombie ( eng.  zombie process , eng.  defunct process ) - Unix -järjestelmän aliprosessi , joka on suorittanut suorituksensa, mutta joka on edelleen läsnä käyttöjärjestelmän prosessien luettelossa, jotta pääprosessi voi lukea poistumiskoodin .

Etymologia

Johtuu sanasta " zombe ", joka tarkoittaa "elävää kuollutta" ( oksymoron , englanniksi  undead ). Termi on elävä metafora siitä tosiasiasta, että prosessi on "kuollut", mutta ei "haudattu".

Zombien nousu

Kun prosessi lopetetaan (joko normaalisti tai käsittelemättömän signaalin seurauksena), se vapauttaa kaikki resurssinsa ja siitä tulee "zombie" - tyhjä merkintä prosessitaulukossa, joka tallentaa poistumistilan emoprosessin luettavaksi.

Zombie-prosessi on olemassa, kunnes pääprosessi lukee tilansa järjestelmäkutsulla wait() , jolloin prosessitaulukon merkintä vapautuu.

Kun prosessi päättyy, järjestelmä ilmoittaa emoprosessille lapsen lopettamisesta SIGCHLD -signaalilla , joten voi olla kätevää (mutta ei välttämätöntä) kutsua wait()käsittelijä tälle signaalille.

Zombie Trouble

Zombit eivät vie muistia (kuten orpoprosessit ), vaan lukitsevat merkinnät prosessitaulukkoon, jonka koko on rajoitettu jokaiselle käyttäjälle ja koko järjestelmälle.

Kun kirjoitusraja saavutetaan, kaikki zombien luovaa pääprosessia suorittavan käyttäjän prosessit eivät voi luoda uusia aliprosesseja. Lisäksi käyttäjä, jonka nimellä pääprosessi on käynnissä, ei pysty kirjautumaan konsoliin (paikalliseen tai etäkäyttöön) tai suorittamaan komentoja jo avoimessa konsolissa (koska sh -komentotulkin on luotava uusi prosessi tätä varten) , ja toiminnan palauttaminen (loukkaavan ohjelman lopettaminen) edellyttää järjestelmänvalvojan toimia.

Joskus, jos pääprosessi on käynnissä pääkäyttäjän puolesta, tietueiden vapauttaminen (prosessin uudelleenkäynnistäminen) saattaa vaatia uudelleenkäynnistyksen (ja usein vain kova uudelleenkäynnistys). Jotkin käyttöjärjestelmät (kuten Sun Solaris ) kaatavat osan käynnissä olevista prosesseista tämän tilanteen sattuessa palauttaen järjestelmän kuntoon.

Jokainen prosessi on zombie-tilassa, kun se päättyy, ja ennen kuin esi-isä on lukenut lopetustilan, tämä on täysin normaalia ja lyhytikäiset zombie-prosessit eivät ole ongelma järjestelmässä. Samaan aikaan useat ohjelmointivirheet voivat johtaa käsittelemättömien zombie-prosessien syntymiseen ja kerääntymiseen järjestelmään (eli jo päättyneisiin prosesseihin, joiden emo ei lue niiden tilaa).

Lapsiprosessien lopetuskäsittelyn huomiotta jättäminen ei ole oikein, mutta se ei yleensä johda ongelmiin lyhytikäisille ohjelmille, koska prosessin päättyessä kaikista sen lapsista tulee prosessin lapsia init, joka lukee jatkuvasti zombie-lastensa tilan ja tyhjentää. prosessitaulukko. Tämän mekanismin mahdollistamiseksi suoritetaan tavallinen "double fork()" -daemon-aloitustekniikka: välipäällikkö lopettaa tehden prosessista lapsensa vanhemman init.

Pitkäikäisten ja usein lapsia luovien ohjelmien osalta lapsiohjelman lopettamisen ohjaus on käsiteltävä oikein, koska käsittelemättömien zombien kerääntyminen johtaa "resurssivuotoon" prosessitaulukon merkintöjen kerääntymisen muodossa.

Linuxissa ytimestä 3.4 alkaen prosessilla on kyky julistaa itsensä orpoksi omaksujaksi ("subreaper") initkomennolla varustetun prosessin sijaan prctl(PR_SET_CHILD_SUBREAPER).

Esimerkkejä ohjelmista, jotka luovat zombeja eri ohjelmointikielillä

Xi

#include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main () { pid_t child_pid ; lapsi_pid = haarukka (); if ( lapsen_tunnus > 0 ) { nukkua ( 60 ); } else { poistu ( 0 ); } paluu 0 ; }

Python

#!/usr/bin/env python2 # -*- koodaus: utf8 -*- tuonti aliprosessi tuontiaika tuonti ketjutus _ # Spawn-prosessi 'ls' valitsimella '-l' proc = aliprosessi . Popen ([ 'ls' , '-l' ]) # Pysäytä ohjelman pääsäie 5 sekunniksi. Tämän prosessin aikana # prosessin tila on "zombit", vaikka prosessi on jo poistunut , koska # aikaprosessin tulosta ei ole käsitelty . nukkua ( 5 ) # Tässä paikassa zombie katoaa, koska. ohjelma huuhtelee prosessin # I/O-puskurit ja lukee sen poistumiskoodin proc . kommunikoida () aika . nukkua ( 5 )

Muut

  • Zombit eivät voi vastaanottaa signaaleja, joten niitä ei voida tappaa apuohjelmalla tai tappamiskutsulla . Joko pääprosessi tai sen lopettaminen voi poistaa ne.
  • Kaikilla Unixin prosesseilla on omat vanhempansa - prosessit, joilla ei ole tai ovat menettäneet vanhempiaan ( " orpoprosessit " ydin (prosessi, jossa PID = 0). init käsittelee aina SIGCHLD:n, joten tällaiset prosessit eivät koskaan jätä zombeja. 
  • Zombit voidaan tunnistaa prosessiluettelossa (näkyy ps -apuohjelmalla ) "Z"-lipusta STAT-sarakkeessa.
  • Hyväksi ohjelmointityyliksi katsotaan aina käsitellä SIGCHLD.
  • Perl- ja Python - skriptikielet käsittelevät implisiittisesti SIGCHLD:tä, jos ohjelma määrittää sen ohitettavaksi.

Katso myös