Programe care sunt slab scrise sau performante pot pleca prost procese zombie ascunzând în interiorul computerului dvs. Linux. Aflați cum sunt create zombi și cum le puteți lăsa în sfârșit să se odihnească.
Cum funcționează statele de proces la Linux
Linux, desigur, trebuie să urmărească toate aplicațiile și daemoanele care rulează pe computer. Una dintre modalitățile de care face acest lucru este prin menținerea tabelului de procesare. Aceasta este o listă de structuri din memoria kernel-ului. Fiecare proces are o intrare în această listă care conține câteva informații despre el.
Nu există o mare afacere în fiecare dintre structurile de masă de proces. Ei dețin ID-ul procesului , câteva alte elemente de date și un indicator la blocul de control al procesului (PCB) pentru acest proces.
Este PCB care deține numeroasele detalii Linux trebuie să privească sau să se stabilească pentru fiecare proces. PCB este actualizat, de asemenea, ca proces, este creat, dat timp de procesare și, în cele din urmă, distrus.
PCB-ul Linux conține peste 95 de câmpuri.
Este definită
ca o structură numită
Task_struct.h.
, și este de peste 700 de linii lungi. PCB conține următoarele tipuri de informații:
- Procesul de stat : Statele sunt descrise mai jos.
- Numărul procesului : Identificatorul său unic în sistemul de operare.
- Contor de programe : Când acest proces este următorul acces la CPU, sistemul va folosi această adresă pentru a găsi următoarea instrucțiune a procesului care ar trebui executat.
- Registre : Lista înregistrărilor CPU utilizate de acest proces. Lista ar putea conține acumulatori, registre index și pointeri de stivă.
- Deschideți lista de fișiere : Fișiere asociate cu acest proces.
- Programarea informațiilor CPU : Folosit pentru a determina cât de frecvent și cât timp, timpul de procesare a CPU este acordat acestui proces. Prioritatea procesului, indicii la cozi de programare și alți parametri de planificare trebuie înregistrate în PCB.
- Informații despre gestionarea memoriei : Detalii despre memorie Acest proces utilizează, cum ar fi adresele de pornire și de capăt ale memoriei procesului și indicatoarele în paginile de memorie.
- Informații despre statut I / O : Orice dispozitive de intrare sau ieșire utilizate de proces.
"Starea procesului" poate fi oricare dintre următoarele:
- R: Un proces de funcționare sau rulat. Rularea înseamnă că primește cicluri CPU și execută. Un proces runnable este gata să ruleze și să aștepte un slot CPU.
- S: Un proces de dormit. Procesul așteaptă ca o acțiune să fie completă, cum ar fi o operație de intrare sau de ieșire sau pentru ca o resursă să devină disponibilă.
- D: Procesul se află într-o stare de somn neîntreruptibilă. Folosește un apel de blocare a sistemului și nu poate continua până când apelurile sistemului au fost finalizate. Spre deosebire de starea de "somn", un proces în această stare nu va răspunde la semnale până la finalizarea apelului de sistem și execuția a revenit la proces.
-
T:
Procesul a terminat (oprit) deoarece a primit
Sigstop.semnal. Aceasta va răspunde doar la.Sigkill.sauSigcont.semnale, care fie ucide procesul, fie instruiți-o să continue, respectiv. Aceasta este ceea ce se întâmplă atunci când schimbați de la prim plan (FG.) la fundal (bg)sarcini. -
Z:
Un proces zombie. Când un proces completează, nu dispare doar. Ea eliberează orice memorie pe care o folosește și se îndepărtează din memorie, dar intrarea sa în tabelul de proces și PCB rămâne. Starea sa este setată la
Ieșire_zombie., iar procesul său părinte este notificat (de cătreSigchld.semnal) că procesul copilului a terminat.
În statul zombie, procesul părinte numește unul dintre
aștepta()
Familiile de funcții
când procesul copilului este creat. Apoi așteaptă o schimbare de stat în procesul copilului. Procesul copilului a fost oprit, continuat sau ucis de un semnal? A terminat încheierea prin finalizarea naturală a codului său?
Dacă schimbarea statului este una, ceea ce înseamnă că procesul copilului sa oprit, codul său de ieșire este citit. Apoi, PCB-ul copilului este distrus și intrarea sa în tabelul de proces este eliminată. În mod ideal, toate acestea se întâmplă în clipi de ochi, iar procesele din statul zombie nu există foarte mult timp.
LEGATE DE: Cum se execută și controlează procesele de fundal pe Linux
Ce cauzează procesele zombie pe Linux?
Un proces mamă prost scris ar putea să nu sune
aștepta()
funcția când este creat procesul pentru copii. Aceasta înseamnă că nimic nu se uită la schimbările de stat în procesul copilului și
Sigchld.
semnalul va fi ignorat. Sau, probabil, o altă aplicație afectează executarea procesului părinte, fie din cauza programării slabe, fie a intenției rău intenționate.
Cu toate acestea, în cazul în care procesul părinte nu se uită la modificările de stat în procesul copilului, nu va avea loc menajele de sistem adecvate. PCB și intrarea în tabelul de proces nu vor fi eliminate atunci când procesul copilului se termină. Acest lucru are ca rezultat starea zombie care nu au fost niciodată eliminate din PCB.
Zombies folosesc un pic de memorie, dar ei nu prezintă de obicei o problemă. Intrarea în tabelul de proces este mică, dar, până când este eliberat, ID-ul procesului nu poate fi refolosit. Pe un sistem de operare pe 64 de biți, este puțin probabil să provoace probleme, deoarece PCB este mult mai mare decât intrarea tabelului de proces.
Un număr mare de zombi ar putea afecta, în mod evidebil, cantitatea de memorie liberă pentru alte procese. Dacă aveți însă multe zombi, aveți o problemă serioasă cu aplicația parentală sau un bug de sistem de operare.
Cum să eliminați procesele zombie
Nu poți ucide un proces zombie pentru că e deja mort. Nu va răspunde la niciun semnal, deoarece a fost eliminat din memorie - nu există unde să trimiteți a
Sigkill.
semnal. Puteți încerca să trimiteți
Sigchld.
Semnal la procesul părinte, dar dacă nu a funcționat când procesul copilului sa terminat, este puțin probabil să lucreze acum.
Singura soluție fiabilă este aceea de a ucide procesul părinte. Când se termină, procesele sale de copil sunt moștenite de către
init.
Procesul, care este primul proces de funcționare într-un sistem Linux (ID-ul procesului este 1).
În
init.
Procesul efectuează în mod regulat curățarea necesară a zombiilor, astfel încât să le omorâți, trebuie doar să ucizi procesul care le-a creat. În
top
Comanda este o modalitate convenabilă de a vedea dacă aveți zombi.
Introduceți următoarele:
Top
Acest sistem are opt procese zombie. Noi
se poate afișa aceste lucruri
Folosind.
ps.
comanda
și tubulându-l
Egrep.
. Din nou, procesele zombie au un steag de stat de "z" și de obicei veți vedea "defunctul".
Introduceți următoarele:
PS Aux | egrep "z | defuncct"
Procesele zombie sunt enumerate.
Aceasta este o modalitate nefavorabilă de a descoperi ID-urile procesului de zombi decât derularea înainte și înapoi
top
. De asemenea, vedem că o cerere numită "Badprg" a dat naștere acestor zombi.
ID-ul procesului primului zombie este de 7641, dar trebuie să găsim ID-ul procesului procesului părinte. Putem face acest lucru prin utilizarea
din nou. Vom folosi opțiunea de ieșire (
ps.
-O.
) a spune
ps.
pentru a afișa numai ID-ul procesului părintelui, apoi transmiteți-l cu
ppid =.
steag.
Procesul pe care dorim să îl găsim va fi indicat prin utilizarea
-p.
(Process) opțiune și apoi trecerea în ID-ul procesului Zombie.
Prin urmare, introducem următoarea comandă pentru a căuta informațiile despre proces pentru procesul 7641, dar va raporta doar ID-ul procesului părinte:
PS -O PPID = -P 7641
Ni sa spus că ID-ul procesului părinte este de 7636. Acum putem referi acest lucru prin utilizarea
ps.
inca o data.
Vedem că acest lucru se potrivește cu numele procesului părinte de la mai devreme. Pentru a ucide procesul părinte, utilizați opțiunea Sigkill cu comanda de ucidere după cum urmează:
Kill -Sigkill 7636
În funcție de proprietarul procesului părinte, este posibil să fie necesar să utilizați
sudo.
.
Zombies nu sunt înfricoșătoare ...
... dacă nu se află într-o hoardă masivă. Câteva nu sunt nimic de îngrijorat și o repornire simplă va șterge.
Cu toate acestea, dacă observați că o aplicație sau un proces este întotdeauna zombi de reproducere, asta ar trebui să te uiți. Este cel mai probabil doar un program scris greșit, caz în care, poate că există o versiune actualizată care curăță în mod corespunzător după procesele copilului.