Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Tråde og synkronisering

Lignende præsentationer


Præsentationer af emnet: "Tråde og synkronisering"— Præsentationens transcript:

1 Tråde og synkronisering
Tråde og synkronisering bjbu & nokn - TietgenSkolen bjbu & nokn - TietgenSkolen

2 bjbu & nokn - TietgenSkolen
Hvorfor trådning? Performance Responsivness bjbu & nokn - TietgenSkolen

3 bjbu & nokn - TietgenSkolen
Succeskriterier Forbedring af performance Opgaverne skal være uafhængige Jo flere afhængige opgaver, jo mindre forbedring Forbedring af responsivness Responsivness er et spørgsmål om oplevelse Jo længere tid en opgave tager, jo mindre virksom opleves applikationen, hvis brugeren ikke har noget at lave eller se på bjbu & nokn - TietgenSkolen

4 bjbu & nokn - TietgenSkolen
Fordele Overvågningssystemer med flere uafhængige opgaver Muliggør brugerinteraktion via BGF Muliggør serverhåndtering af flere samtidige klienter Udnytter flerprocessor-systemer optimalt bjbu & nokn - TietgenSkolen

5 bjbu & nokn - TietgenSkolen
Ulemper Trådene afvikles uafhængigt af hverandre Afviklingsrækkefølgen synes vilkårlig Samspillet mellem tråde er ofte meget kompleks Problemer med safety og liveness bjbu & nokn - TietgenSkolen

6 bjbu & nokn - TietgenSkolen
Trådskifte CPU’en skifter til en ny tråd … Efter et givent tidsrum, eller Når en tråd venter på færdiggørelsen af en opgave, fx en I/O-operation … bjbu & nokn - TietgenSkolen bjbu & nokn - TietgenSkolen

7 bjbu & nokn - TietgenSkolen
Processer vs. Tråde Der er mindst to former for samtidighed: Multiprocessing Multithreading bjbu & nokn - TietgenSkolen

8 bjbu & nokn - TietgenSkolen
Multiprocessing Samtidighed på tværs af applikationer Til heavy-weight opgaver (IIS, SQL, Server, …) Hver proces eksekverer én enkelt tråd bjbu & nokn - TietgenSkolen

9 bjbu & nokn - TietgenSkolen
Multithreading Samtidighed i applikationer Forskellige tråde udfører forskellige opgaver Perfekt til light-weight opgaver (Metodekald, UI-opdateringer, …) bjbu & nokn - TietgenSkolen

10 bjbu & nokn - TietgenSkolen
Multithreading Samtidighed i .NET Tråde håndteres af CLR Tråde har deres egen stak (locals), men deler globals og heap bjbu & nokn - TietgenSkolen

11 bjbu & nokn - TietgenSkolen
Tråde i .NET bjbu & nokn - TietgenSkolen

12 bjbu & nokn - TietgenSkolen
Trådes livscyklus bjbu & nokn - TietgenSkolen

13 bjbu & nokn - TietgenSkolen
Delegater Delegater er objekter, der refererer til metoder – tænk ”funktionspointer” – herved kan man få variable metode-kald og overføre metoder som parametre. delegate private void MinMethod(...) { . } - med delegater kan man kalde en underliggende metode på en typesikker måde - med delegater kan man arbejde med metodereferencer på en objektorienteret facon bjbu & nokn - TietgenSkolen bjbu & nokn - TietgenSkolen

14 bjbu & nokn - TietgenSkolen
Window Forms Hvordan ved en knap, hvilken metode den skal kalde ved et click-event? Det ved den heller ikke! Den kalder metoden bagved delegaten … Button Click: delegate private void btnAdd_Click(object sender, EventArgs e) { int i, j, k; i = int.Parse(this.txtNumber1.Text); j = int.Parse(this.txtNumber2.Text); k = i + j; System.Windows.Forms.MessageBox.Show("Sum = " + k); } bjbu & nokn - TietgenSkolen

15 Delegat-baseret kode i VS
. this.btnAdd = new Button(); this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); bjbu & nokn - TietgenSkolen

16 Instantiering af tråde
Tråde kaldes ikke, de startes … Man kan derfor ikke medsende parametre, modtage returværdi og fange exceptions på sædvanlig vis Trådet kode skal håndtere fejl … Uhåndterede fejl vil terminere applikationen Gør designet simpelt … Trådning er et minefelt – fælles ressourcer giver anledning til kritiske sektioner, race conditions, deadlock, … bjbu & nokn - TietgenSkolen

17 bjbu & nokn - TietgenSkolen
Tråde – 2 typer To typer tråde Dedikerede tråde programmør opretter og tilknytter metode ”kører tråd-metoden (job) én gang” Tråd pulje (worker-threads) Trådmetoder (job) pladseres i en kø, hvorfra trådpuljen udvælger og afvikler Tråde i puljen stopper ikke (suspendes blot hvis ikke noget arbejde) bjbu & nokn - TietgenSkolen

