Download præsentationen
Præsentation er lastning. Vent venligst
Offentliggjort afAnne Marie Brøgger Redigeret for ca. et år siden
2
DAIMIProgrammering af Store Systemer1 Concurrency i Java – Samarbejdende tråde
3
DAIMIProgrammering af Store Systemer2 Samarbejdende tråde Uafhængige tråde er der få problemer i. Tråde som tilgår delte ressorcer kræver disciplin og mekanismer såsom monitorer og klient-side synkronisering. Når tråde decideret skal samarbejde bliver det rigtigt sjovt!
4
DAIMIProgrammering af Store Systemer3 Et klassisk eksempel Producer/Consumer Tænk f.eks. på printer køen i et netværk Hvordan får vi dataflowet effektivt uden vi mister data? Problemet er at Consumer skal afvente at der er noget at aftage, Producer afvente plads i køen... ProducerBuffer/KøAftager
5
DAIMIProgrammering af Store Systemer4 Buffer implementation Bufferen skal have metoder void store(Object o); Object retrieve() Da det gemte objekt naturligvis er en delt ressource mellem producent og aftager, skal bufferen være en monitor. Men hvad gør vi hvis aftageren ’retriever’ uden der er noget i bufferen?
6
DAIMIProgrammering af Store Systemer5 Retrieve Basalt set bliver den nødt til at vente på at der kommer noget ind i bufferen. Det giver to mulige steder at vente: i klient-side koden –bliv ved med at kalde ’retrieve’ af og til, indtil vi får fat i noget. –det kaldes også ’polling’ og koster en masse spildtid i buffer-koden –vent inde i ’retrieve’ til der er indsat noget –men - vi er i en monitor - så der er ingen der kan indsætte noget!!! Virker kun når producent og aftager arbejder i såkaldt ’lock-step’ = i perfekt takt.
7
DAIMIProgrammering af Store Systemer6 Dead locks Den sidst skitserede situation er slem: vi venter på at een skal indsætte noget i bufferen samtidigt sørger vores egen udelelige adgang for at dette aldrig sker... Denne skitserede situation kaldes en dead-lock - systemet stopper ganske simpelt! Dead-locks er erfaringsmæssigt meget svære at opspore i ens kode - og kan have katastrofale følger i vital software...
8
DAIMIProgrammering af Store Systemer7 Konklusion En tråd må ikke blokere en monitor når dens eneste chance for at forlade monitoren er at en anden tråd ændrer monitorens tilstand. Oversat: En tråd må ikke vente i ’retrieve’ når det eneste som kan få den ud af dens venteposition er at en anden får adgang til at ’store’ noget...
9
DAIMIProgrammering af Store Systemer8 En kommunikationskanal class Buffer { Object p; boolean empty = true; synchronized public void store(Object p) { ??? this.p = p; empty = false; } synchronized public Object retrieve() { ??? empty = true; return p; }
10
DAIMIProgrammering af Store Systemer9 await class Channel { Object p; boolean empty = true; synchronized public void store(Object p) { await (empty); this.p = p; empty = false; } synchronized public Object retrieve() { await (!empty); empty = true; return p; } En ”løsning” med await (ej Java)
11
DAIMIProgrammering af Store Systemer10 await i Java class Channel { Object p; boolean empty = true; synchronized public void store(Object p) { while (!empty) { try { wait() ; } catch (InterruptedException ie) {} } this.p = p; empty = false; notifyAll() ; } synchronized public Object retrieve() { while (empty) { try { wait() ; } catch (InterruptedException ie) {} } empty = true; notifyAll() ; return p; }
12
DAIMIProgrammering af Store Systemer11 Semantik wait() og notify() er metoder på Object (monitoren): wait() foretager to ting udeleligt: tråden i monitoren skifter til vente tilstand og afgiver afviklingsretten objektets monitor låses op i.e. ”lyskurven skifter til grønt” notify() tråden som har ventet længst i ventekøen skifter tilstand til ’runnable’ og indsættes nu i køen over tråde som venter på afviklingsret.
13
DAIMIProgrammering af Store Systemer12 Semantik notifyAll() ’vækker’ alle tråde som er i vente tilstand på den pågældende monitor. Bemærk at notifyAll() oftest er det ’rigtige’ valg. At en tråd har ventet længe er ikke det samme som at den kan løse konflikten. eks.: Hvis en aftager er først i ventekøen fulgt af en producer, og en aftager netop har taget objektet i bufferen - og derfor siger ’notify()’
14
DAIMIProgrammering af Store Systemer13 Hvorfor en while? Hvorfor skal der være en while løkke uden om wait() ??? Vi har stadig en race condition når flere tråde venter på monitor adgang. Eks.: En producer siger notify og fire aftagere står i vente- køen.
15
DAIMIProgrammering af Store Systemer14 Dead locks Et andet eksempel på dead-locks er når flere tråde skal have fat i flere ressourcer: ”De fattige skribenter” –To skribenter deler 1 blyant og 1 stykke papir –For at skrive skal de have både blyant og papir –Scenarie: Skribent A tager blyanten Skribent B tager papiret Nu venter de begge på udelelig adgang til en ressource som den anden sidder inde med. Æv...
16
DAIMIProgrammering af Store Systemer15 Tommelfingerreglen En tommelfingerregel for at løse deadlocks er at skaffe udelelig adgang for flere ressourcer i samme rækkefølge. Men der er også eksempler på det går galt...
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.