Tema02-UpravljanjeProcesima
-
Upload
lektorhektor -
Category
Documents
-
view
224 -
download
4
description
Transcript of Tema02-UpravljanjeProcesima
04:17:40
1
UPRAVLJANJE PROCESIMA I NITIMA
OPERATIVNI SISTEMI
04:17:40
2
Procesi Rani računarski sistemi nisu omogućavali izvršenje više od jednog
programa istovremeno.
program je imao potpunu kontrolu nad sistemom i pristup svim resursima.
Danas: istovremeno prebacivanje više programa u memoriju njihovo konkurentno izvršavanje
Efikasnost
Prebacivanjem CPU između procesa, odnosno programa u izvršenju, operativni sistem postaje efikasniji.
Centralni koncept OS-a:
proces: apstrakcija jednog aktivnog programa.
04:17:40
3
Koncept procesa
Moderni računari
istovremeno više aktivnosti U multitasking sistemu CPU prelazi sa programa naprogram
U svakom trenutku na CPU samo jedan program Korisnik ima osjećaj paralelnog rada
kvaziparalelnosti pravu hardversku paralelnost u višeprocesorskim
sistemima proces - program u izvršenju
Proces se izvršava sekvencijalno
CPU jedna po jedna instrukcija
04:17:40
4
Koncept procesa
Proces je više od programskog koda trenutne aktivnosti prezentirane
vrijednošćuprogramskog brojača (program counter)
sadržajem procesorskih registara. program - pasivan entitet proces - aktivan entitet
04:17:40
5
Model procesa U ovom modelu je čitav softver a nekad takođe i operativni sistem
organizovan kao veliki broj sekvencijalnih procesa.
Svaki proces ima svoju virtualnu CPU.
(U realnosti CPU se prebacuje između procesa.)
Veliki broj (kvazi)- paralelnih procesa
Brzo prebacivanje CPU između programa se naziva multiprogramiranje.
Brzina kojom proces radi nije jedinstvena
Zbog prelaska CPU između procesa
nije moguće reproducirati kad se isti proces ponovo aktivira
Brzina izvršenja-pod uticajem relativne brzine različitih procesa
Proces je aktivnost - ima program, ulaz, izlaz i stanje
04:17:41
6
Model procesa
Memorija jednog računara koji paralelno računa 4 programa
4 procesa od kojih svaki ima neovisno upravljanje tokom, i radi nezavisno od drugih
Napredovanje svih procesa tokom dužeg vremenskog intervala iako je u jednom trenutku aktivan samo jedan proces
04:17:41
7
Model procesa
Svaki proces ima tri fundamentalna memorijska dijela: Programska sekcija koja se ne mijenja i koja
sadrži programski kod Stek sekcija (engl. steck section) koja sadrži
privremene podatke (parametre za procedura, povratne adrese, lokalne promjenjive)
Sekcija podataka (engl. data section) koja sadrži globalne promjenjive
Proces obuhvata vrijednost programskog brojača (engl. program counter)
04:17:41
8
Predstavljanje procesa
Proces je dinamička struktura
dio procesa su i podaci koji opisuju aktivnost procesa – neophodni za upravljanje procesom
Kontrolni blok procesa (Process Control Block, PCB)
vektor stanja – deskriptor procesa Kontrolni blok je dio radne memorije
memorijska struktura sa osnovnim informacijama o procesu
Zahvaljujući kontrolnom bloku izvršenje programa se može prekidati i nastavljati više puta
04:17:41
9
Implementacija procesa
Svaki proces u operativnom sistemu predstavljen kontrolnim blokom procesa
PCB- process control block
04:17:41
10
Process Control Block Proces predstavljen
process control block (PCB) - proces deskriptor
PCB sadrži važne informacije o određenom procesu
PCB - skladišni prostor
dozvoljava operativnom sistemu lociranje informacija o procesu.
struktura podataka koja definiše proces operativnom sistemu
Kontekst procesa
podaci koji se čuvaju prilikom oduzimanja procesora
snimanje stanja tekućeg procesa i pozivanje snimljenih podataka novog procesa
(engl. context switch) jezgro snima konetkst starog (tekućeg) procesa u PCB (Process Control Block) i puni sačuvani kontekst procesa koji je raspoređen za rad na CPU
04:17:41
11
PCB sadrži Trenutno stanje procesa: ready, running, waiting, i dr.
Jedinstvenu identifikaciju procesa (ime ili jedinstveni identifikator procesa PID)
Pokazivač na proces roditelj
Pokazivač na child proces (ako postoji)
Prioritet procesa (dio koji se odnosi na raspoređivanje CPU)
Pokazivač koji pokazuje na memoriju procesa
Područje registara
Informacije o memoriji procesa,
Lista otvorenih datoteka,
Status zauzetih ulazno-izlaznih resursa,
Procesor na kome radi (ako ima više procesora).
04:17:41
12
PCB Stanje procesa
može biti novi, spreman, aktivan, čeka, itd. Programski brojač
pokazuje adresu slijedeće instrukcije koja za ovaj proces treba biti izvršena. CPU registri
se mijenjaju kada je u pitanju tip ili veličina, zavisno od arhitekture računara. Informacija o raspoređivanju CPU
uključuje prioritet procesa i bilo koje druge parametre karakteristične za raspoređivanje CPU.
Informacija o upravljanju memorijom može uključivati informaciju o vrijednosti baznog i limit registra, tabele stranica
zavisno od memorijskog sistema koji se koristi. Accounting informacija
uključuje korišteno CPU vrijeme, realno korišteno vrijeme, vremenske limite, bro procesa itd.
Informacija o statusu U/I uključuje listu U/I uređaja dodijeljenih procesu, listu otvorenih datoteka itd.
04:17:41
13
Pokretanje procesa
Četiri događaja uzrokuju pokretanje jednog procesa:
1. Inicijalizacija sistema 2. Sistemski poziv za pokretanjem procesa
kroz neki drugi proces 3. Korisnički zahtjev za stvaranjem
procesa 4. Inicijalizacija batch poslova
04:17:41
14
Pokretanje procesa
Prilikom inicijalizacije sistema pokreće se više procesa.
Procesi koji rade u prvom planu koji komuniciraju sa korisnicima i završavaju
zadatke za njih. Pozadinski procesi
izvršavaju specijalne funkcije i ne pripadaju određenim korisnicima (deamons).
Primjer: proces može biti proces za prijem e-mail poruka
04:17:41
15
Pokretanje procesa
Aktivni procesi u sistemu:
Windows: kombinacija Ctrl-Alt-Del tipki prikazuje aktivne procese.
UNIX: ps (ps je skraćenica za Process Status) za prikaz svih aktivnih procesa.
$ ps
PID TTY TIME CMD
3511 pts/1 00:00:00 bash
3514 pts/1 00:00:00 ps
04:17:41
16
Pokretanje procesa
Često aktivni procesi pokreću sistemske pozive za stvaranje jednog ili više novih procesa
korisno podijeliti posao na više nezavisnih ali povezanih procesa
U interaktivnom sistemu korisnik:
pokreće program davanjem komande ili duplim klikom na ikonu.
Batch procesiranja u velikim mainframe računarima.
Korisnik prenosi batch job na sistem sistem odluči da ima dovoljno sredstava za obradu novog
zadatka pokreće novi proces
04:17:41
17
Završetak procesa
Prije ili kasnije proces završava na osnovu jednog od sljedećih uslova:
Normalni izlaz (dobrovoljno) Izlaz sa greškom (dobrovoljno) Fatalna greška (nije dobrovoljno) Ubijen (killed) od strane drugog procesa (nije
dobrovoljno)
04:17:41
18
Završetak procesa Većina procesa završavaju kad su ispunili svoj zadatak.
Grafički orijentisanih programa
dobrovoljni završetka (exit, close, quit).
Drugi razlog za završetak
značajna greška, npr. ulazni podaci ne postoje.
Treći razlog za završetak
greška prouzrokovana kroz sam proces (programske greške)
proces biva prekinut
Četvrti razlog za završetak
sistemski poziv od strane nekog drugog procesa koji upućuje operativni sistem da terminira neki proces.
04:17:41
19
Hijerarhija procesa
UNIX: proces zajedno sa svim
child procesima i njihovim child procesima gradi familiju
Windows: ne postoji hijerarhija
procesa Skupovi procesa se mogu
spojiti u job, koji od Windows 8 imaju hijerarhiju
04:17:41
20
Fork, wait, exec, exit Sistemskim pozivom fork() zahtijeva se kreiranje novog procesa.
Sistemski poziv wait() suspenduje izvršenje pozivajućeg procesa
dok neki od procesa djece završi (ili bude zaustavljen za vrijeme praćenja).
Ako proces dijete završi sa radom a roditelj ga ne čeka sa wait()
proces dijete neće nestati jer bi se onda izgubili podaci o tome sa kakvim exit kodom je završio
proces dijete postaje zombie proces i ps će za njega pod STAT ispisati Z.
exec() - proces koji se pozove prestaje sa izvođenjem trenutnog programa i počinje sa drugim (koji je naveden kao argument).
Postoje tri načina kako može završiti proces:
pozivom exit, primitkom signala ili padom sistema (nestanak napajanja ili slično).
04:17:41
21
Stanja procesa New - novi: proces je upravo kreiran. Running – aktivan ( izvršava se): instrukcije se
izvršavaju. Waiting (blocked) – čeka (blokiran): proces
čeka na pojavu nekog događaja kao što je neka U/I operacija.
Ready – spreman: proces čeka da bude dodijeljen procesoru.
Terminated – završen: proces je završio izvršenje.
04:17:41
22
Prelazi između stanja procesa running - waiting (blocked)
(izvršava se - blokiran)
ready - running
(spreman – izvršava se)
running - ready
(izvršava se – spreman)
waiting – ready
(blokiran – spreman)
04:17:41
23
Prošireni dijagram stanja procesa
(engl. suspend) – proces prestaje da se takmiči za resurse
Suspendovanje u stanjima wait i ready – dva dodatna stanja:
Suspended-ready (suspendovan u stanju čekanja na procesor)
Suspended-wait (suspendovan u stanju čekanja na resurs)
04:17:42
24
Prošireni dijagram stanja procesa
Nove tranzicije sa dijagrama ready - suspended ready wait - suspended waiting suspended waiting – suspended ready suspended ready - ready suspended waiting – waiting
04:17:42
25
Redovi raspoređivanja (scheduling queues)
Redova čekanja (engl. scheduling queues) Ovaj red se sastoji od svih procesa u
sistemu. ready queue – čekaju na CPU Lista procesa koji čekaju na neki uređaj se
zove device queue. Svaki uređaj ima svoj vlastiti red čekanja
04:17:42
26
Ready queue i različiti redovi čekanja uređaja (device queue)
04:17:42
27
Redovi čekanja na procesor
Dva reda čekanja: red čekanja na procesor i red čekanja na U/I
Proces koji se nalazi u stanju izvršavanja može:
Ostati bez procesora kada mu istekne vremenski kvantum
Napraviti novi proces i čekati u blokiranom stanju da se novi proces izvrši
Ostati bez procesora kad se dogodi prekid
Postaviti U/I zahtjev, nakon čega se prebacuje u red čekanja na ulazno-izlazni uređaj, tj. postaje blokiran
04:17:42
28
Dijagram raspoređivanja
04:17:42
29
Raspoređivači
Programi za raspoređivanje (engl. Schedulers) odlučuju o tome kada će proces ući u neki red čekanja ili napustiti taj red
Dugoročni (long-term) raspoređivač poslova izabira proces, puni ga u memoriju za izvršenje
Kratkoročni raspoređivač poslova (short-term scheduler)
bira između procesa koji su spremni za izvršenje i dodjeljuje CPU jednom od njih
Razlika u frekvenciji rada ova tri raspoređivača
04:17:42
30
Promjena konteksta procesa Prebacivanje CPU na drugi proces zahtjeva snimanje stanja starog
procesa i pozivanje snimljenog stanja novog procesa.
Ovaj zadatak se zove promjena konteksta
Vrijeme potrebno za promjenu konteksta veoma zavisi od hardverske podrške
Dispečer:
Pamti stanje procesa koji se prekida, kako bi se proces mogao kasnije nastaviti
Puni memoriju stanjem novog procesa kome se dodjeljuje procesor
Kontekst procesa
podaci koji se čuvaju prilikom oduzimanja procesora
omogućavaju nastavak izvršenja procesa
Kontrolni blok čuva stanje procesa prilikom zamjene konteksta
04:17:42
31
WINDOWS API ZA UPRAVLJANJE PROCESIMA
CreateProcess(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
Kreira novi proces. LpStartup info pokazuje na veliku strukturu koja opisuje dimenzije prozora i oznake ulaza/izlaza
CreateProcessAsUser(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles,dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
Kreira novi proces kao drugi korisnik
ExitProcess(uExitCode)
Završava trenutni proces
GetCurrentProcessId ()
Dobavlja identifikator trenutnog procesa
OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)
Otvara proces i dobija njegov rukovatelj
QueryFullProcessImageName( hProcess, dwFlags, lpExeName, lpdwSize)
Saznaje ime procesa iz rukovatelja
TerminateProcess(hProcess, uExitCode)
Prekida izvršenje drugog procesa
EnumProcesses(pProcessIds, wArraySize, pBytesReturned)
Očitava identifikatore svih procesa
04:17:42
32
POSIX API ZA UPRAVLJANJE PROCESIMA
fork();
Kreiraj dijete proces
execl( pcPath, pcArg, ...);
execlp( pcFile, pcArg, ...);
execv( pcPath, pcArgv[]);
execvp( pcFile, pcArgv[]);
Izvrši program iz datoteke
waitpid(idPid, piStatus, iOptions);
Čekaj završetak procesa
exit(iStatus);
Završi trenutni proces
int kill(idPid, iSig);
Šalji signal procesu
unsigned int sleep(uiSeconds);
Spavaj navedeni broj sekundi
int pause();
Čekaj signal
unsigned int alarm(uiSeconds);
Postavi alarm za slanje signala
getpid();
Dobavi identifikacjiju procesa
getppid();
Identifikacija roditeljskog procesa
04:17:42
33
WINDOWS API ZA UPRAVLJANJE GRUPAMA PROCESA
CreateJobObject( lpJobAttributes,lpName)
Kreira Job, grupni objekt kojim se može uticati na više procesa
OpenJobObject(dwDesiredAccess,bInheritHandles, lpName)
Otvara postojeći Job AssignProcessToJobObject(hJob, hProcess)
Dodaje proces u Job TerminateJobObject( hJob, uExitCode)
Prekida sve procese vezane u Job
04:17:42
34
POSIX API ZA UPRAVLJANJE GRUPAMA PROCESA
setpgid(iProcessId, iProcessGroup); Premješta proces u grupu procesa
getpgid(iProcessId); Vraća grupu procesa za proces
getpgrp(void); Vraća grupu procesa za trenutni proces
int kill(iProcessGroup, iSignal); Šalje signal grupi, ID grupe mora biti negativan
broj
04:17:42
35
Programske niti MMU (Memory Management Units)
sprečavaju da neki proces prepisuje adresni prostor drugog procesa
promjena konteksta – znači reprogramiranje MMU
Više procesa – više vremena na promjenu konteksta
Programske niti – da se izbjegne ovaj problem
Programske niti kao child procesi, ali dijele isti adresni porstor
Prednost programskih niti:
Nema zamjene adresnog prostora
Manje CPU vremena za prebacivanje
Lakša komunikacija- dijele isti adresni prostor
04:17:42
36
Programske niti (threads) Programska nit - laki proces (engl. lightweight process LWP)
Osnovni entiteti koji se izvršavaju na CPU
Unikatni resursi za niti:
poseban identifikator niti (engl. thread ID),
posebnu vrijednost programskog brojača,
vrijednosti drugih registara procesora i
poseban stek
Ostali resursi zajdenički za sve niti jednog procesa:
sekcija koda,
sekcija podataka,
otvorene datoteke,
signali...
04:17:42
37
Model programske niti Proširenje modela procesa
višestruka izvršenja u istom okruženju
Više niti aktivnih paralelno u jednom procesu <=> Više procesa koji su aktivni na jednom računaru
I slučaj: niti dijele adresni prostor, otvorene datoteke i druge resurse.
II slučaj: slučaju procesi dijele fizičku memoriju, diskove, printer i druge resurse.
04:17:42
38
Model programske niti
Višestruke niti (multithreading)
više niti unutar procesa
Multithreading
CPU se prebacuje između različitih niti stvarajući iluziju niti koji rade paralelno ali na CPU sporijoj od realne.
Niti manje nezavisne od porcesa
Niti imaju isti adresni prostor
dijele i iste globalne varijable
mogućnost da višestruke niti izvršenja dijele skup resursa tako da mogu zajedno blisko raditi, prilikom izvršavanja nekih zadata
04:17:42
39
Model programske niti
Svaki nit poziva različite procedure i ima različitu izvršnu istoriju zato joj je potreban vlastiti stek
Stanja: new, running, blocked, ready, terminated
Aktivna nit trenutno ima CPU Blokirana nit čeka na neki događaj koji
će ga deblokirati Prelasci između stanja niti su isti kao
između stanja procesa
04:17:42
40
Model programske niti
Kada je prisutan multithreading, proces normalno započinje sa jednom niti.
Ova nit ima sposobnost da kreira nove niti
automatski rade u adresnom prostoru niti koja ih kreira Hijerarhiju niti, sa roditrelj-child odnosom
Završetak rada korištenjem bibliotečne (library) procedure
Kreiranje i terminiranje niti su slični kreiranju i terminiranju procesa.
Niti mogu dobrovoljno predati CPU
04:17:43
41
Upotreba niti
Istovremeno više aktivnosti razlaganjem aplikacija na višestrukle sekvencijalne
niti koje rade kvazi-paralelno, programski model postaje jednostavniji
lakše kreirati a i uništiti u odnosu na procese do 100 puta brže u odnosu na kreiranje procesa
performanse preklapanje aktivnosti ubrzava aplikacije u sistemu
gdje postoji više CPU-a, gdje postoji realni paralelizam
04:17:43
42
Primjer upotrebe niti
Obrada teksta Program sa dvije niti Jedna nit komunicira sa
korisnicima Druga vrši formatiranje u
pozadini Treća nit – snimanje na
disk bez miješanja sa prve dvije niti
04:17:43
43
Primjer upotrebe niti
Sa tri niti programski model je mnogo jednostavniji
Prva nit samo komunicira sa korisnikom. Druga nit reformatira dokument kada mu je to naloženo. Treća nit periodično upisuje sadržaj RAM-a na disk.
Tri odvojena procesa ne bi funkcionisala ovde pošto sve tri niti operišu na istom dokumentu
Tri niti umjesto tri procesa
dijele istu memoriju i zato svi imaju pristup dokumentu koji seedituje
Analogna situacija postoji kod mnogo drugih interaktivnih programa
04:17:43
44
Primjer upotrebe niti
Server za World Wide Web Zahtjevi za stranicama dolaze na server i zahtjevane
stranice se šalju klijentima. Kod većine Web sajtova, obično postoje stranice
kojima se češće pristupa. Web serveri koriste ovu činjenicu da poboljšaju
performanse, čuvanjem ovakvih stranica u glavnoj memoriji da bi eliminisali potrebu da se one uzimaju sa diska. Takva kolekcija se zove cache i koristi se u mnogim drugim kontekstima.
04:17:43
45
Primjer upotrebe niti Nit dispečer čita dolazne
zahtjeve iz mreže
Dispečer bira prazanu (tj. blokiran) radnu nit i prosljeđuje joj zahtjev.
Dispečer onda budi uspavanu radnu nit, prebacujući je iz blokiranog u aktivno stanje.
Kada se worker (radna nit) probudi, provjerava da vidi da li zahtjev može biti zadovoljen Web page keša u koji sve niti imaju pristup.
Ako ne može onda započinje read operaciju da dobije stranicu sa diska i on blokira dok ova operacija nije završena.
04:17:43
46
Web server bez programskih niti
Jedna mogućnost je da radi kao jedna nit.
Osnovna petlja Web servera
dobiva zahtjev, pregleda ga i nastavlja do završetka prije uzimanja sljedećeg zahtjeva. server je prazan dok čeka na disk
manje zahtjeva može biti obrađeno
Niti postižu puno bolje performanse
svaka nit je programirana sekvencijalno na uobičajen način.
04:17:43
47
Moguća struktura procesa
Proces može biti struktuisan sa : Ulazna programska nit učitava podatke u ulazni
bafer. Nit za obradu uzima podatke iz bafera i
obrađuje ih. Izlazna programska nit piše rezultat na disk.
Na ovaj način ulaz, obrada i izlaz se mogu dešavati u isto vrijeme.
04:17:43
48
Implementacija
Načini za implementaciju programskih niti: u korisničkom prostoru (engl. user threads) u jezgru (engl. kernel threads) hibridna implementacija.
04:17:43
49
Implementacija niti u korisničkomprostoru
Prvi metod
paket programske niti postavi potpuno u korisnički prostor.
Jezgro ne zna ništa o njemu.
Prva prednost
mogu biti implementirane na operativnom sistemu koji ne podržava programske niti.
Većina operativnih sistema su bili u ovoj kategoriji a neki su još uvijek.
04:17:43
50
Implementacija niti u korisničkomprostoru
Podrška preko biblioteka za rad sa korisničkim nitima (engl.
user thread library) Niti rade na vrhu run-time sistema,
kolekcija procedura koje upravljaju nitima svaki proces treba svoju privatnu tabelu niti
da čuva zapis o programskim nitima procesa Analogija sa tabelom procesa
04:17:43
51
Implementacija niti u korisničkomprostoru
Ovom tabelom upravlja run-time sistem. Ako nit uradi nešto što može prouzrokovati da
ona bude lokalno blokiran, npr. čekanje na drugu nit u njenom procesu da završi posao poziva run-time sistemsku proceduru.
Ova procedura provjerava da vidi da li nit mora biti stavljena u stanje blokiran. Ako je tako snimi registre u tabelu niti, traži
u tabeli na nit koja je spremna na rad, i u registre puni sa vrijednostima nove niti.
04:17:43
52
Implementacija niti u korisničkomprostoru
Čim su se stek pointer i programski brojač prebačeni, nova nit automatski oživlja.
Ako mašina ima instrukciju da snimi sve registre i drugu instrukciju da ih napuni, sve može biti urađenu u nekoliko instrukcija.
Preusmjeravanje niti na ovaj način, je brže nego preskakanje u jezgro
značajan argument u korist programskih niti na korisničkom nivou
Procedura koja snima stanja niti i raspoređivač su samo lokalne procedure,
pozvati njih efikasnije neko praviti poziv jezgru. Ovo čini raspoređivanje niti veoma brzim.
04:17:43
53
Implementacija niti u korisničkomprostoru
Programske niti na korisničkom nivou: Prednost:
Dozvoljavaju svakom procesu da ima svoj algoritam raspoređivanja. Problem 1: Blokirajući sistemski pozivi
Uprkos boljim performansama, programske niti na korisničkom nivou imaju neke velike probleme.
Prvi od ovih je kako je blokirajući sistemski poziv implementiran. Zamislimo da nit čita sa tastature prije nego je pritisnuta neka tipka.
Dozvoliti niti da pozove blokirajući sistemski poziv je nedopustivo Kontradiktorno:
Glavna prednost korištenja niti je bila dozvoliti svima da koriste blokirajuće pozive
Potrebno spriječiti da jedna blokirana nit utiče na druge Moguće rješenje:
Svi sistemski pozivi mogu biti promjenjeni u neblokirajuće Ovakav zahtjev za promjenama u operativnom sistemu nije atraktivan, jer je
jedan argument u korist niti na korisničkom nivou - mogu raditi sa postojećim operativnim sistemima
04:17:43
54
Implementacija niti u korisničkomprostoru
Druga mogućnost u slučaju događaja gdje je moguće unaprjed reći da li će poziv blokirati.
U nekim verzijama UNIX-a postoji sistemski poziv select može reći da li će doći do blokiranja kod budućeg read poziva
sigurno da read neće blokirati on se izvodi ako je će ovaj poziv biti blokiran on se onda ne izvodi
Zahtijeva ponovno pisanje dijelova biblioteke sistemskih poziva, neefikasan je i neelegantan, ali nema puno izbora.
Kod postavljen oko sistemskog poziva da se izvrši provjera, zove se jacket i wrapper
04:17:43
55
Implementacija niti u korisničkomprostoru
Problem 2:
jedna programska nit počne rad ni jedna druga nit u tom procesu neće raditi osim ako prva nit ne prepusti CPU dobrovoljno.
Nema prekida na bazi sata, što ne daje mogućnost raspoređivanja na principu da svi dođu na red
Moguće rješenje:
run-time sistem zahtjeva signal sata (prekid) jednom u sekundi da preda kontrolu - problematično
04:17:43
56
Implementacija niti u jezgru
Jezgro ima tabelu programskih niti koja prati sve niti u sistemu
Kad nit želi da kreira ili da uništi postojeću nit, pravi poziv u jezgro
Jezgro kreira ili uništava niti tako što obnavlja njihovu tabelu
04:17:43
57
Implementacija niti u jezgru Implementacija niti u jezgru
Niti jezgra direktno podržava operativni sistem.
Tabela niti u jezgru, drži registre niti, stanja, i druge informacije
Informacije su iste ali sada nalaze u jezgru a ne u korisničkom prostoru
Ove informacije su podskup informacije koje uređuje jezgro o svojim jednonitnim procesima.
Jezgro uređuje i tradicionalnu tabelu procesa da sačuva informaciju o procesima.
Svi pozivi koji bi mogli blokirati niti su implementirani kao sistemski pozivi sa puno većom cijenom nego poziv u run-time sistem proceduru.
04:17:43
58
Implementacija niti u jezgru Kada nit blokira, jezgro može
pokrenuti drugu programsku nit iz istog procesa pokrenuti nit iz nekog drugog procesa
Sa nitima na korisničkom nivou, run-time sistem drži aktivnim niti iz vlastitog procesa dok mu jezgro ne oduzme CPU.
Recikliranje niti
Kad su niti uništeni označe se kao not runnable, a na strukturu podataka jezgra ne utiče se na neki drugi način.
Kasnije kada se nova nit mora kreirati, stara nit je reaktivirana.
Recikliranje je moguće i kod niti na korisničkom nivou - nema puno razloga da se ovo radi.
04:17:43
59
Hibridna implementacija Rezultat istraživanja i želje da se kombinuju prednosti niti na
korisničkom nivou sa nitima u jezgru.
Korištenje programskih niti u jezgru i multipleksiranje korisničkih tredova na neke ili sve niti u jezgru.
U ovom dizajnu jezgro je svjesno samo programskih niti u jezgru i bavi sa njihovim raspoređivanjem.
Neke od ovih niti mogu imati višestruke niti na korisničkom nivou multipleksirana na njima.
Niti na korisničkom nivou se kreiraju, uništavaju i raspoređuju kao niti na korisničkom nivou u procesu koji je aktivan u operativnom sistemu koji radi bez multithreading mogućnosti.
U ovom modelu svaka nit u jezgru ima neki skup niti na korisničkom nivou.
04:17:43
60
Tri višenitna modela
Model više u jednu (engl. Many-to-one) Više korisničkih niti se mapira u jednu nit u jezgru Upravljanje nitima se odvija na korisničkom nivou Ako neka niti obavi bilo koji blokirajući sistemski poziv, blokiraće se cio
proces, tj. sve niti Samo jedna nit može pristupati jezgru u jednom trenutku
ne može se iskoristiti višeprocesorska arhitektura Model jedna u jednu (engl. One-to-one)
Ovaj model karakterističan za Windows NT, Windows 2000/XP/2003 i OS/2
Svaka korisnička nit se mapira u jednu nit u jezgru Obezbjeđeno mnogo bolje konkurentno izvršavanje niti Više niti iz jezgra se mogu izvršavati paralelno na višeprocesorskoj
arhitekturi Mnogi sistemi ograničavaju maksimalan broj niti jezgra
Model više u više (engl. Many-to-many) Više korisničkih niti mapira se u manji ili isti broj niti jezgra Najkompleksniji i najkvalitetniji model
04:17:43
61
Pop-Up niti
Programske niti su često korisni u distribuiranim sistemima.
Jedan značajan primjer je kako se upravlja dolazećom porukom koja traži uslugu.
Tradicionalni pristup:
proces ili nit blokiranu na receive sistemski poziv čekajući na dolazeću poruku.
Kad poruka stigne on prihvata poruku i obrađuje je. Drugi pristup:
pristizanje poruke uzrokuje da sistem kreira novu nit koja će se baviti porukom: pop-up nit
04:17:44
62
Pop-Up niti
Ključna prednost pop-up niti:
Potpuno nove, nemaju nikave istorije (registri, stekovi itd.), koja mora biti pohranjena.
Svaka starta nova i identičan je sa ostalim.
Omogućava brzu kreaciju takve niti.
Nova nit je dodjeljena dolazećoj poruci.
Rezultat korištenja pop-up niti je da kašnjenje između pristizanja poruke i početka obrade može biti veoma kratko.
04:17:44
63
Pretvaranje jednonitnog u višenitni kod
Primjer: errno varijable korištenu u Unix-u
Kada proces ili nit pravi sistemski poziv koji ne uspjeva, kod o grešci se stavlja u errno.
nit 1 izvršava sistemski poziv access (dozvola pristupa datoteci)
Odgovor OS-u globalnoj varijabli errno.
Nakon što se kontrola vratila niti 1 ali prije nego što ima šansu da pročita errno, raspoređivač dodjeljuje CPU niti 2
Nit 2 izvršava jedan open poziv koji propada, ponovno upisivanja u errno
access kod niti 1 se gubi zauvjek
Kad nit 1 starta kasnije pročitaće pogrešnu vrijednost i ponašaće se nekorektno
04:17:44
64
Pretvaranje jednonitnog u višenitni kod
Mnogo postojećih programa - za jednonitne procese. Konvretovanje ovih u višenitne - komplikovano Niti se normalno sastoje od višestrukih procedura, upravo kao proces. Niti mogu imati
lokalne varijable, globalne varijable i proceduralne parametre.
Lokalne varijable i parametri ne prouzrokuju probleme Problem - varijable globalne za nit ali ne i za čitav program Ove varijable su globalne u smislu da ih mnoge procedure untar niti
koriste, a da ih druge niti ne koriste. Različita rješenja ovog problema: Jedno je da se zabrane globalne varijable potpuno.
u konfliktu sa većinom postojećeg softvera. Druga je dodjeljivanje svakoj niti njegove vlastite privatne globalne
varijable.
04:17:44
65
Pretvaranje jednonitnog u višenitni kod
Svaka nit ima svoju privatnu kopiju errno i druge globalne varijable tako da se izbjegavaju konflikti.
novo područje:
varijable vidIjive svim procedurama niti
postojeće područje:
varijabli vidljivih samo jednoj poceduri
varijable vidljive svuda u programu.
04:17:44
66
Pretvaranje jednonitnog u višenitni kod
Pristup privatnim globalnim varijablama je komplikovan većina programskih jezika ima način izražavanja
lokalnih i globalnih varijabli ali ne i neke međuforme
Moguće je odrediti blok memorije za globalne varijable i onda ove kao dodatne operacije predati niti. Iako ovo nije elegantno rješenje ono funkcioniše.
Alternativno bi se mogle uvesti nove bibliotečne procedure za kreiranje čitanje i postavljanje ovih za niti globalnih varijabli.
04:17:44
67
WINDOWS API ZA RAD S NITIMA U KORISNIČKOM PROSTORU
CreateFiber(dwStackSize,lpStartAddress,lpParameter)
Kreira objekt vlakna (niti koje raspoređuje korisnički program)
FiberProc(lpParameter)
Podprogram svakog vlakna SwitchToFiber(lpFiber)
Prelazi na podprogram vlakna DeleteFiber(lpFiber)
Uklanja postojeće vlakno
04:17:44
68
WINDOWS API ZA UPRAVLJANJE NITIMA U JEZGRU
CreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags,lpThreadId)
Kreira programsku nit i vraća rukovatelj na nju
ExitThread(dwExitCode)
Završava nit koja je pozvala ovu funkciju
GetCurrentThread()
Vraća rukovatelj na nit koja je pozvala ovu funkciju
OpenThread(dwDesiredAccess, bInheritHandle, dwThreadId)
Uzima rukovatelj određene niti
ResumeThread(hThread)
Nastavlja suspendovanu nit
Sleep (dwMilliseconds)
Suspenduje nit na određeno vrijeme
SuspendThread(hThread)
Suspenduje navedenu nit
SwitchToThread()
Dobrovoljno predaje izvršenje drugoj niti
TerminateThread( hThread,dwExitCode)
Prekida navedenu nit
04:17:44
69
POSIX API ZA UPRAVLJANJE NITIMA
pthread_create (pThread, pAttr, pStart_routine,pArg)
Kreira nit
pthread_exit (pStatus) Prekida nit koja je pozvala ovu
funkciju i prosljeđuje status nitima koje su se povezale na nju
pthread_cancel (pThread) Prekida navedenu nit
pthread_attr_init (pAttr) pthread_attr_destroy (pAttr)
Kreira ili uništava objekt s atributim niti
pthread_join (pThreadid,ppStatus) Čeka da se navedena nit završi,
oslobodi njene resurse i nastavi izvršenje trenutne niti
pthread_detach (pThreadid)
Oslobađa resurse završene niti ili najavljuje oslobađanje kada bide završena
pthread_attr_setdetachstate (pAttr, iDetachState)
pthread_attr_getdetachstate (pAttr, pDetachState)
pthread_attr_getstacksize (pAttr, pStackSize) pthread_attr_setstacksize (pAttr, iStackSize) pthread_attr_getstackaddr (pAttr,
ppStackAddr) pthread_attr_setstackaddr (pAttr, pStackAddr)
Postavlja ili čita atribute niti: stanje oslobađanja resursa, veličinu steka i početnu adresu steka