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 .
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".
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.
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).