TEMAT :
STANY PROCESU I PRZEJSCIA MIEDZY STANAMI.
Stan procesu (oraz jego tzw. U-obszar) opisany jest w strukturze zdefiniowanej w pliku include/sched.h task_struct. Pierwsze pole tej struktury - long state - opisuje stan procesu.
Pole to wspomaga jadro w zarzadzaniu procesami.
Oto jakie wartosci moze przyjmowac pole state :
"Najwazniejszym" stanem jest TASK_RUNNING. Proces znajdujacy sie w tym stanie jest gotowy do wykonania, i to ze (byc moze) sie akurat nie wykonuje spowodowane jest faktem, ze procesor (procesory) wykonuje akurat inne zadanie (zadania). Procesy bedace w tym stanie utrzymywane sa w liscie dwukierunkowej do ktorej dowiazania znajduja sie w strukturze task_struct (*next_run,*prev_run).
Czasami proces zazada np. zapisania na dysku lub czeka na wprowadzenie danych z terminala. W takiej sytuacji jadro (zakladajac, ze akurat z dysku korzysta iny proces, lub ze przy terminalu akurat nikt nie siedzi) ustala stan procesu na TASK_INTERRUPTIBLE i szereguje proces do kolejki zwiazanej z odpowiednim zdarzeniem (dostep do dysku , otrzymanie sygnalu z terminala). Proces taki reaguje normalnie na sygnaly i chyba stad wywodzi sie jego nazwa w odroznieniu od ...
TASK_UNINTERRUPTIBLE, kiedy to proces w tym stanie nie odpowiada na zadne sygnaly. Proces "wpada" w taki stan z przyczyn od niego niezaleznych (bezposrednio niezaleznych). I np. tak kiedy proces jest tworzony, gdy wisi na semaforze zwiazanym z wewnetrzna organizacja jadra (dostep jadra do krytycznych fragmentow pamieci (zmienne)). Mozna innymi slowy stwierdzic, ze proces w takim stanie jest w trakcie (tak naprawde jadro w imieniu procesu) zmiany swoich struktur (akurat sa one niespojne i proba wykonania jakis akcji (np. obsluga sygnalu) moglaby napotkac na sprzecznosci w tych strukturach).
Proces konczacy swoje zycie przechodzi w stan TASK_ZOMBIE i czeka (tak naprawde to czekaja "pozostalosci" po nim) az zostana usuniete ze struktur utrzymywanych przez jadro.
TASK_STOPPED - jak wiemy proces moze zostac zatrzymany przez wlasciciela grupy do ktorej nalezy. Gdy tak sie stanie, to pole state przyjmuje wlasnie wartosc TASK_STOPPED i proces pozostaje w stanie zatrzymania do momentu otrzymania sygnalu kontynuacji, badz zakonczenie (kill).
Ostatni stan : TASK_SWAPPING jest "najmniej waznym" stanem w tym sensie, ze nie jest implementowany w obecnej wersji Linuxa. (tzn. proces nigdy nie znajdzie sie w takim stanie).
szeregowanie procesow przez jadro (wywlaszczenie):
TASK_RUNNING -------------------------------- > TASK_RUNNING
na wlasne zadanie (czytanie z terminala, dostep do dysku):
TASK_RUNNING -------------------------------- > TASK_INTERRUPTIBLE
z przyczyn (bezposrednio) niezaleznych od procesu, a z powodu ograniczonych zasobow jadra:
TASK_RUNNING -------------------------------- > TASK_UNINTERRUPTIBLE