Dretve (eng. Threads)

 

Svaki proces ima adresni prostor i jednu kontrolnu dretvu. Česte su situacije kad je poželjno unutar jednog procesa imati nekoliko dretvi u istom adresnom prostoru koje rade kvazi-paralelno kao da su odvojeni procesi (uz iznimku da rade na istom adresnom prostoru). Ako se radi o višeprocesorskim računalima moguće je istovremeni rad pojedinih dretvi.

 

Princip rada više dretvi koje se izvršavaju unutar jednog procesa je analogan radu više istovremenih procesa na jednom računalu. Budući da dretve imaju neke osobine procesa, često se nazivaju lightweight[1] procesi. U situacijama kad koristimo više dretvi u jednom procesu govorimo o višedretvenosti ili multhithreading-u. Raspoređivanje dretvi na procesor izvršava se na sličan princip kao i raspoređivanje procesa (s tom razlikom da se razlikuju dretve unutar jezgre i one u korisničkom prostoru).

 

Za razliku od procesa dretve nisu toliko međusobno nezavisne. Sve dretve unutar jednog procesa dijele isti adresni prostor, što također znači da dijele globalne varijable. S obzirom da dijele adresni prostor, sve dretve (unutar nekog procesa) dijele isti skup otvorenih datoteka, procesa djece, alarma i signala itd.

 

Svojstveno pojedinom procesu

Svojstveno pojedinoj dretvi

Adresni prostor

Programski brojač

Globalne varijable

Registri

Otvorene datoteke

Stog

Procesi djeca

Stanje

Tekući alarmi

 

Signali i rukovatelji signalima

 

 

 

Kao i procesi dretve se mogu naći u sljedećim stanjima: izvršava se, blokirana, spremna ili završena i za njih vrijede iste mogućnosti promjena stanja.

 

Zašto dretve?

 

U čemu je prednost dretvi u odnosu na procese? Sa dretvama dobivamo novu mogućnost da paralelni entiteti dijele isti adresni prostor i sve podatke unutar njih. Ova mogućnost je ključna za neke aplikacije, kod kojih ista stvar sa paralelnim procesima neće raditi.

Drugi razlog je brzina kreiranja i uništavanja dretvi. S obzirom da dretve, za razliku od procesa nemaju nikakve resurse pridružene, mnogo lakše ih se kreira i uništava, pa je na nekim sustavima kreiranje dretve  i do 100 brže od kreiranja procesa. Treći razlog je jednostavnost komunikacije među dretvama zbog zajedničkog prostora.

 

Još jedan razlog za korištenje dretvi je njihova korisnost na višeprocesorskim računalima, kad je moguć stvarni paralelizam. (iako ovaj razlog vrijedi i za procese)

 

Primjeri korisnosti dretvi: text procesor, tablični kalkulator,web server, ...

 

Primjer: Neka web poslužitelj prima i obrađuje zahtjeve. Većina stranica nalazit će se u cachu tako da će pristup biti jako ubrzan. Neka čitanje iz cache-a i obrada zahtjeva traje 15ms. U prosjeku 1/3 zahtjeva je takva da stranica ne postoji u cache-u i mora se učitati s diska što traje dodatnih 75ms. Za to vrijeme ta dretva je blokirana. Izračunajte koliko vremena bi trebalo za obradu 12 istovremenih zahtjeva sekvencijalno, a koliko višedretveno ako je vrijeme kreiranja dretve 15ms. Sve ostale traju zanemarivo malo.

 

Gruba skica: T- kreiranje dretve, D-čitanje sa diska , O-obrada podataka

(podioci su po 15 ms) Napomena:  ne mora se nužno ovako odvijati raspoređivanje.

 

T

D

D

D

D

D

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

 

D

D

D

D

D

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

 

D

D

D

D

D

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

 

 

D

D

D

D

D

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

O

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

 

O

 

 

 

Rješenje prema gornjoj slici:

            sekvencijalno: 12 obrada zahtjeva i 4 čitanja sa diska = 12*15ms + 4*75ms = 480 ms

            višedretveno: prema gornjoj slici 25*15 ms = 375 ms

 

Zadatak: Modificirajte gornji primjer tako da se višedretvenost ne isplati.

 

Vrste implementacija:

 

Dretve se prilikom implemetacije mogu ugraditi u korisnički prostor ili u jezgru. I jedan i drugi slučaj imaju svoje prednosti i svoje mane:

Implementacija na nivou korisnika (dretvene biblioteke):

-         prednost: jezgra ne zna ništa o njima što znači da mogu biti implementirane na sustavu koji ne podržava višedretvenost.

-         mana: raspoređuju se procesi  tako da se dvije dretve u istom procesu ne mogu  izvršavati na dva različita procesora

-         prednost: brzo rapoređivanje

-         prednost: mogući su različiti algoritmi raspoređivanja

-         mana: blokiranje jedne dretve na sistemskom pozivu blokira cijeli proces,što dovodi do potrebe za neblokirajućim pozivima

-         mana: dretva mora dobrovoljno prepustiti izvršavanje.

Implementacija unutar jezgre (sistemski pozivi):

-         mana: svi pozivi koji blokiraju dretvu su implementirani kao sistemski pozivi što povećava vremenske troškove

-         mana: 'skuplje' kreiranje i uništavanje dretvi (zbog toga neki sustavi 'recikliraju' dretve)

-         prednost: nema potrebe za neblokirajućim pozivima

-         prednost: dvije dretve iz istog procesa mogu raditi na različitim procesorima.

Hibridna implementacija:

-         dretve se kreiraju na korisničkom nivou i vežu na pojedine dretve unutar jezgre.

-         svaka dretva unutar jezgre ima nekoliko dretvi na korisničkom nivou.

 

Arhitektura višedretvenog sustava Solaris 2.4

 

 

Primjeri:

Kreiranje i čekanje dretve,  cancel dretve

Primjer očitog vremenskog dobitka kada jedna dretva čita sa diska, a druga vrši neke aritmetičke operacije.

Množenje matrica.

Primjer česte pogreške prije prijenosu argumenata u dretve.

Quicksort (višedretvena i obična verzija: na feller.math.hr (dvoprocesoriski stroj) sortiranje 500 000 brojeva trajalo je cca 1 min 15 s u višedretvenoj varijanti, i 2:15 u nedretvenoj)



[1] lightweight – ispod prosječne težine