Do spisu treści tematu 3

3.4.4 Opis algorytmu EXIT


Funkcja systemowa exit kończy działanie procesów w systemie LINUX. Wywoływana jest ona z parametrem (kodem zakończenia), który zostaje przekazany rodzicowi procesu. Funkcja ta nie zwraca żadnej wartości.

    Opis algorytmu:
  1. Jeżeli proces jest w trakcie obsługi przerwania, wtedy wyświetlany jest na konsoli odpowiedni komunikat i algorytm przechodzi do punktu 2.
  2. O ile w systemie ustawiony jest znacznik zapisu pliku rozliczeniowego, do tego pliku zostanie dopisany rekord z następującymi danymi:
    • szesnastoliterowy skrót nazwy programu;
    • czas pracy procesu w trybie użytkownika;
    • czas pracy procesu w trybie jądra;
    • czas rozpoczęcia pracy przez proces;
    • czas trwania procesu w systemie;
    • identyfikator użytkownika;
    • identyfikator grupy;
    • identyfikator terminala;
    • opis pracy (tzn. czy wykonany był fork, po którym nie nastąpił exec; czy proces korzystał z przywilejów nadzorcy; czy został wykonany zrzut pamięci; czy proces zakończył działanie w wyniku otrzymania sygnału)
    • kod zakończenia procesu;
  3. Każdy proces może mieć swój prywatny zegar. W tym kroku algorytmu usuwany jest prywatny zegar procesu z listy zegarów.
  4. Wykonując operacje na semaforach można użyć znacznika SEM_UNDO, pozwalającego cofnąć te operacje. Operacje te zapisywane są na specjalnej liście w strukturze procesu. Korzystając z tej listy algorytm cofa tak wykonane działania na semaforach.
  5. Jeżeli proces korzystał z kolejki komunikatów jądra, to zostaje od niej odłączony. W przypadku gdyby okazało się, że z kolejki tej nie korzysta żaden proces, to jest ona usuwana.
  6. Zwalniana jest teraz pamięć przydzielona procesowi na segment danych, segment kodu oraz tablicę stron. Zwolnienie pamięci jest wykonywane jedynie wtedy, gdy nie korzystają z niej aktualnie inne procesy.
  7. W tym kroku algorytmu zamykane są deskryptory, które zostały otwarte przez proces. Zbiór tych deskryptorów umieszczony jest w odpowiedniej strukturze. Podobnie jak przy zwalnianiu pamięci, deskryptory te są zamykane tylko wtedy, gdy ze struktury zawierającej je nie korzystają inne procesy.
  8. W strukturze procesu znajduje się pole wskazujące na strukturę opisującą i-węzły katalogu bieżącego i głównego. O ile ze struktury tej nie korzystają inne procesy, zwalniane zostają te i-węzły oraz pamięć przydzielona na tą strukturę.
  9. Każdy proces ma tablicę obsługi sygnałów (opisaną w rozdziale związanym z sygnałami). Jeżeli z tablicy tej nie korzysta żaden inny proces, wtedy zwolnioona zostaje pamięć przydzielona na strukturę związaną z tą tablicą.
  10. Zostaje zmieniony stan procesu na ZOMBIE.
  11. Jeżeli proces jest liderem grupy procesów, do wysyłany zostaje do każdego procesu z tej grupy sygnał zawieszenia.
  12. Wsłany zostaje ojcu procesu sygnał o śmierci potomka.
  13. Każdemu dziecku procesu wykonującegu exit jako ojciec przypisany zostaje proces INIT oraz lista tych dzieci zostaje dołączona do listy dzieci procesu INIT. Jeżeli któreś z dzieci jest w stanie ZOMBIE, wtedy do procesu INIT wysyłany zostaje sygnał o śmierci dziecka.
  14. Jeżeli ustawiony jest w systemie odpowiedni znacznik, wykonywane jest teraz sprawdzenie drzewa procesów w systemie. Dla każdego procesu z tablicy procesów sprawdzane jest:
    • czy istnieje ojciec procesu w tablicy procesów;
    • czy istnieje najmłodsze dziecko w tablicy procesów;
    • czy istnieje młodsze rodzeństwo w tablicy procesów;
    • czy istnieje starsze rodzeństwo w tablicy procesów;
    • czy ojcem procesu nie jest on sam;
    • czy najmłodszym dzieckiem nie jest on sam;
    • czy starszym rodzeństwem nie jest on sam;
    • czy młodszym rodzeństwem nie jest on sam;
    • czy ojcem starszego i młodszego rodzeństwa jest jego ojciec;
    • czy starszym rodzeństwem młodszego rodzeństwa jest on sam;
    • czy młodszym rodzeństwem starszego rodzeństwa jest on sam;
    • czy ojcem najmłodszego dziecka jest on sam;
    • czy młodszym rodzeństwem najmłodszego dziecka jest NULL;
    W przypadku wykrycia błędu na konsoli wyświetlane jest stosowne ostrzeżenie.
  15. Zwolniona zostaje pamięć przydzielona procesowi na potrzebne struktury.
  16. Ostatnim krokiem algorytmu jest wywołanie funkcji wykonującej szeregowanie procesów. Proces nie powinien wrócić z tej funkcji, gdyż powinien zostać zmieniony kontekst a sterowanie przekazane innemu procesowi. Proces ten nie powinien nigdy zostać wybrany przez funkcję szeregującą procesy, gdyż jest on w stanie ZOMBIE. Gdyby jednak zdarzyło się inaczej, to wykonany zostanie skok do kroku 2 algorytmu.

Algorytm ten zaimplementowany jest w pliku exit.c.


Bibliografia


Autor: Jacek Drzycimski