Procesi in niti


Procesi

Procesi NT/2000 se deloma razlikujejo od procesov pri drugih operacijskih sistemih:
 
Implementirani so kot objekti in do njih dostopamo preko upravnika objektov
Imajo lahko več niti, ki se izvajajo v skupnem naslovnem prostoru
Tako objekti - procesi kot objekti - niti imajo vgrajeno zmožnost sinhronizacije
Upravnik procesov ne vzdržuje nobenih relacij oče - sin o procesih, ki jih tvori.

Proces vsebuje naslednje:
 
Izvršljivi program, ki določa začetno kodo in podatke.
Privatni naslovni prostor, ki je del virtualnega prostora, ki je na voljo procesu.
Sistemske resurse, kot so semaforji, komunikacijska vrata in datoteke.
Najmanj eno nit, sicer se proces ne more izvajati.

 
Vsakemu procesu Windows 2000 ustreza v izvajalniku procesni blok (EPROCESS, executive process block). 

Slika poenostavljeno prikazuje strukture, ki opisujejo proces.

Izvajalnikov procesni blok (EPROCESS)
Procesni blok jedra
Blok okolja procesa
Izvajalnikov blok niti  (ETHREAD)
Blok niti v jedru   (KTHREAD)
Blok okolja niti
 


Kako tvorimo proces


 

Niti

Niti pri Windows NT so objekti, ki imajo naslednje osnovne komponente oziroma atribute :
 
ID klijenta
Vsebina registrov, ki predstavljajo stanje procesorja
Dva sklada, enega uporablja nit v uporabnišken režimu, drugega pa v sistemskem (kernel)
Privatno pomnilno področje, ki ga uporabljajo podsistemi, in knjižnice (vključno z dinamično povezanimi knjižnicami (DLL))
Dinamična prioriteta niti (to je prioriteta v danem trenutku)
Osnovna (base) prioriteta (to je spodnja limita dinamične prioritete)
Afiniteto niti, ki pove, na katerih procesorjih večprocesorskega sistema lahko nit teče. Afiniteta niti je torej seznam, ki je podmnožica afinitete procesa.
Opozorilna zastavica (alert status flag), ki pove, da mora nit izvesti asinhroni klic procedure.
Skupni čas izvajanja niti
Število prekinitev (kolikokrat je bila nit prekinjena, ne da bi bil njen potek obnovljen.
Začasni dostopni žeton (impersonation token), ki omogoči, da nit izvede operacije (servis) za nek drug proces. To uporabljajo podsistemi.
Zaključna vrata (termination port), to je medprocesni komunikacijski kanal, po katerem upravnik procesov pove, da je nit končala izvajanje.
Izstopni status niti
Registrom, skladoma in privatnemu pomnilnemu področju pravimo kontekst niti.

Poleg atributov ima vsak objekt niti še naslednje metode (servise)
 
Tvori nit (create)
Odpri nit (open)
Vpogled v stanje niti (query)
Set stanje niti (set)
Dobi kontekst niti (get)
Nastavi kontekst niti (set)
Tekoča (current) nit
Zaključi (terminate) nit
Prekini (suspend) nit
Obnovi (resume) izvajanje niti
Opozori (alert) nit
Preveri opozorilno zastavico  niti (test alert)
Registriraj zaključna vrata

Najbolj preprosta in dokaj pogosta oblika komunikacije med nitmi je sinhronizacija, pri kateri lahko posamezna nit prekine svoje izvajanje in čaka na zaključek operacije neke druge niti.

Objekti, ki tako sinhronizacijo omogočajo, so:
 
Procesi
Niti
Datoteke
Dogodki
Dogodkovni pari
Semaforji
Časovniki (timer)
Mutanti
Prvi trije objekti imajo seveda druge osnovne naloge, ostali pa služijo le za sinhronizacijo. V vsakem trenutku je sinhronizacijski objekt v signaliziranem ali nesignaliziranem stanju. Pomen tega stanja se od tipa objekta razlikuje. Tako preide nit v signalizirano stanje, ko se izteče, Proces preide v signalizirano stanje, ko konča tudi zadnja od njegovih niti, Časovnik preide v tako stanje po preteku določenega časa. Sinhronizacija poteka tako, da neka nit čaka na signalizirano stanje enega ali več drugih objektov.
 

Stanja niti

Initialized 
Nit je bila pravkar vzpostavljena.

Ready
Nit čaka, da jo razvrščevalnik izbere.

Standby
Nit je bila izbrana za izvajanje na danem procesorju.

Running
Izveden je bil preklop konteksta na to nit. Tekla bo do prekinitve ali do konca.

Waiting 
Nit je prešla v stanje čakanja, ker čaka na sinhronizacijo z nekim objektom, 

Transition 
Nit je sicer pripravljena na izvajanje, vendar je njen sklad umaknjen iz pomnilnika. Nit čaka na pomnilnik. 

Terminated
Nit se je pravkar zaključila. Njen objekt še obstaja. Izvajalnik bi jo še lahko ponovno inicializiral.


 

V nekaterih primerih lahko nit  z opozorilom (alert) sporoči neki drugi niti, naj prekine svoje delo. Ta način sinhronizacije se uporablja pri asinhronem klicu procedur (APC).


Proces jedra in objekti niti

Implementaciji objekta proces ustreza v jedru minimiziran objekt, ki mu pravimo proces jedra (kernel process). Jedro ne pozna tabele objektov, ki jo srečamo pri procesu. Zato direktno dostopa do niti, ki pripadajo procesu jedra. Poleg tega vsebuje ta objekt tudi direktne kazalce na procesovo tabelo strani, na podatke o privzeti prioriteti procesa, na njegovo procesorsko afiniteto in na podatek o trajanju procesa.
 


 
 

Procesorska afiniteta je podatek, na katerih procesorjih lahko ta proces teče (če imamo večprocesorski sistem). Niti imajo svoje lokalne procesorske afinitete, ki so podmnožica procesorske afinitete danega procesa.

Procesorska afiniteta je pomembna pri razvrščanju niti (thread scheduling). Razvrščevalnik izbere posamezno nit glede na njeno prioriteto, nato pa pogleda, na katerem procesorju lahko teče.

Niti imajo (večinoma) spremenljivo prioriteto. Glede na trenutni prednosti nivo čakajo v ustrezni čakalni vrsti. Razvrščevalnik dvigne njen nivo, ko nit zapusti  stanje čakanja na nek vir (waiting state). Vsakič, ko nit prekine, ji prednostni nivo zniža. Tako preidejo računsko intenzivne niti na najnižji (to je osnovni) prednostni nivo.

Ko je nit izbrana za izvajanje, preide končno v tekoče (running) stanje. Pri tem mora priti do preklopa konteksta (context switching). To pomeni, da se vsebina registrov uporabljenega procesorja shrani na sistemski sklad niti (kernel stack). Iz sistemskega sklada izbrane niti pa se rekonstruira nova (torej nekdaj prej shranjena) vsebina registrov. To zadošča, če  pripadata prekinjena in novoizbrana nit istemu procesu )in torej delujeta v istem naslovnem prostoru). V nasprotnem primeru pa mora priti še do rekonstrukcije naslovov strani.


