Niti, nitkanje


Zamislimo si, da mora biti na primer nek datotečni strežni proces blokiran zaradi čakanja na disk. Če bi tak strežni proces imel več niti, bi med spanjem ene niti lahko potekala druga. Propustnost sistema bi bila večja. Tega ne moremo doseči z dvema (ali več) strežnima procesoma, ker si morata deliti isti medpomnilnik (v istem naslovnem prostoru). Uvedli so torej nov mehanizem.

Imejmo računalnik z nekaj procesi. Vsak proces si lasti programski števec in delovne registre, ima svoj sklad, ima svoj naslovni prostor. Taki procesi bi lahko medsebojno komunicirali le s pomočjo primitivnih medprocesnih mehanizmov. Uvedimo pojem "peresno lahkih" procesov, ki jim pravimo niti. Vsaka ima še vedno "svoje" delovne registre in svoj sklad, kar zadošča za informacijo o statusu takega mini-procesa. Uporabljajo pa take niti isti naslovni prostor in s tem tudi iste globalne spremenljivke. Medsebojne zaščite med nitmi ni, saj praviloma pripadajo vse take niti istemu "uporabniku" oziroma procesu.

Niti si zato delijo tudi vse odprte datoteke, signale, semaforje in celo otroke, ki jih je generiral proces (lahko pa imajo tudi svoje otroke). Lastno vsaki niti je tudi njeno stanje, ki je lahko tekoče, blokirano, pripravljeno ali zaključeno (running, blocked, ready, terminated).

Niti tako omogočajo kombinacijo paralelnosti v sicer sekvenčnem izvajanju (in blokiranju) procesov v sistemskih klicih.

Organizacija sodelovanja niti je lahko različna, kot to ponazorujejo naslednje slike:
 
V prvem primeru je ena nit dodeljevalec, ki izbere prosto (neblokirano) nit-izvajalca. Takega izvajalca zbudi. Ta nato pogleda, ali lahko izvede zahtevek. Če ga ne more (na primer pri datotečnem strežniku morda mora počakati na dostop na disk), zaspi, razvrščevalnik pa sproži kakšno drugo nit, morda dodeljevalnik, ki pogleda, ali obstaja še kakšen zahtevek. Izkaže se, da je tak pristop učinkovit predvsem pri implementaciji namenskih strežnikov (na primer datotečnih strežnikov) na enem namenskem računalniku.
V primeru teamske organizacije niti nimamo niti-dodeljevalca. Vsaka nit zase išče zahtevke. Tak sistem je predvsem smiseln, če so naloge posameznih niti specializirane. Tu se lahko zgodi, da pride zahtevek do niti, ki ni sposobna izvesti naloge. Pred vsako nitjo se tako vzpostavi "čakalna vrsta" z nerešenimi nalogami, ki jo mora vsaka nit prej izprazniti, preden gre gledat v "nabiralnik zahtevkov".

 
Tretji model organizacije niti je po principu cevovoda. Take organizacije ne moremo uporabljati na primer pri datotečnih strežnikih, pride pa v poštev tam, kjer imamo problematiko tipa proizvajalec-porabnik.

 
Koncept niti lahko uporabljajo tudi klijenti, ki želijo sodelovanje z več strežniki. Niti so pripravne tudi za procese, ki obravnavajo signale ali morda aparaturne prekinitvene zahtevke. 

Končno omenimo ąe možnost, da pri večprocesorskih sistemih niti dejansko potekajo paralelno v istem naslovnem prostoru. (Slika kaže niti v sistemu Solaris)