Realtidssystem - Meddelanden och händelsehantering - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp Föreläsning 4 Kursens innehåll motsvarar tidigare omgångar under beteckning EDA698 Stora delar baserad på: Föreläsningsmaterial EDA040 (Klas Nilsson, Mathias Haage) samt EDA698 (Mats Lilja) 1
Innehåll Meddelanden Monitorer som postfack - mailbox Trådkommunikation via mailbox / meddelanden 2
Buffer - en speciell monitor som är en brevlåda 3
Buffer - en speciell monitor som är en brevlåda Monitorer i allmänhet skyddar delade resurser. En speciell monitor är en buffer med metoder post och fetch, som erbjuder en form av kösystem och därmed ett dataflöde 3
Buffer - en speciell monitor som är en brevlåda Monitorer i allmänhet skyddar delade resurser. En speciell monitor är en buffer med metoder post och fetch, som erbjuder en form av kösystem och därmed ett dataflöde Data kan då vara information och/eller synkronisationsmedel 3
Buffer - en speciell monitor som är en brevlåda Monitorer i allmänhet skyddar delade resurser. En speciell monitor är en buffer med metoder post och fetch, som erbjuder en form av kösystem och därmed ett dataflöde Data kan då vara information och/eller synkronisationsmedel Data är då kallad meddelanden (messages) och själva buffer är en brevlåda (mailbox) 3
Buffer - en speciell monitor som är en brevlåda Monitorer i allmänhet skyddar delade resurser. En speciell monitor är en buffer med metoder post och fetch, som erbjuder en form av kösystem och därmed ett dataflöde Data kan då vara information och/eller synkronisationsmedel Data är då kallad meddelanden (messages) och själva buffer är en brevlåda (mailbox) Mellan Java-trådar (dvs inom samma program och minnesram) kan ett meddelande också vara en referens till ett objekt (Object) 3
Buffer - en speciell monitor som är en brevlåda Monitorer i allmänhet skyddar delade resurser. En speciell monitor är en buffer med metoder post och fetch, som erbjuder en form av kösystem och därmed ett dataflöde Data kan då vara information och/eller synkronisationsmedel Data är då kallad meddelanden (messages) och själva buffer är en brevlåda (mailbox) Mellan Java-trådar (dvs inom samma program och minnesram) kan ett meddelande också vara en referens till ett objekt (Object) class Buffer { } //... synchronized void post( Object o){ while( buff.size() >= maxsize) { wait(); } if( buff.isempty()) notifyall(); buff.add( o); } synchronized Object fetch( void){ while( buff.isempty()) { wait(); } if( buff.size() >= maxsize) notifyall(); return buff.remove(s); } 3
Skicka meddelanden - Mailbox 4
Skicka meddelanden - Mailbox Producer-Consumer (producent-konsument)-relationer är vanliga mellan olika trådar av ett program 4
Skicka meddelanden - Mailbox Producer-Consumer (producent-konsument)-relationer är vanliga mellan olika trådar av ett program Asymmetrisk synkronisering / signalering: producenten (producer) måste kunna fortsätta utan att den behöver vänta på konsumenten (consumer) 4
Skicka meddelanden - Mailbox Producer-Consumer (producent-konsument)-relationer är vanliga mellan olika trådar av ett program Asymmetrisk synkronisering / signalering: producenten (producer) måste kunna fortsätta utan att den behöver vänta på konsumenten (consumer) Information / data ska överföras och kallas för meddelande (message) 4
Skicka meddelanden - Mailbox Producer-Consumer (producent-konsument)-relationer är vanliga mellan olika trådar av ett program Asymmetrisk synkronisering / signalering: producenten (producer) måste kunna fortsätta utan att den behöver vänta på konsumenten (consumer) Information / data ska överföras och kallas för meddelande (message) Vi får asynkron kommunikation (signalering och dataöverföring) med lagring av information (buffering) och interaktion mellan aktiviteter (trådar) (activity interaction) 4
Skicka meddelanden - Mailbox Producer-Consumer (producent-konsument)-relationer är vanliga mellan olika trådar av ett program Asymmetrisk synkronisering / signalering: producenten (producer) måste kunna fortsätta utan att den behöver vänta på konsumenten (consumer) Information / data ska överföras och kallas för meddelande (message) Vi får asynkron kommunikation (signalering och dataöverföring) med lagring av information (buffering) och interaktion mellan aktiviteter (trådar) (activity interaction) Dessutom gäller för komplexa system som finns idag: 4
Skicka meddelanden - Mailbox Producer-Consumer (producent-konsument)-relationer är vanliga mellan olika trådar av ett program Asymmetrisk synkronisering / signalering: producenten (producer) måste kunna fortsätta utan att den behöver vänta på konsumenten (consumer) Information / data ska överföras och kallas för meddelande (message) Vi får asynkron kommunikation (signalering och dataöverföring) med lagring av information (buffering) och interaktion mellan aktiviteter (trådar) (activity interaction) Dessutom gäller för komplexa system som finns idag: Distribution (fördelning): Trådar är (eller måste förberedas för att bli) fördelade över flera datorer med nätverkskommunikation emellan dem 4
Skicka meddelanden - Mailbox Producer-Consumer (producent-konsument)-relationer är vanliga mellan olika trådar av ett program Asymmetrisk synkronisering / signalering: producenten (producer) måste kunna fortsätta utan att den behöver vänta på konsumenten (consumer) Information / data ska överföras och kallas för meddelande (message) Vi får asynkron kommunikation (signalering och dataöverföring) med lagring av information (buffering) och interaktion mellan aktiviteter (trådar) (activity interaction) Dessutom gäller för komplexa system som finns idag: Distribution (fördelning): Trådar är (eller måste förberedas för att bli) fördelade över flera datorer med nätverkskommunikation emellan dem Encapsulation (kapsling): Skyddmekanismer för jämlöpande exekvering och realtidsegenskaper kräver medel för utbyte av meddelanden mellan exekverande objekt (trådar) 4
Assistent och chef - producer och consumer Vi vill ha - asymmetrisk synkronisering - producer ska kunna jobba vidare utan att behöva vänta på consumer - överföring av information - ett meddelande (message) 5
Assistent och chef - producer och consumer Vi vill ha - asymmetrisk synkronisering - producer ska kunna jobba vidare utan att behöva vänta på consumer - överföring av information - ett meddelande (message) Hittills har vi kunnat göra detta med monitorer: 5
Assistent och chef - producer och consumer Vi vill ha - asymmetrisk synkronisering - producer ska kunna jobba vidare utan att behöva vänta på consumer - överföring av information - ett meddelande (message) Hittills har vi kunnat göra detta med monitorer: står för metodanrop A (p) put() Postfack / mailbox get() C (c) lägger dokument i inkorgen tar dokument från inkorgen 5
Assistent och chef - producer och consumer Vi vill ha - asymmetrisk synkronisering - producer ska kunna jobba vidare utan att behöva vänta på consumer - överföring av information - ett meddelande (message) Hittills har vi kunnat göra detta med monitorer: står för metodanrop A (p) put() Postfack / mailbox get() C (c) lägger dokument i inkorgen tar dokument från inkorgen Vi inför begreppet Mailbox (brevlåda) när vi använder monitorn så här och ritar den lite annorlunda 5
Assistent och chef - producer och consumer Vi vill ha - asymmetrisk synkronisering - producer ska kunna jobba vidare utan att behöva vänta på consumer - överföring av information - ett meddelande (message) Hittills har vi kunnat göra detta med monitorer: står för metodanrop A (p) put() Postfack / mailbox get() C (c) lägger dokument i inkorgen tar dokument från inkorgen Vi inför begreppet Mailbox (brevlåda) när vi använder monitorn så här och ritar den lite annorlunda Mailbox står för dataflöde A (p) C (c) lägger dokument i inkorgen tar dokument från inkorgen 5
Mailboxar i system Kommunikation mellan trådar leder ofta till ett helt mailbox-nätverk P1 P2 C C1/P1 C2/P2 6
Cafeteria ++ Cafeteria Jag fixar mackorna! Jag vill ha... Idag: - pasta - mackor efter önskemål 7
Cafeteria ++ Cafeteria Beställningar Räkor Jag fixar mackorna! Jag vill ha... Idag: - pasta - mackor efter önskemål 7
Cafeteria ++ Cafeteria Beställningar Skagenröra Jag fixar mackorna! Jag vill ha... Idag: - pasta - mackor efter önskemål (Räkor) 7
Cafeteria ++ Cafeteria Beställningar Skagenröra Ost Jag fixar mackorna! Jag vill ha... Tonfisk Idag: - pasta - mackor efter önskemål Ost Salami Kalkon (Räkor) 7
Cafeteria ++ Cafeteria Beställningar Ost Tonfisk Jag fixar mackorna! Jag vill ha... Ost Idag: - pasta - mackor efter önskemål Salami Kalkon (Skagenröra) 7
Kommunikationsprinciper 8
Kommunikationsprinciper Samma princip gäller både för operativsystemprocesser och trådar inom ett program 8
Kommunikationsprinciper Samma princip gäller både för operativsystemprocesser och trådar inom ett program En tråd kan lägga meddelanden i flera lådor (mailbox) 8
Kommunikationsprinciper Samma princip gäller både för operativsystemprocesser och trådar inom ett program En tråd kan lägga meddelanden i flera lådor (mailbox) En mailbox kan (i Java) hanterar olika typer av meddelanden 8
Kommunikationsprinciper Samma princip gäller både för operativsystemprocesser och trådar inom ett program En tråd kan lägga meddelanden i flera lådor (mailbox) En mailbox kan (i Java) hanterar olika typer av meddelanden En tråd har i de flesta fallen enbart en mailbox den hämtar / läser meddelanden ifrån - annars kan det blir problem, att hämta ett meddelande är blockerande 8
Kommunikationsprinciper Samma princip gäller både för operativsystemprocesser och trådar inom ett program En tråd kan lägga meddelanden i flera lådor (mailbox) En mailbox kan (i Java) hanterar olika typer av meddelanden En tråd har i de flesta fallen enbart en mailbox den hämtar / läser meddelanden ifrån - annars kan det blir problem, att hämta ett meddelande är blockerande Meddelande-objekt måste vara serialized (omvandlat till ett byte-flöde) för att kunna skickas till en annan OS-process 8
Kommunikationsprinciper Samma princip gäller både för operativsystemprocesser och trådar inom ett program En tråd kan lägga meddelanden i flera lådor (mailbox) En mailbox kan (i Java) hanterar olika typer av meddelanden En tråd har i de flesta fallen enbart en mailbox den hämtar / läser meddelanden ifrån - annars kan det blir problem, att hämta ett meddelande är blockerande Meddelande-objekt måste vara serialized (omvandlat till ett byte-flöde) för att kunna skickas till en annan OS-process Inom en process / ett program, alltså mellan trådar, kan vi skicka pekare (pointers) / objektreferenser eller en kopia av hela objektet 8
Kommunikationsprinciper Samma princip gäller både för operativsystemprocesser och trådar inom ett program En tråd kan lägga meddelanden i flera lådor (mailbox) En mailbox kan (i Java) hanterar olika typer av meddelanden En tråd har i de flesta fallen enbart en mailbox den hämtar / läser meddelanden ifrån - annars kan det blir problem, att hämta ett meddelande är blockerande Meddelande-objekt måste vara serialized (omvandlat till ett byte-flöde) för att kunna skickas till en annan OS-process Inom en process / ett program, alltså mellan trådar, kan vi skicka pekare (pointers) / objektreferenser eller en kopia av hela objektet Hur kan man säkerställa att inte innehållet i ett meddelande blir ändrat av en annan tråd...??? 8
Kommunikation mellan trådar/processer Lokal Fördelad Synkron Objekt-metodanrop RPC (C) / RMI (Java) Synkron Monitor-metodanrop Databas Asynkron Händelsebuffer (event buffer) Flöde (stream) (pipe/file/socket) 9
Kommunikation mellan trådar/processer Lokal Fördelad Synkron Objekt-metodanrop RPC (C) / RMI (Java) Synkron Monitor-metodanrop Databas Asynkron Händelsebuffer (event buffer) Flöde (stream) (pipe/file/socket) Synkron hantering av händelser (events): 9
Kommunikation mellan trådar/processer Lokal Fördelad Synkron Objekt-metodanrop RPC (C) / RMI (Java) Synkron Monitor-metodanrop Databas Asynkron Händelsebuffer (event buffer) Flöde (stream) (pipe/file/socket) Synkron hantering av händelser (events): Javas princip för händelsehantering (AWT / Swing) (OBS: en tråd!) - firing events vs posting events 9
Kommunikation mellan trådar/processer Lokal Fördelad Synkron Objekt-metodanrop RPC (C) / RMI (Java) Synkron Monitor-metodanrop Databas Asynkron Händelsebuffer (event buffer) Flöde (stream) (pipe/file/socket) Synkron hantering av händelser (events): Javas princip för händelsehantering (AWT / Swing) (OBS: en tråd!) - firing events vs posting events Motsvarande EventObject för realtid / flertrådiga system: RTEvent 9
Kommunikation mellan trådar/processer Lokal Fördelad Synkron Objekt-metodanrop RPC (C) / RMI (Java) Synkron Monitor-metodanrop Databas Asynkron Händelsebuffer (event buffer) Flöde (stream) (pipe/file/socket) Synkron hantering av händelser (events): Javas princip för händelsehantering (AWT / Swing) (OBS: en tråd!) - firing events vs posting events Motsvarande EventObject för realtid / flertrådiga system: RTEvent Motsvarande synkron händelsehantering i se.lth.cs.realtime: Kolla klassdokumentationen till RTEventListener, RTEventListenerList och JThread 9
Kommunikation mellan trådar/processer Lokal Fördelad Synkron Objekt-metodanrop RPC (C) / RMI (Java) Synkron Monitor-metodanrop Databas Asynkron Händelsebuffer (event buffer) Flöde (stream) (pipe/file/socket) Synkron hantering av händelser (events): Javas princip för händelsehantering (AWT / Swing) (OBS: en tråd!) - firing events vs posting events Motsvarande EventObject för realtid / flertrådiga system: RTEvent Motsvarande synkron händelsehantering i se.lth.cs.realtime: Kolla klassdokumentationen till RTEventListener, RTEventListenerList och JThread Vi pratar INTE enkeltrådig synkron kommunikation i kursen! 9
Händelser som meddelanden 10
Händelser som meddelanden java.util.eventobject erbjuder en händelse-klass som kan användas för meddelanden, där det också är möjligt att få en referens till källan, alltså den skickande tråden / det skickande objektet 10
Händelser som meddelanden java.util.eventobject erbjuder en händelse-klass som kan användas för meddelanden, där det också är möjligt att få en referens till källan, alltså den skickande tråden / det skickande objektet se.lth.cs-realtime.event.rtevent är en subklass som har tidsstämpel, dvs objekten (instanserna) har en ålder (jfr java.awt.inputevent) 10
Händelser som meddelanden java.util.eventobject erbjuder en händelse-klass som kan användas för meddelanden, där det också är möjligt att få en referens till källan, alltså den skickande tråden / det skickande objektet se.lth.cs-realtime.event.rtevent är en subklass som har tidsstämpel, dvs objekten (instanserna) har en ålder (jfr java.awt.inputevent) vi utnyttjar just sådana tidsstämplade händelser (events) för asynkron kommunikation mellan trådar (posting events) - tidsstämpel är en förutsättning för att kunna uppfylla realtidskrav! 10
Händelser som meddelanden java.util.eventobject erbjuder en händelse-klass som kan användas för meddelanden, där det också är möjligt att få en referens till källan, alltså den skickande tråden / det skickande objektet se.lth.cs-realtime.event.rtevent är en subklass som har tidsstämpel, dvs objekten (instanserna) har en ålder (jfr java.awt.inputevent) vi utnyttjar just sådana tidsstämplade händelser (events) för asynkron kommunikation mellan trådar (posting events) - tidsstämpel är en förutsättning för att kunna uppfylla realtidskrav! OBS: jämför med grafikhantering, t ex swing eller andra grafik-bibliotek, som för det mesta sker enkeltrådigt (hela programmet är möjligen flertrådig, medans grafiken hanteras inom en tråd som vanligtvis är applikationens huvudtråd ) 10
Klassen RTEvent public abstract class RTEvent extends EventObject { protected long timestamp; // Creation time in ms. protected volatile transient Object owner; // Responsible thread. public RTEvent(); public RTEvent(Object source); public RTEvent(long ts); public RTEvent(Object source, long ts); public final Object getowner() public double getseconds() public long getmillis() public long getnanos() } // Use current Thread & TimeMillis. // Set source, default timestamp. // Set timestamp, default source // Override both defaults. 11
Mailbox - Monitor - Semafor 12
Mailbox - Monitor - Semafor En Mailbox kan implementeras med en Monitor, och en Semafor kan anses vara den enklaste typen av Monitor (eller användas för att bygga en sådan) 12
Mailbox - Monitor - Semafor En Mailbox kan implementeras med en Monitor, och en Semafor kan anses vara den enklaste typen av Monitor (eller användas för att bygga en sådan) Om vi skickar tomma meddelanden blir en Mailbox till en Semafor: 12
Mailbox - Monitor - Semafor En Mailbox kan implementeras med en Monitor, och en Semafor kan anses vara den enklaste typen av Monitor (eller användas för att bygga en sådan) Om vi skickar tomma meddelanden blir en Mailbox till en Semafor: värdet av räknaren i semaforen motsvarar antalet meddelanden i mailboxen 12
Mailbox - Monitor - Semafor En Mailbox kan implementeras med en Monitor, och en Semafor kan anses vara den enklaste typen av Monitor (eller användas för att bygga en sådan) Om vi skickar tomma meddelanden blir en Mailbox till en Semafor: värdet av räknaren i semaforen motsvarar antalet meddelanden i mailboxen send -metod motsvarar give() 12
Mailbox - Monitor - Semafor En Mailbox kan implementeras med en Monitor, och en Semafor kan anses vara den enklaste typen av Monitor (eller användas för att bygga en sådan) Om vi skickar tomma meddelanden blir en Mailbox till en Semafor: värdet av räknaren i semaforen motsvarar antalet meddelanden i mailboxen send -metod motsvarar give() receive -metod motsvarar take() 12
Mailbox - Monitor - Semafor En Mailbox kan implementeras med en Monitor, och en Semafor kan anses vara den enklaste typen av Monitor (eller användas för att bygga en sådan) Om vi skickar tomma meddelanden blir en Mailbox till en Semafor: värdet av räknaren i semaforen motsvarar antalet meddelanden i mailboxen send -metod motsvarar give() receive -metod motsvarar take() Samtliga tre metoder för resursdelning och kommunikation mellan trådar är alltså likvärdiga och lika mäktiga - valet beror dock på situationen och den omedelbara lämpligheten av en viss metod. Se alla tre laborationer för jämförelse! 12
RTEventBuffer - begränsad lagring 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds Nackdel med obegränsade lagringskapaciteter 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds Nackdel med obegränsade lagringskapaciteter Inte riktigt bra när det krävs ett omedelbart svar, dvs synkron kommunikation 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds Nackdel med obegränsade lagringskapaciteter Inte riktigt bra när det krävs ett omedelbart svar, dvs synkron kommunikation Någonstans finns det en faktisk begränsning av resurserna 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds Nackdel med obegränsade lagringskapaciteter Inte riktigt bra när det krävs ett omedelbart svar, dvs synkron kommunikation Någonstans finns det en faktisk begränsning av resurserna RTEventBuffer 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds Nackdel med obegränsade lagringskapaciteter Inte riktigt bra när det krävs ett omedelbart svar, dvs synkron kommunikation Någonstans finns det en faktisk begränsning av resurserna RTEventBuffer Realtidssystem - det krävs ofta också bra koll på resurserna, en obegränsad Mailbox med kopiering-vid-sändning skulle inte kunna garanteras hålla måttet - och garanti är just det som ett realtidssystem kräver 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds Nackdel med obegränsade lagringskapaciteter Inte riktigt bra när det krävs ett omedelbart svar, dvs synkron kommunikation Någonstans finns det en faktisk begränsning av resurserna RTEventBuffer Realtidssystem - det krävs ofta också bra koll på resurserna, en obegränsad Mailbox med kopiering-vid-sändning skulle inte kunna garanteras hålla måttet - och garanti är just det som ett realtidssystem kräver GC och Javas objekthanteringsmekanismer tillåter att man kan skicka objektreferenser till delad minne istället för att skicka djupa kopior av objekt. Det gör att storleken av meddelanden kan vara flexibelt även med en fast storlek på lagringen (Mailbox) 13
RTEventBuffer - begränsad lagring Fördelar med obegränsade lagringskapaciteter varje meddelande allokeras dynamiskt, man måste inte veta storleken etc... kopieringen av meddelanden när de skickas gör att man inte måste hantera delad minne (shared memory), dvs samma mekanism fungerar inom eller mellan OS-processer erbjuder full asymmetrisk synkronisation - meddelanden hanteras när trådarna behöver göra det När det inte finns GC tillgänglig, blir obegränsad oftast till en form av pool -hantering, då meddelanden återanvänds Nackdel med obegränsade lagringskapaciteter Inte riktigt bra när det krävs ett omedelbart svar, dvs synkron kommunikation Någonstans finns det en faktisk begränsning av resurserna RTEventBuffer Realtidssystem - det krävs ofta också bra koll på resurserna, en obegränsad Mailbox med kopiering-vid-sändning skulle inte kunna garanteras hålla måttet - och garanti är just det som ett realtidssystem kräver GC och Javas objekthanteringsmekanismer tillåter att man kan skicka objektreferenser till delad minne istället för att skicka djupa kopior av objekt. Det gör att storleken av meddelanden kan vara flexibelt även med en fast storlek på lagringen (Mailbox) detaljer i kompendiet! 13
Klassen RTEventBuffer ), ) [4] [3] [2] growth [1] [5] [6] fetchat RTEvent[] buffer currsize==7 [0] [11] [7] postat [10] [8] [9] 14
Klassen RTEventBuffer RTEventBuffer: En mailbox för hantering av meddelanden av typ RTEvent ), ) [5] [6] [4] [3] [2] fetchat RTEvent[] buffer currsize==7 growth [1] [0] [11] [7] postat [10] [8] [9] 14
Klassen RTEventBuffer RTEventBuffer: En mailbox för hantering av meddelanden av typ RTEvent Konstruktorer: public RTEventBuffer() public RTEventBuffer( int maxsize) public RTEventBuffer( int maxsize, Object lock) ), ) [5] [6] [4] [3] [2] fetchat RTEvent[] buffer currsize==7 growth [1] [0] [11] [7] postat [10] [8] [9] 14
Klassen RTEventBuffer RTEventBuffer: En mailbox för hantering av meddelanden av typ RTEvent Konstruktorer: public RTEventBuffer() public RTEventBuffer( int maxsize) public RTEventBuffer( int maxsize, Object lock) Exempel med maxsize == 12, currsize == 7 ), ) [5] [6] [4] [3] [2] fetchat RTEvent[] buffer currsize==7 growth [1] [0] [11] [7] postat [10] [8] [9] 14
Klassen RTEventBuffer RTEventBuffer: En mailbox för hantering av meddelanden av typ RTEvent Konstruktorer: public RTEventBuffer() public RTEventBuffer( int maxsize) public RTEventBuffer( int maxsize, Object lock) Exempel med maxsize == 12, currsize == 7 ), ) [5] [6] [4] [3] [2] fetchat RTEvent[] buffer currsize==7 growth [1] [0] [11] Hämta meddelande ur lådan: RTEvent fetch() [7] postat [10] [8] [9] 14
Klassen RTEventBuffer RTEventBuffer: En mailbox för hantering av meddelanden av typ RTEvent Konstruktorer: public RTEventBuffer() public RTEventBuffer( int maxsize) public RTEventBuffer( int maxsize, Object lock) Exempel med maxsize == 12, currsize == 7 ), ) [5] [6] [4] [3] [2] fetchat RTEvent[] buffer currsize==7 growth [1] [0] [11] Hämta meddelande ur lådan: RTEvent fetch() [7] postat [10] Skicka meddelande till lådan: RTEvent post( RTEvent ev) [8] [9] 14
Metoder i RTEventBuffer 15
Metoder i RTEventBuffer Metoder för att skicka eller hämta meddelanden av typ RTEvent: 15
Metoder i RTEventBuffer Metoder för att skicka eller hämta meddelanden av typ RTEvent: RTEvent post( RTEvent e) // standard: kalla dopost() // och returnera null void dopost( RTEvent e) // blockerande final RTEvent trypost( RTEvent e) // ej blockerande final RTEvent dofetch() // blockerande final RTEvent tryfetch() // ej blockerande 15
Metoder i RTEventBuffer Metoder för att skicka eller hämta meddelanden av typ RTEvent: RTEvent post( RTEvent e) // standard: kalla dopost() // och returnera null void dopost( RTEvent e) // blockerande final RTEvent trypost( RTEvent e) // ej blockerande final RTEvent dofetch() // blockerande final RTEvent tryfetch() // ej blockerande trypost ger null om uppdraget lyckades, annars kommer meddelandet tillbaka (jfr bounce because of overflow i din e-post-brevlåda) tryfetch ger null om uppdraget misslyckades, eller ger meddelandet som kunde hämtas 15
Metoder i RTEventBuffer Metoder för att skicka eller hämta meddelanden av typ RTEvent: RTEvent post( RTEvent e) // standard: kalla dopost() // och returnera null void dopost( RTEvent e) // blockerande final RTEvent trypost( RTEvent e) // ej blockerande final RTEvent dofetch() // blockerande final RTEvent tryfetch() // ej blockerande trypost ger null om uppdraget lyckades, annars kommer meddelandet tillbaka (jfr bounce because of overflow i din e-post-brevlåda) tryfetch ger null om uppdraget misslyckades, eller ger meddelandet som kunde hämtas Kolla status: 15
Metoder i RTEventBuffer Metoder för att skicka eller hämta meddelanden av typ RTEvent: RTEvent post( RTEvent e) // standard: kalla dopost() // och returnera null void dopost( RTEvent e) // blockerande final RTEvent trypost( RTEvent e) // ej blockerande final RTEvent dofetch() // blockerande final RTEvent tryfetch() // ej blockerande trypost ger null om uppdraget lyckades, annars kommer meddelandet tillbaka (jfr bounce because of overflow i din e-post-brevlåda) tryfetch ger null om uppdraget misslyckades, eller ger meddelandet som kunde hämtas Kolla status: boolean isempty() boolean isfull() void awaitempty() void awaitnotempty() void awaitfull() void awaitnotfull() 15
Metoder i RTEventBuffer Metoder för att skicka eller hämta meddelanden av typ RTEvent: RTEvent post( RTEvent e) // standard: kalla dopost() // och returnera null void dopost( RTEvent e) // blockerande final RTEvent trypost( RTEvent e) // ej blockerande final RTEvent dofetch() // blockerande final RTEvent tryfetch() // ej blockerande trypost ger null om uppdraget lyckades, annars kommer meddelandet tillbaka (jfr bounce because of overflow i din e-post-brevlåda) tryfetch ger null om uppdraget misslyckades, eller ger meddelandet som kunde hämtas Kolla status: boolean isempty() boolean isfull() void awaitempty() void awaitnotempty() void awaitfull() void awaitnotfull() Mer i kompendiet och dokumentationen av se.lth.cs.realtime 15
Trådar med mailbox - exempel 16
Trådar med mailbox - exempel class Producer extends Thread { Consumer receiver; MyMessage msg; public Producer( Consumer rec) { receiver = rec; } } public void run() { while( true) { char c = getchar(); msg = new MyMessage( c); receiver.putevent( msg); } } class MyMessage extends RTEvent { character ch; public MyMessage( char data) { } super(); ch = data; // timestamp! 16
Trådar med mailbox - exempel class Producer extends Thread { Consumer receiver; MyMessage msg; public Producer( Consumer rec) { receiver = rec; } } public void run() { while( true) { char c = getchar(); msg = new MyMessage( c); receiver.putevent( msg); } } class MyMessage extends RTEvent { character ch; public MyMessage( char data) { } super(); ch = data; // timestamp! class Consumer extends Thread { RTEventBuffer mailbox; public Consumer( int size) { mailbox = new RTEventBuffer( size); } public void putevent( RTEvent ev) { mailbox.post( ev); // in context of producer! } } public void run() { RTEvent m; while( true) { m = mailbox.fetch(); // in context of consumer! if( m instanceof MyMessage) { MyMessage msg = (MyMessage) m; usechar( msg.ch); } else { //... handle other messages } } //... 16
Trådar med mailbox - exempel class Producer extends Thread { Consumer receiver; MyMessage msg; public Producer( Consumer rec) { receiver = rec; } } public void run() { while( true) { char c = getchar(); msg = new MyMessage( c); receiver.putevent( msg); } } class MyMessage extends RTEvent { character ch; public MyMessage( char data) { } super(); ch = data; // timestamp! class Consumer extends Thread { RTEventBuffer mailbox; public Consumer( int size) { mailbox = new RTEventBuffer( size); } public void putevent( RTEvent ev) { mailbox.post( ev); // in context of producer! } } public void run() { RTEvent m; while( true) { m = mailbox.fetch(); // in context of consumer! if( m instanceof MyMessage) { MyMessage msg = (MyMessage) m; usechar( msg.ch); } else { //... handle other messages } } //... se.lth.cs.realtime erbjuder olika typer av trådar som har en mailbox (RTEventBuffer) inbyggd och som kan alltså kommunicera via RTEvent-meddelanden Se kompendiet, övning 5 och laboration 3 för detaljer 16
Kursöversikt - var är vi nu? Realtidssystem - jämlöpande processer under tidsgarantikrav (Föreläsning 1) Jämlöpande exekvering, trådhantering, hantering av delade resurser ömsesidig uteslutning, signalering, datahantering, trådkommunikation semafor: föreläsning 1, 2 övning 1, 2 laboration 1 Tidskrav, systemhantering, schemaläggning resursallokering, schemaläggning, prioritetshantering schemaläggningsanalys dödläge: föreläsning 5 övning 5 monitor: föreläsning 3 övning 3, 4 laboration 2 schemaläggning + analys: föreläsning 6, 7 övning 7 mailbox: föreläsning 4 övning 5, 6 laboration 3 17
Laboration 2, förberedelse 18
Laboration 2, förberedelse Förberedelse inför laboration 2 (hiss) 18
Laboration 2, förberedelse Förberedelse inför laboration 2 (hiss) Uppgiften förklaras lite mera ingående 18
Laboration 2, förberedelse Förberedelse inför laboration 2 (hiss) Uppgiften förklaras lite mera ingående Vi tittar på wait / notify! 18
Laboration 2, förberedelse Förberedelse inför laboration 2 (hiss) Uppgiften förklaras lite mera ingående Vi tittar på wait / notify! Målet är att bygga ett designförslag (klass-diagram + flöde för trådarnas operationer i monitorn) för laborationsprogrammet 18
Sammanfattning Recap monitorer Mailbox, meddelanden och händelsehantering för trådkommunikation och informationsutbyte Man borde kunna bygga ett litet program med några trådar som kommunicerar med hjälp av mailboxar och kunna hantera laboration 3. Man borde kunna resonera över vilken mekanism ( fristående semaforer, monitorer, både Java-monitorer eller hembakade, eller trådbunden mailbox) som passar bra i vilka situationer och tänka ut mindre exempel för varje Lästips: e-bok: Kap 6 (s 142-157) kompendium: Kap 2-4 ( Mailboxes) 19