Linuxi zombiprotsess viitab juba surnud protsessidele, kuid on ühel või teisel viisil endiselt süsteemi protsessitabelis olemas. Lünk on see, et mingil põhjusel ei puhastanud vanem seda protsessi protsessitabelist. Tavaliselt juhtub see pärast täitmisprotsessi lõppu.
Linuxi tavapärane toimimisviis on see, et pärast protsessi lõpuleviimist teavitab ta oma vanemat, kes vastutab protsessi tabelist eemaldamise eest. Kahjuks ei saa vanem protsessi mälust eemaldada, kui vanem ei saa lapse olekut lugeda. Nii juhtub, et meil on protsessitabelis surnud protsessid. Neid nimetame zombiprotsessideks.
Mis põhjustab Linux Zombie protsesse?
Lapse protsessi loomisel võib halvasti kirjutatud vanemaprotsess kutsuda funktsiooni wait (). Seetõttu jäävad selle zombilapsed mällu seni, kuni nad kustutatakse.
See tähendab, et miski ei jälgi imiku protsessi olekumuutuste osas ja SIGCHLD signaali ignoreeritakse. Võib-olla sekkub mõni muu rakendus vanemaprotsessi käivitamisse kas labase programmeerimise või pahatahtliku kavatsuse kaudu.
Korralikku süsteemihoidmist ei toimu, kui vanemaprotsess ei jälgi lapse protsessis olekumuutusi.
Kui imiku protsess on lõpule jõudnud, PCB-d ja protsessitabeli kirjet ei eemaldata. Selle tagajärjel ei eemaldata zombieolekut kunagi PCB-st.
Zombidel on küll veidi mälu, kuid see pole tavaliselt probleem. Kuna Linuxi süsteemidel on piiratud arv PID-sid (ehkki palju), ei saa piisavalt palju PID-sid zombida, kui ühtegi teist protsessi käivitada. On kahtlane, kas see juhtub.
Kuid zombitud protsessid viitavad sellele, et rakendusega on midagi valesti läinud ja konkreetses programmis võib olla viga.
Andmekeskuste tarkvaravigu ei tohiks lubada ja nendega tuleb tegeleda.
Sa peaksid silma peal hoidma ja hävitama zombiprotsesse, kuni viga on fikseeritud.
Protsessi ID-d ei saa enne selle käivitamist uuesti kasutada, seega on protsessitabeli kirje väike.
Kuna PCB on palju suurem kui protsessitabeli kirje 64-bitises operatsioonisüsteemis, ei põhjusta see tõenäoliselt probleeme.
Muude protsesside jaoks saadaolevat mälumahtu võib mõjutada suur hulk zombisid. Kui teil on aga nii palju zombisid, on teil vanemrakendusega või operatsioonisüsteemi veaga tõsine probleem.
Niisiis, mida sa teed, kui protseduurist saab zombie? Saate jälile ja kõrvaldate zombiprotsessid.
Kuidas leida zombiprotsessi?
Esmane peatus süsteemi zombiprotsessi tapmisele on kõigepealt selle tuvastamine. Kuna init-protsess puhastub pärast zombisid regulaarselt, tuleb neist vabanemiseks vaid hävitada protsess, mis neid lõi.
Ülemine käsk on kiire viis kontrollida, kas teie piirkonnas on zombisid. Selle saavutamiseks täidame järgmise käsu.
üles
Selle süsteemi zombiprotsesside arv kuvatakse väljundil. Meie ülaltoodud juhul on meil 0 zombit.
Kasutades käsklust ps ja sisestades selle egrep-i, saame nende loendi. Zombi protsesside osariigi lipp on "Z" ja mõnikord näete ka "kadunud".
tuts @ fosslinux: ~ $ ps aux | egrep "Z | kadunud"
Jaotame selle käsu erinevad jaotised.
Z väljundi veerus STAT tähistab zombiprotsessi.
[defunct] väljundi viimases (COMMAND) veerus identifitseerib ka zombiprotsessi.
Ideaalis pole zombiprotsessi võimalik tappa, sest see on surnud. Selle asemel teavitame vanemat proovimast ja lugemast lapse protsessi olekut ning puhastades nad lõpuks süsteemi tabelist. Selle protsessi käivitamiseks saadame SIGCHLD signaali protsessi vanemale. Vanemprotsessi ID või nn PID tuvastamine hõlmab järgmise käsu käivitamist:
tuts @ fosslinux: ~ $ ps -o ppid =
Pärast Zombie PID saamist kasutage varem tuvastatud vanemprotsesside jaoks käsku SIGCHLD.
tuts @ fosslinux: ~ $ kill -s SIGCHLD
Mõnel juhul ei saa see Zombie protsessi selgeks. See kutsub meid tegelema plaaniga b või c. Eelnev tähendab vanemprotsessi taaskäivitamist või algprotsesside tapmist. Teiselt poolt hõlmavad viimased juhtumid süsteemi taaskäivitamist, eriti kui Zombie protsess võib Zombie protsessi tõttu põhjustada katkestuse või tohutu tõusu.
Allpool on käsk tappa vanem protsess.
tuts @ fosslinux: ~ $ tappa -9
Juhul, kui vanemaprotsess tapetakse, tapetakse laiemalt ka kõik antud vanema lapseprotsessid. Kui üks lapseprotsessidest on antud ajahetkel kriitiline, peate võib-olla tapmise edasi lükkama, kuni see on ohutu. Teisest küljest võib kiire topeltkontroll teile öelda, kui palju mälu või töötlemisvõimsust Zombie protsessid kulutavad. See aitab kindlaks teha, kas parem võimalus on tappa vanemprotsessor süsteemi taaskäivitamiseks juba kavandatud süsteemi hoolduse järgmises tsüklis.
Kuidas töötavad Linuxis protsessid??
Muidugi peab Linux jälgima kõiki teie arvutis töötavaid rakendusi ja deemoneid. Protsessitabeli hooldamine on üks selle saavutamise viise.
See on tuuma mälustruktuuride loend. Selles loendis on kirje iga protsessi kohta, mis sisaldab selle kohta teavet. Iga protsessitabeli struktuur sisaldab väga vähe teavet.
Nad salvestavad protsessi ID, mõned muud infokillud ja kursori protsessi juhtplokile (PCB).
PCB on koht, kuhu Linux salvestab kogu teabe, mida ta vajab iga protsessi jaoks otsimiseks või seadistamiseks. Protsessi loomisel muudetakse seda, antakse töötlemisaeg ja seejärel hävitatakse.
Linuxi PCB-l on üle 95 välja. See on määratletud ülesande struktuuris, mis on üle 700 rea pikk. Trükkplaadilt leiate järgmist tüüpi teavet:
Protsessi olekuid illustreeritakse allpool
- Protsessi number: operatsioonisüsteemi eristav tunnus.
- Programmiloendur: kui sellele protsessile antakse uuesti juurdepääs protsessorile, kasutab süsteem selle aadressi abil täidetava protsessi järgmise juhise leidmiseks.
- Registrid: see protseduur kasutab loendit protsessoritest, mida nimetatakse registriteks. Akumulaatorid, registriregistrid ja virnaosutajad võidakse lisada loendisse.
- Avatud failide loend: selle protseduuriga seotud failid on lisatud avatud failide loendisse.
- Teave protsessori ajastamise kohta: kasutatakse selleks, et arvutada, kui tihti ja kui kaua see protsess protsessori töötlemisaega saab.
PCB peab registreerima protsessi prioriteedi, viited sõiduplaanijärjekordadele ja muud sõiduplaani parameetrid. - Teave mäluhalduse kohta: teave selle protsessi käigus kasutatava mälu kohta, näiteks protsessimälu algus- ja lõpuaadress, samuti näpunäited mälulehekülgedele.
- Teave sisend- / väljundoleku kohta: kõik seadmed, mida protsess kasutab sisendite või väljunditena.
Protsessi olekuks võib olla ükskõik milline järgmistest:
- R: Töötav või käivitatav protsess. See töötab, mis tähendab, et see hankib ja täidab protsessori tsükleid.
Käivitamiseks valmis protseduur ootab protsessori pesa. - S: Magamise tegu.
Protsess ootab toimingu, näiteks sisendi või väljundi lõpuleviimist. Või ressursi kättesaadavus. - D: Protseduur on katkematu une seisundis. See kasutab blokeerivat süsteemikõnet, mis tähendab, et see ei jätku enne, kui süsteemikõned on lõpule viidud. Erinevalt olekust „unerežiim” ei reageeri selles olekus signaalidele enne, kui süsteemikõne on lõpule viidud ja protsess on protsessile naasnud.
- T: Kuna see sai signaali SIGSTOP, on protsess lõppenud (peatatud).
See reageerib ainult signaalidele SIGKILL või SIGCONT, kas tapab või käsib protsessi jätkata. Kui vahetate esiplaanilt (fg) ülesandele (bg), siis see juhtub. - Z: tähistab Zombie protsessi. Kui protsess on lõppenud, ei kao see lihtsalt ära. Selle asemel vabastab see kogu praegu kasutatava mälu ja väljub mälust, kuid selle protsessitabeli sisestus ja PCB jäävad alles.
Selle olekuks on seatud EXIT ZOMBIE ja vanemprotsessile öeldakse, et imiku protsess on lõpule viidud signaali SIGCHLD kaudu.
Järeldus
Kui nad pole osa suurest hordist, pole zombid nii kahjulikud. Mõni üksik pole suurem asi ja kiire taaskäivitamine puhastab need. Siiski tuleb arvestada ühe punktiga.
Linuxi arhitektuurides on maksimaalne protsesside arv ja sellest tulenevalt maksimaalne protsesside ID-numbrite arv. Kui arvuti on saavutanud maksimaalse zombiprotsesside arvu, ei saa uusi protsesse käivitada.
Zombie protsessid pole protsessid; nad on surnud protsesside jäänused, mida nende vanemprotsess pole õigesti puhastanud. Kui aga märkate, et konkreetne rakendus või protsess kudevad pidevalt zombisid, peaksite seda veelgi uurima.
Tõenäoliselt on see lihtsalt halvasti kirjutatud programm; sel juhul on võib-olla mõni uuendatud versioon, mis puhastatakse pärast seda, kui tema laps on korralikult töötlenud.