Download præsentationen
Præsentation er lastning. Vent venligst
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
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.