Razvrščanje niti in procesov

 
Sistem Windows 2000 uporablja  32 prednostnih nivojev:
  • Šestnajst nivojev realnega časa (16-31)
  • Petnajst spremenljivih nivojev (1-15)
  • En sistemski nivo (0), rezerviran za  nit ničelne strani (the zero page thread)
Niti podedujejo osnovno prednost procesa (base priority). Tekoča prednost procesa je dinamično spremenljiva v območju 1-15. 

 
Razvrščevalnik uporablja čakalno vrsto (dispatcher ready queue), ki je pravzaprav skupina čakalnih vrst, po ena za vsak nivo prednosti. 

 
Sistem dvigne prednost niti pa prehodu iz stanja čakanja (na primer po vhodno izhodni operaciji).

Po vsakem izteku časovne rezine (kvantuma) prednost niti zniža (a ne pod bazni nivo)

Kvantum časa je časovna rezina, ki je na voljo posameznim nitim v stanju, ko so tekoče.


Še nekaj o scenarijih razvrščanja

 
Nit sama preide v stanje čakanja (ker morda čaka na nek objekt) Nit nadomesti nit z višjo prednostjo, še preden porabi kvantum časa. (zato kasneje nadaljuje s preostankom kvantuma). Niti je kvantum časa pošel (zato se uvrsti na konec čakalne vrste z novim kvantumom)


Struktura procesov

NT  omogoča sočasno izvajanje aplikacij, pripravljenih za različna okolja (Win32, MS-DOS, OS/2, POSIX). Pri tem si pomaga s takoimenovanimi okoljskimi podsistemi (environment subsystems), ki kot nekakšen vmesnik (API) emulirajo okolje, ki ga nek aplikacijski program pričakuje. Koncept si lahko ogledamo na primeru sistemskega klica za tvorbo novega procesa: