Linux FAQ's & Manuals

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