Programy, które są słabo napisane lub wykonywane źle mogą odejść Procesy zombie. Czuwanie wewnątrz komputera Linux. Dowiedz się, jak tworzone są zombie i jak w końcu możesz je spoczywać.
Jak układy procesowe działają na Linuksie
Oczywiście Linux ma oczywiście śledzić wszystkie aplikacje i demony działające na komputerze. Jednym ze sposobów, jakie to jest utrzymanie tabeli procesowej. Jest to lista struktur w pamięci jądra. Każdy proces ma wpis na tej liście, który zawiera pewne informacje o tym.
W każdym z konstrukcji tabeli procesów nie ma znaczenia. Trzymają Identyfikator procesu , Kilka innych elementów danych i wskaźnik do bloku sterowania procesem (PCB) dla tego procesu.
To PCB, który posiada wiele szczegółów Linuksa musi spojrzeć lub ustawiać dla każdego procesu. PCB jest również aktualizowany jako proces, który jest tworzony, podany czas przetwarzania i wreszcie zniszczony.
PCB Linux zawiera ponad 95 pól.
Jest zdefiniowany
Jako struktura zwana
Task_struct.h.
i jest ponad 700 linii długości. PCB zawiera następujące typy informacji:
- Stan procesu. : Państwa są opisane poniżej.
- Numer procesu. : Jego unikalny identyfikator w systemie operacyjnym.
- Licznik programu : Gdy ten proces jest następny dostęp do CPU, system użyje tego adresu, aby znaleźć następną instrukcję procesu, który powinien zostać wykonany.
- Rejestry. : Lista rejestrów procesora używanych przez ten proces. Lista może zawierać akumulatory, rejestry indeksu i wskaźniki stosu.
- Otwórz listę plików. : Pliki związane z tym procesem.
- Informacje o planowaniu procesora : Służy do ustalenia, jak często, a na ten proces przyznawany jest czas przetwarzania procesora. Priorytet procesu, wskaźniki do kolejki planowania i inne parametry planowania muszą być rejestrowane w PCB.
- Informacje o zarządzaniu pamięcią : Szczegóły dotyczące pamięci Ten proces używa, takich jak adresy startu i końcowego pamięci procesowej i wskaźniki do stron pamięci.
- Informacje o statusie I / O : Wszelkie urządzenia in- lub wyjściowe używane przez proces.
"Stan procesu" może być dowolnym z następujących:
- R: Proces biegania lub zrównoważony. Uruchamianie oznacza, że otrzymuje cykle procesora i wykonanie. Runnable proces jest gotowy do uruchomienia i oczekiwania na szczelinę CPU.
- S: Proces spania. Proces czeka na działanie do zakończenia, takiego jak działanie in- lub wyjście, lub dla zasobu, aby stać się dostępny.
- D: Proces jest w stanie awansowanym uśpienia. Używa połączenia blokującego i nie może kontynuować, dopóki nie zakończono połączenia systemowe. W przeciwieństwie do stanu "snu", proces w tym stanie nie odpowie na sygnały, dopóki nie zostanie zakończona, a wykonanie powróciło do procesu.
-
T:
Proces zakończył się (zatrzymany), ponieważ otrzymał
Sigstop.sygnał. Ono odpowiedzą tylko doSigkill.lubSigcont.sygnały, które albo zabijają proces lub instruują go, aby kontynuować odpowiednio. Tak się dzieje, gdy się zmieniasz na pierwszym planie (fg.) do tło (bg)zadania. -
Z:
Proces zombie. Kiedy proces się kończy, nie tylko zniknie. Uwalnia każdą pamięć, używa i usuwa się z pamięci, ale jego wpis w tabeli procesowej i PCB pozostają. Jego stan jest ustawiony na
Exit_Zombie.i proces macierzysty jest powiadamiany (przezSigłowysygnał), który zakończy się proces dziecka.
W stanie zombie proces macierzysty wywołuje jeden z
czekać()
Rodziny funkcji
Po utworzeniu procesu dziecka. Następnie czeka na zmianę stanu w procesie dziecka. Czy proces dziecka został zatrzymany, kontynuowany lub zabity przez sygnał? Czy zakończyło się, biegając przez naturalne zakończenie swojego kodu?
Jeśli zmiana stanu jest to, co oznacza, że proces dzieci przestał działać, jego kod wyjścia jest odczytywany. Następnie PCB dziecka jest zniszczony, a jego wpis w tabeli procesowej jest usuwany. Idealnie, wszystko dzieje się w mgnieniu oka, a procesy w stanie zombie nie istnieją bardzo długo.
ZWIĄZANE Z: Jak uruchomić i sterować procesami tła na Linuksie
Co powoduje procesy zombie na Linuksie?
Słabo pisany proces macierzystym może nie zadzwonić
czekać()
funkcja, gdy proces dziecka jest tworzony. Oznacza to, że nic nie obserwuje dla zmian państwowych w procesie dzieci i
Sigłowy
Sygnał zostanie zignorowany. Albo może kolejna aplikacja wpływa na wykonanie procesu macierzystego, z powodu słabego programowania lub złośliwego zamiaru.
Jednakże, jeśli proces macierzysty nie obserwuje zmian państwa w procesie dzieci, właściwy system sprzątania nie wystąpi. PCB i wpis w tabeli procesowej nie zostaną usunięte, gdy proces dziecko zakończy się. Powoduje to, że stan Zombie nigdy nie jest usuwany z PCB.
Zombie używają odrobiny pamięci, ale zwykle nie stanowią problemu. Wpis w tabeli procesowej jest mały, ale dopóki nie zostanie zwolniony, identyfikator procesu nie może zostać ponownie użyty. W 64-bitowym systemie operacyjnym jest mało prawdopodobne, aby spowodować jakiekolwiek problemy, ponieważ PCB jest znacznie większy niż wpis tabeli procesu.
Ogromna liczba zombie może być wyobrażalna, wpływa na ilość pamięci, która jest bezpłatna dla innych procesów. Jeśli jednak masz wiele zombie, masz poważny problem z aplikacją rodzicielską lub błędem systemu operacyjnego.
Jak usunąć procesy zombie
Nie możesz zabić procesu zombie, ponieważ jest już martwy. Nie odpowie na żadnych sygnałów, ponieważ zostały usunięte z pamięci - nie ma nigdzie do wysłania
Sigkill.
sygnał. Możesz spróbować wysłać
Sigłowy
Sygnał do procesu macierzystego, ale jeśli nie działa, gdy zakończył proces dzieci, jest mało prawdopodobne, aby teraz pracować.
Jedynym niezawodnym rozwiązaniem jest zabicie procesu macierzystego. Kiedy zostanie zakończone, jego procesy dziecka są dziedziczone przez
w tym
Proces, który jest pierwszym sposobem uruchamiania w systemie Linux (jego identyfikator procesu wynosi 1).
ten
w tym
Proces regularnie wykonuje niezbędny czyszczenie zombie, więc aby je zabić, wystarczy zabić proces, który je stworzył. ten
szczyt
Polecenie jest wygodnym sposobem, aby sprawdzić, czy masz jakieś zombie.
Wpisz następujące elementy:
Góra
System ten ma osiem procesów zombie. My
może je wymienić
Używając
ps.
Komenda
i do tego
Egrep.
. Ponownie, procesy zombie mają stan stanu "z,", a zwykle będziesz też zobaczyć "denerwowanie".
Wpisz następujące elementy:
PS AUX | Egrep "Z | nieoczekiwanie"
Wymienione są procesy zombie.
Jest to sposób na odkrycie identyfikatorów procesu zombie niż przewijanie w tam iz powrotem
szczyt
. Widzimy również, że aplikacja o nazwie "Badprg" spowita te zombie.
Identyfikator procesu pierwszego zombie wynosi 7641, ale musimy znaleźć identyfikator procesu jego procesu macierzystego. Możemy to zrobić za pomocą
ponownie. Użyjemy opcji wyjściowej (
ps.
-O.
) powiedzieć
ps.
Aby wyświetlić tylko identyfikator procesu rodzica, a następnie przekaż go za pomocą
ppid =.
flaga.
Proces, który chcemy znaleźć, zostanie wskazany za pomocą
-P
Opcja (proces), a następnie przechodząc w identyfikatorze procesu zombie.
Dlatego wpisujemy następujące polecenie, aby wyszukać informacje o procesie dla procesu 7641, ale zgłosi to tylko identyfikator procesu macierzystego:
PS -O PPID = -P 7641
Powiedziano nam, że identyfikator procesu macierzystego wynosi 7636. Możemy teraz odsyłaczać to za pomocą
ps.
jeszcze raz.
Widzimy to pasuje do nazwy procesu macierzystego z wcześniej. Zabić proces nadrzędny, należy wybrać opcję SIGKILL z poleceniem kill w następujący sposób:
zabić -SIGKILL 7636
W zależności od właściciela procesu macierzystego, można również użyć
sudo
.
Zombies nie są przerażające ...
... chyba że jesteś w masywnej hordy. Niektórzy nie mają nic martwić i prostego restarcie otrze je.
Jednakże, jeśli zauważysz, że aplikacja lub proces jest zawsze tarła zombie, że coś należy przyjrzeć się. Jest to najprawdopodobniej po prostu niechlujnie napisany program, w którym to przypadku, może nie zaktualizowana wersja, że prawidłowo sprząta po swoich procesów potomnych.