Trde og synkronisering 9302020 bjbu nokn Tietgen Skolen
Tråde og synkronisering 9/30/2020 bjbu & nokn - Tietgen. Skolen 1
Hvorfor trådning? • Performance • Responsivness 9/30/2020 bjbu & nokn - Tietgen. Skolen 2
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å 9/30/2020 bjbu & nokn - Tietgen. Skolen 3
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 9/30/2020 bjbu & nokn - Tietgen. Skolen 4
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 9/30/2020 bjbu & nokn - Tietgen. Skolen 5
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 … 9/30/2020 bjbu & nokn - Tietgen. Skolen 6
Processer vs. Tråde • Der er mindst to former for samtidighed: – Multiprocessing – Multithreading 9/30/2020 bjbu & nokn - Tietgen. Skolen 7
Multiprocessing • Samtidighed på tværs af applikationer • Til heavy-weight opgaver (IIS, SQL, Server, …) • Hver proces eksekverer én enkelt tråd 9/30/2020 bjbu & nokn - Tietgen. Skolen 8
Multithreading • Samtidighed i applikationer – Forskellige tråde udfører forskellige opgaver – Perfekt til light-weight opgaver (Metodekald, UI-opdateringer, …) 9/30/2020 bjbu & nokn - Tietgen. Skolen 9
Multithreading • Samtidighed i. NET – Tråde håndteres af CLR – Tråde har deres egen stak (locals), men deler globals og heap 9/30/2020 bjbu & nokn - Tietgen. Skolen 10
Tråde i. NET 9/30/2020 bjbu & nokn - Tietgen. Skolen 11
Trådes livscyklus 9/30/2020 bjbu & nokn - Tietgen. Skolen 12
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 Min. Method(. . . ) {. . . } - med delegater kan man kalde en underliggende metode på en typesikker måde - med delegater kan man arbejde med metodereferencer på en objektorienteret facon 9/30/2020 bjbu & nokn - Tietgen. Skolen 13
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 btn. Add_Click(object sender, Event. Args e) { int i, j, k; i = int. Parse(this. txt. Number 1. Text); j = int. Parse(this. txt. Number 2. Text); k = i + j; System. Windows. Forms. Message. Box. Show("Sum = " + k); } 9/30/2020 bjbu & nokn - Tietgen. Skolen 14
Delegat-baseret kode i VS . . . this. btn. Add = new Button(); this. btn. Add. Click += new System. Event. Handler(this. btn. Add_Click ); 9/30/2020 bjbu & nokn - Tietgen. Skolen 15
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 … – 9/30/2020 Trådning er et minefelt – fælles ressourcer giver anledning til kritiske sektioner, race conditions, deadlock, … bjbu & nokn - Tietgen. Skolen 16
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) 9/30/2020 bjbu & nokn - Tietgen. Skolen 17
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ådobjekt Evt. parameter (1 objekt) angives i trådens startmetode 9/30/2020 bjbu & nokn - Tietgen. Skolen 18
Tråde – start uden parameter Oprettelse og start af tråd uden parameter: using System. Threading; … Thread tråd = new Thread(new Thread. Start(Tråd. Metode)); eller blot = new Thread(Tråd. Metode); tråd. Start(); … … void Tråd. Metode() { … 9/30/2020 bjbu & nokn - Tietgen. Skolen 19
Tråde – start med parameter Oprettelse og start af tråd med parameter: using System. Threading; … Thread tråd = new Thread(new Parameterized. Thread. Start (Tråd. Metode)); eller blot = new Thread(Tråd. Metode); tråd. Start( 10 ); … … void Tråd. Metode(object startparameter) { int tal = (int) startparameter; … 9/30/2020 bjbu & nokn - Tietgen. Skolen 20
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; … Thread. Pool. Queue. User. Work. Item(new Wait. Callback(Tråd. Pool. Metode), 10); eller blot Thread. Pool. Queue. User. Work. Item(Tråd. Pool. Metode, 10); … … void Tråd. Metode(object state) { int tal = (int) state; … 9/30/2020 bjbu & nokn - Tietgen. Skolen 21
Tråde - metoder Væsentlige Properties og metoder Thread klassen: • Sleep(. . ) • Current. Thread Tråd objekt: • Join() • Is. Alive • Priority • Is. Thread. Pool. Thread • Interrupt() (afbryder wait sleep join) • Is. Background (set og get) 9/30/2020 bjbu & nokn - Tietgen. Skolen 22
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 Timer. Callback (Timer. Metode), ……. ); eller blot = new Timer(Timer. Metode, ……); … void Timer. Metode(object state) { … 9/30/2020 bjbu & nokn - Tietgen. Skolen 23
Synkronisering – mekanismer Fere mulige mekanismer: • • Monitor lock (excetionsafe Monitor wrapper) Interlocked (tælle semaphore) Reader. Writer. Lock (reader/writer problem – med kaskadekald) • Mutex (binær kerne-semafor – deles af processer) • Semaphore (givet antal adgange til ressource) 9/30/2020 bjbu & nokn - Tietgen. Skolen 24
Synkronisering – Monitor med metoderne: • Enter (lock-object) • Exit (lock-object) • Wait (lock-object) • Pulse. All (lock-object) • Try. Enter (lock-object) 9/30/2020 - blocking lock - release and wait - notifyall - nonblocking lock bjbu & nokn - Tietgen. Skolen 25
Synkronisering - lock (lock-object) – exception safe Monitor wrapper Svarer til: Monitor. Enter(lock-object); try { …. } finally { Monitor. Exit(lock-object); } 9/30/2020 bjbu & nokn - Tietgen. Skolen 26
Synkronisering - Reader. Writer. Lock (spec. semafor nem løsning af reader-writer problemet) Vigtige metoder: • • • Acquire. Reader. Lock (lock-object) Release. Reader. Lock (lock-object) Acquire. Writer. Lock (lock-object) (pas på deadlock hvis allerede readerlock) Release. Writer. Lock (lock-object) Upgrade. To. Writer. Lock (lock-object) Downgrade. From. Writer. Lock (lock-object) 9/30/2020 bjbu & nokn - Tietgen. Skolen 27
Synkronisering - wrapper klasse Der er lavet synkroniserede wrapper klasser for flere colletionklasser. Eks. for Array. List list = new Array. List(); Array. List safelist = Array. List. Synchronized(list); 9/30/2020 bjbu & nokn - Tietgen. Skolen 28
Design af trådsikre klasser 9/30/2020 bjbu & nokn - Tietgen. Skolen 29
Trådsikre klasser - problem • 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 9/30/2020 bjbu & nokn - Tietgen. Skolen 30
Trådsikre klasser - løsning • 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 9/30/2020 bjbu & nokn - Tietgen. Skolen 31
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! 9/30/2020 bjbu & nokn - Tietgen. Skolen 32
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) 9/30/2020 bjbu & nokn - Tietgen. Skolen 33
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 9/30/2020 bjbu & nokn - Tietgen. Skolen 34
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 9/30/2020 bjbu & nokn - Tietgen. Skolen 35
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 9/30/2020 bjbu & nokn - Tietgen. Skolen 36
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 9/30/2020 bjbu & nokn - Tietgen. Skolen 37
Early notification 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Bufferen er tom! C 1 -tråden er i Wait-tilstand P-tråden generer et nyt element og kalder monitorens synkroniserede put-metode C 1 -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! C 2 -tråden trækker et element fra bufferen ved at kalde monitorens get-metode C 2 -tråden forlader monitorens get-metode og slipper objekt-låsen på monitoren Der er ingen elementer i bufferen! Trådskifte! C 1 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! 9/30/2020 bjbu & nokn - Tietgen. Skolen 38
Guarded Suspension public void Put(int data) { lock(queuelock) { while (queue. Full) Monitor. Wait(queuelock); if (queue. Empty) Monitor. Pulse. All(queuelock); this. queue. Enqueue(data); } } 9/30/2020 bjbu & nokn - Tietgen. Skolen 39
Guarded Suspension public void Get(int data) { lock(queuelock) { while (queue. Empty) Monitor. Wait(this); if (queue. Full) Monitor. Pulse. All(this); this. queue. Dequeue(data); } } 9/30/2020 bjbu & nokn - Tietgen. Skolen 40
Design af trådet applikation • Anvend Producer-Consumer mønstret • Anvend de 10 gode trådråd • Husk den gyldne regel 9/30/2020 bjbu & nokn - Tietgen. Skolen 41
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 9/30/2020 bjbu & nokn - Tietgen. Skolen 42
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. 9/30/2020 bjbu & nokn - Tietgen. Skolen 43
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 … 9/30/2020 bjbu & nokn - Tietgen. Skolen 44
- Slides: 44