18 bjbu & nokn - TietgenSkolen
Tråde – oprettelse Oprettelse af dedikeret tråd: Tråd objekt med tilknyttet delegat 2 muligheder for delegat void metode uden parameter void metode med et objekt som parameter Delegat angives som parameter ved oprettelsen af tråd-objekt Evt. parameter (1 objekt) angives i trådens startmetode bjbu & nokn - TietgenSkolen

19 Tråde – start uden parameter
Oprettelse og start af tråd uden parameter: using System.Threading; Thread tråd = new Thread(new ThreadStart(TrådMetode)); eller blot = new Thread(TrådMetode); tråd.Start(); void TrådMetode() { bjbu & nokn - TietgenSkolen

20 Tråde – start med parameter
Oprettelse og start af tråd med parameter: using System.Threading; Thread tråd = new Thread(new ParameterizedThreadStart (TrådMetode)); eller blot = new Thread(TrådMetode); tråd.Start( 10 ); void TrådMetode(object startparameter) { int tal = (int) startparameter; bjbu & nokn - TietgenSkolen

21 Tråde – start i trådpulje
Start af tråd-metode i trådpulje: Parameter kan udelades i start og vil så være null i metoden using System.Threading; ThreadPool.QueueUserWorkItem(new WaitCallback(TrådPoolMetode),10); eller blot ThreadPool.QueueUserWorkItem(TrådPoolMetode,10); void TrådMetode(object state) { int tal = (int) state; bjbu & nokn - TietgenSkolen

22 bjbu & nokn - TietgenSkolen
Tråde - metoder Væsentlige Properties og metoder Thread klassen: Sleep(..) CurrentThread Tråd objekt: Join() IsAlive Priority IsThreadPoolThread Interrupt() (afbryder wait sleep join) IsBackground (set og get) bjbu & nokn - TietgenSkolen

23 bjbu & nokn - TietgenSkolen
Tråde – timer Timer – speciel tråd med ekstra parametre for enkelt eller repeterende ticks (bemærk ingen start-metode). using System.Threading; Timer timer = new Timer(new TimerCallback (TimerMetode),…….); eller blot = new Timer(TimerMetode,……); void TimerMetode(object state) { bjbu & nokn - TietgenSkolen

24 Synkronisering – mekanismer
Fere mulige mekanismer: Monitor lock (excetionsafe Monitor wrapper) Interlocked (tælle semaphore) ReaderWriterLock (reader/writer problem – med kaskadekald) Mutex (binær kerne-semafor – deles af processer) Semaphore (givet antal adgange til ressource) bjbu & nokn - TietgenSkolen

25 Synkronisering – Monitor
Monitor med metoderne: Enter (lock-object) - blocking lock Exit (lock-object) - release Wait (lock-object) - release and wait Pulse (lock-object) - notify PulseAll (lock-object) - notifyall TryEnter (lock-object) - nonblocking lock bjbu & nokn - TietgenSkolen

26 bjbu & nokn - TietgenSkolen
Synkronisering - lock lock (lock-object) – exception safe Monitor wrapper Svarer til: Monitor.Enter(lock-object); try { …. } finally { Monitor.Exit(lock-object); bjbu & nokn - TietgenSkolen

27 Synkronisering - ReaderWriterLock
ReaderWriterLock (spec. semafor for nem løsning af reader-writer problemet) Vigtige metoder: AcquireReaderLock (lock-object) ReleaseReaderLock (lock-object) AcquireWriterLock (lock-object) (pas på deadlock hvis allerede readerlock) ReleaseWriterLock (lock-object) UpgradeToWriterLock (lock-object) DowngradeFromWriterLock (lock-object) bjbu & nokn - TietgenSkolen

28 Synkronisering - wrapper klasse
Der er lavet synkroniserede wrapper klasser for flere colletionklasser. Eks. for ArrayList ArrayList list = new ArrayList(); ArrayList safelist = ArrayList.Synchronized(list); bjbu & nokn - TietgenSkolen

29 Design af trådsikre klasser
bjbu & nokn - TietgenSkolen

30 Trådsikre klasser - problem
Hvis en tråd afbrydes, medens den arbejder på et objekt, er der risiko for, at objektet efterlades i en inkonsistent tilstand. Dette kan give problemer, når en anden tråd forsøger at få tilgang til objektet bjbu & nokn - TietgenSkolen

31 Trådsikre klasser - løsning
Løsningen er at forhindre mere end én tråd ad gangen i at få tilgang til de kritiske områder i koden bjbu & nokn - TietgenSkolen

32 Single Threaded Execution
Vha. lock(obj) opnår en tråd eneret på et objekt – en lås Låsen frigives, når tråden forlader det kritiske område eller ved kald af metoden Monitor.Wait(obj) på objektet. Kritiske områder på samme objekt deler samme lås! bjbu & nokn - TietgenSkolen

33 bjbu & nokn - TietgenSkolen
Liveness problemer Starvation (udhungring) En tråd, som er i tilstanden ready, får aldrig lejlighed til at køre, fordi der findes andre tråde med højere prioritet Dormancy (dvale) En tråd, som er i tilstanden blocked on wait, vækkes aldrig med Monitor.Pulse() Deadlock (hårdknude) To eller flere tråde kæmper om flere fælles ressourcer, og hver tråd efterspørger på samme tid disse ressourcer Premature Termination (for tidlig død) En tråd termineres for tidligt og hindrer derved andre tråde i at blive vækket. (Evig dvale) bjbu & nokn - TietgenSkolen

34 bjbu & nokn - TietgenSkolen
Brug af lock() Nødvendig, hvis man vil lave "trådsikre klasser" Ej omkostningsfrit: Kræver CPU-kraft  langsommere programafvikling "Hellere for mange synkroniserede blokke end for få!" MEN - pas på deadlocks bjbu & nokn - TietgenSkolen

35 bjbu & nokn - TietgenSkolen
Ressource-Monitor Ressource-Monitor indkapsler fælles ressourcer som private attributter og sikrer trådene enetilgang vha. lock() til de kritiske områder Formål Overvågning af trådes adgang til fælles ressourcer bjbu & nokn - TietgenSkolen

36 bjbu & nokn - TietgenSkolen
Ressource-Monitor Objekt, hvor de fælles ressourcer er samlet som attributter Der er udelelig adgang til monitorens kritiske områder Én monitor-lock pr. kritisk område bjbu & nokn - TietgenSkolen

37 bjbu & nokn - TietgenSkolen
Early notification Problem Monitor.Pulse() sendes før betingelserne for Monitor.Wait er opfyldt Konsekvens Wait-tråden vækkes før tid Løsning Gentjek betingelserne for Monitor.Wait, når Wait-tråden vækkes Konklusion Anvend altid while (i stedet for if) i forbindelse med check af wait-betingelser bjbu & nokn - TietgenSkolen

38 bjbu & nokn - TietgenSkolen
Early notification Bufferen er tom! C1-tråden er i Wait-tilstand P-tråden generer et nyt element og kalder monitorens synkroniserede put-metode C1-tråden underrettes via Pulse, og tråden går i ready-tilstand P-tråden forlader monitorens put-metode og slipper objekt-låsen på monitoren Bufferen indeholder nu ét element! Trådskifte! C2-tråden trækker et element fra bufferen ved at kalde monitorens get-metode C2-tråden forlader monitorens get-metode og slipper objekt-låsen på monitoren Der er ingen elementer i bufferen! C1 fortsætter nu fra Wait i monitorens get-metode i forsøget på at trække endnu et element fra bufferen … Dette er ikke muligt! bjbu & nokn - TietgenSkolen

39 bjbu & nokn - TietgenSkolen
Guarded Suspension public void Put(int data) { lock(queuelock) { while (queue.Full) Monitor.Wait(queuelock); if (queue.Empty) Monitor.PulseAll(queuelock); this.queue.Enqueue(data); } bjbu & nokn - TietgenSkolen

40 bjbu & nokn - TietgenSkolen
Guarded Suspension public void Get(int data) { lock(queuelock) { while (queue.Empty) Monitor.Wait(this); if (queue.Full) Monitor.PulseAll(this); this.queue.Dequeue(data); } bjbu & nokn - TietgenSkolen

41 Design af trådet applikation
Anvend Producer-Consumer mønstret Anvend de 10 gode trådråd Husk den gyldne regel bjbu & nokn - TietgenSkolen

42 Peters/Ottos 10 gode trådråd
Bestem tråde Bestem trådmetoder Bestem fælles ressourcer Bestem monitorer - Én monitor for hver uafhængig fælles ressource Bestem monitor-klasser Bestem kritiske sektioner Bestem Wait/Pulse – Et par for hver tilstand, som kræver, at en tråd venter på en anden Fordel Wait og Pulse (Husk ”Guarded Suspension”-mønstret) Lav pseudo-kode for monitor-klassernes metoder Lav pseudo-kode for tråd-klassernes run-metoder bjbu & nokn - TietgenSkolen

43 bjbu & nokn - TietgenSkolen
Flere gode trådråd Tilstræb at lave et nyt objekt for hver trådmetode Definer en bool variabel til stop-signal på trådobjektet og brug ikke Abort. Tråden må chekke i koden og lukke pænt. Brug ikke ”this” som lock-object, men et privat låse-objekt, da ”this”-objektet også kan låses ”udefra” hvilket øger risiko for deadlock. bjbu & nokn - TietgenSkolen

44 bjbu & nokn - TietgenSkolen
Den gyldne UI-regel UI-baserede .NET-applikationer Den tråd, som har skabt UI’en ejer UI’en – Ingen anden tråd må tilgå UI’ens kontrolelementer … bjbu & nokn - TietgenSkolen


Download ppt "Tråde og synkronisering"

Lignende præsentationer


Annoncer fra Google