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 :

#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 3
#define TASK_STOPPED 4
#define TASK_SWAPPING 5

"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