Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

DAIMIProgrammering af Store Systemer1 Concurrency i Java – Samarbejdende tråde.

Lignende præsentationer


Præsentationer af emnet: "DAIMIProgrammering af Store Systemer1 Concurrency i Java – Samarbejdende tråde."— Præsentationens transcript:

1

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...


Download ppt "DAIMIProgrammering af Store Systemer1 Concurrency i Java – Samarbejdende tråde."

Lignende præsentationer


Annoncer fra Google