Realtidssystem. - Semaforer, trådsynkronisering - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 2

Relevanta dokument
Realtidssystem. - Semaforer, trådsynkronisering - EDA698 - Realtidssystem (Helsingborg) Elin A. Topp

Realtidssystem. - Monitorer, synkroniserade metoder - EDA698 - Realtidssystem (Helsingborg) Elin A. Topp

Realtidssystem. - Dödläge - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 5

Realtidssystem. - Introduktion, jämlöpande exekvering - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 1

Exam Concurrent and Real-Time Programming

Realtidssystem. - Introduktion, jämlöpande exekvering - EDA698 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 1

Tentamen Lösningar EDA698 Realtidssystem

Concurrency Saker händer samtidigt. Process En instans av ett program

Trådar. Aktiva objekt

Parallellism, återblick

Mekanismer. (implementation)

Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Realtidssystem. - Meddelanden och händelsehantering - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 4

Operativsystem - Processkommunikation

Objektorienterad Programkonstruktion. Föreläsning dec 2015

Föreläsning 15: Parallella subrutiner. Parallellitet. Varför parallella underprogram?

Tentamen Nätverksprogrammering Lösningsförslag

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Realtidssystem. - Schemaläggning - EDA698 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 6

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.

Tentamen EDA698 Realtidssystem (Helsingborg)

Realtidssystem. - Schemaläggning - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 6

Java: kort introduktion. Trådar. Något om mutex, Dekkers algoritm och monitorer. Javas ("inbyggda monitor") synchronized.

Synkronisering. Föreläsning 8

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Outline. Datorsystemtekni. Kravspecifikation. Kravspecifikation (forts.)

Classes och Interfaces, Objects och References, Initialization

Trådar i Java. Johan Ånäs. Seminarieuppsats Institutionen för informationsbehandling Åbo Akademi

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Java TRÅDAR OCH GRAFIK. FAdil galjić

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Tentamen EDA698 Realtidssystem (Helsingborg)

Föreläsning 3-4 Innehåll

Synkronisering. Ordning och reda

Att skriva till och läsa från terminalfönstret

Synkronisering - Semaforen. Om att vänta men inte i onödan

Föreläsning 3: Händelsestyrda program och användargränssnitt

Tentamen Nätverksprogrammering Lösningsförslag

Tråd C (ms) T (ms) A 4 16 B 3 10 C 4 25 D 2 12

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Summering av fält 1.1. Synkronisering - Semaforen. Summering av fält 1.3. Summering av fält 1.2. Summering av fält 2.3 (INTE GK)

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Föreläsning 10 OM DELMÅLSKONTROLLEN ; VARIABLERS SYNLIGHET STRING OCH STRINGBUILDER

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Föreläsnings 9 - Exceptions, I/O

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Tentamen Nätverksprogrammering Lösningsförslag

Fö 7 TSEA81. Scheduling

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Trådar. Motivering. Många program måste kunna hålla på med flera saker samtidigt, till exempel. fleranvändarsystem.

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 3: Booleans, if, switch

Deluppgift 17 Processhantering: exec, sleep, exit, plist

"if"-satsen. Inledande programmering med C# (1DV402)

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Mål. Datorteknik. Repetition av avbrott. Innehåll. Mätning och styrning. Datorer för mätning och styrning. timer. Datorsystem A/D. Analog insignal D/A

Hjälpmedel: Inga hjälpmedel förutom penna, suddgummi och glatt humör.

Föreläsning 8: Exempel och problemlösning

Tentamen i Algoritmer & Datastrukturer i Java

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Tentamen. Datorteknik och realtidssystem

Tentamen OOP

OOP Tenta

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 17 UTBLICK: FORTSÄTTNINGSKURSER I DATAVETENSKAP + ANDROID

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Programmering A. Johan Eliasson

Föreläsning 1 & 2 INTRODUKTION

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Tentamen i Programmering

Tentamen i Objektorienterad modellering och design

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Tentamensskrivning Nätverksprogrammering (EDA095) , kl 8-13

Fö 5+6 TSEA81. Reflektion av Lab 2. clock.c (module) Real-time kernel + Real-time OS

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen, EDAA20/EDA501 Programmering

Typkonvertering. Java versus C

Chapter 4: Writing Classes/ Att skriva egna klasser.

Föreläsning 12. Länkade listor

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Transkript:

Realtidssystem - Semaforer, trådsynkronisering - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp Föreläsning 2 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

Förtydligande: Kursens fokus och mål Praktik-Fokus: Trådar i OS-process semaforer monitorer meddelanden i kö (mailbox / event queue) Teori-Fokus: Trådarnas samspel dödläge / svält / livelock exekveringstider prioriteter schemaläggning och schemaläggningsanalys Man ska kunna bygga flertrådiga program som i princip kan uppfylla realtidskrav Man ska kunna läsa kod av flertrådiga program och kunna lösa problem i koden Man ska bygga upp en förståelse för vad som kan hända när flera trådar måste hanteras Man ska bygga upp en uppfattning om vilka verktyg som finns för att utföra en analys av ett tilltänkt system och kunna utföra enklare analyser 2

Innehåll Synkronisering / Ömsesidig uteslutning: Semaforer MutexSem Signalling Counting semaphore 3

Kan man få till ömsesidig uteslutning utan systemanrop? class T extends Thread { public void run() { while( true) { noncriticalsection(); preprotocol(); criticalsection(); postprotocol(); class T2 extends Thread { public void class run() T extends { Thread { while( true) public { void run() { noncriticalsection(); while( true) { preprotocol(); noncriticalsection(); criticalsection(); preprotocol(); postprotocol(); criticalsection(); postprotocol(); Critical Section (CS) Jämför Bankkonto-exemplet Vi kommer titta på konstruktionen av pre-/postprotocol Antagandet: En tråd kommer inte att blockeras inom dess kritiska sekvens (critical section). Krav: Ömsesidig uteslutning, ingen dödläge, inget svält, hög verkningsgrad (efficiency). 4

Ömsesidig uteslutning, tråden class T extends Thread { public void run() { while( true) { noncriticalsection(); preprotocol(); criticalsection(); postprotocol(); 5

Ömsesidig uteslutning, kraven Det här måste uppfyllas: 1. Ömsesidig uteslutning (Mutual exclusion): Exekvering av en kod i en kritisk sekvens får inte flätas ihop med någon annan tråds kodsekvens. 2. Inget dödläge (No deadlock): Om en eller fler tråd(ar) försöker starta exekvering av en kritisk sekvens, måste det finnas någon av dem som faktiskt kan göra det. 3. Ingen svält (No starvation): En tråd måste få möjlighet att någon gång påbörja exekveringen av dess kritiska sekvens. 4. Effektivitet (Efficiency): Liten overhead (förvaltningskostnad) när det finns enbart en tråd, det hela måste fungera bra även om det bara finns en tråd (det får inte finnas en obligatorisk väntemoment på en annan tråd när en sådan inte kan garanteras finnas). Kan de här kraven uppfyllas med vanlig Java-kod? 6

Ömsesidig uteslutning - version 1 - int turn = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( turn!= 1); cs1(); turn = 2; class T2 extends Thread { public void run() { while( true) { noncs2(); while( turn!= 2); cs2(); turn = 1; 7

Ömsesidig uteslutning - version 1 - int turn = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( turn!= 1); cs1(); turn = 2; class T2 extends Thread { public void run() { while( true) { noncs2(); while( turn!= 2); cs2(); turn = 1; Ömsesidig uteslutning: OK 7

Ömsesidig uteslutning - version 1 - int turn = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( turn!= 1); cs1(); turn = 2; class T2 extends Thread { public void run() { while( true) { noncs2(); while( turn!= 2); cs2(); turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK, en av dem kan alltid köra. 7

Ömsesidig uteslutning - version 1 - int turn = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( turn!= 1); cs1(); turn = 2; class T2 extends Thread { public void run() { while( true) { noncs2(); while( turn!= 2); cs2(); turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK, en av dem kan alltid köra. Inget svält: OK, omväxlande protokoll. 7

Ömsesidig uteslutning - version 1 - int turn = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( turn!= 1); cs1(); turn = 2; class T2 extends Thread { public void run() { while( true) { noncs2(); while( turn!= 2); cs2(); turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK, en av dem kan alltid köra. Inget svält: OK, omväxlande protokoll. Effektivitet / en tråd?: NEJ (en tråd kommer hänga sig efter max en omgång), plus vi har en busy-wait (ineffektiv). För många trådar dessutom rörig. 7

Ömsesidig uteslutning - version 1 - int turn = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( turn!= 1); cs1(); turn = 2; class T2 extends Thread { public void run() { while( true) { noncs2(); while( turn!= 2); cs2(); turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK, en av dem kan alltid köra. Inget svält: OK, omväxlande protokoll. Effektivitet / en tråd?: NEJ (en tråd kommer hänga sig efter max en omgång), plus vi har en busy-wait (ineffektiv). För många trådar dessutom rörig. Ej acceptabelt! 7

Ömsesidig uteslutning - version 2 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( c2!= 1); c1 = 0; cs1(); c1 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); while( c1!= 1); c2 = 0; cs1(); c2 = 1; 8

Ömsesidig uteslutning - version 2 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( c2!= 1); c1 = 0; cs1(); c1 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); while( c1!= 1); c2 = 0; cs1(); c2 = 1; Ömsesidig uteslutning: NEJ... (testa sammanflätning) 8

Ömsesidig uteslutning - version 2 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( c2!= 1); c1 = 0; cs1(); c1 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); while( c1!= 1); c2 = 0; cs1(); c2 = 1; Ömsesidig uteslutning: NEJ... (testa sammanflätning) c1 = 1; c2 = 1; while( c2!= 1); while( c1!= 1); c1 = 0; c2 = 0; cs1(); cs2(); 8

Ömsesidig uteslutning - version 2 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); while( c2!= 1); c1 = 0; cs1(); c1 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); while( c1!= 1); c2 = 0; cs1(); c2 = 1; Ömsesidig uteslutning: NEJ... (testa sammanflätning) c1 = 1; c2 = 1; while( c2!= 1); while( c1!= 1); c1 = 0; c2 = 0; cs1(); cs2(); Ingen lösning, även om det kan fungera länge tills det kraschar (genom interrupt i noncs1, eller noncs2!) 8

Ömsesidig uteslutning - version 3 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); c1 = 0; while( c2!= 1); cs1(); c1 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); c2 = 0; while( c1!= 1); cs1(); c2 = 1; 9

Ömsesidig uteslutning - version 3 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); c1 = 0; while( c2!= 1); cs1(); c1 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); c2 = 0; while( c1!= 1); cs1(); c2 = 1; Ömsesidig uteslutning: OK 9

Ömsesidig uteslutning - version 3 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { public void run() { while( true) { noncs1(); c1 = 0; while( c2!= 1); cs1(); c1 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); c2 = 0; while( c1!= 1); cs1(); c2 = 1; Ömsesidig uteslutning: OK Inget dödläge: Nej (alltså ja): 9

Ömsesidig uteslutning - version 3 - class T1 extends Thread { public void run() { while( true) { noncs1(); c1 = 0; while( c2!= 1); cs1(); c1 = 1; int c1, c2; c1 = c2 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); c2 = 0; while( c1!= 1); cs1(); c2 = 1; Ömsesidig uteslutning: OK Inget dödläge: Nej (alltså ja): c1 = 0; c2 = 0; while( c2!= 1); // I all evighet... while( c1!= 1); //... och lite till... 9

Ömsesidig uteslutning - version 3 - class T1 extends Thread { public void run() { while( true) { noncs1(); c1 = 0; while( c2!= 1); cs1(); c1 = 1; int c1, c2; c1 = c2 = 1; class T2 extends Thread { public void run() { while( true) { noncs2(); c2 = 0; while( c1!= 1); cs1(); c2 = 1; Ömsesidig uteslutning: OK Inget dödläge: Nej (alltså ja): c1 = 0; c2 = 0; while( c2!= 1); // I all evighet... while( c1!= 1); //... och lite till... Ingen lösning, även om det kan fungera länge tills det kraschar (genom interrupt i noncs1, eller noncs2)! 9

Ömsesidig uteslutning - version 4 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ c1 = 1; //** c1 = 0; cs1(); c1 = 1; //.. class T2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ c2 = 1; //** c2 = 0; cs2(); c2 = 1; //.. 10

Ömsesidig uteslutning - version 4 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ c1 = 1; //** c1 = 0; cs1(); c1 = 1; //.. class T2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ c2 = 1; //** c2 = 0; cs2(); c2 = 1; //.. Ömsesidig uteslutning: OK 10

Ömsesidig uteslutning - version 4 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ c1 = 1; //** c1 = 0; cs1(); c1 = 1; //.. class T2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ c2 = 1; //** c2 = 0; cs2(); c2 = 1; //.. Ömsesidig uteslutning: OK Inget dödläge: OK (//** är yield) 10

Ömsesidig uteslutning - version 4 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ c1 = 1; //** c1 = 0; cs1(); c1 = 1; //.. class T2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ c2 = 1; //** c2 = 0; cs2(); c2 = 1; //.. Ömsesidig uteslutning: OK Inget dödläge: OK (//** är yield) Inget svält: NEJ, det kan hända att en tråd får köra, men kommer aldrig så långt att den får verkligen utföra CS (kallas livelock om det händer fler trådar så att hela systemet jobbar utan att göra något). 10

Ömsesidig uteslutning - version 4 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ c1 = 1; //** c1 = 0; cs1(); c1 = 1; //.. class T2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ c2 = 1; //** c2 = 0; cs2(); c2 = 1; //.. Ömsesidig uteslutning: OK Inget dödläge: OK (//** är yield) Inget svält: NEJ, det kan hända att en tråd får köra, men kommer aldrig så långt att den får verkligen utföra CS (kallas livelock om det händer fler trådar så att hela systemet jobbar utan att göra något). Ej acceptabelt! 10

Ömsesidig uteslutning - version 4 - int c1, c2; c1 = c2 = 1; class T1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ c1 = 1; //** c1 = 0; cs1(); c1 = 1; //.. Ömsesidig uteslutning: OK Inget dödläge: OK (//** är yield) Inget svält: NEJ, det kan hända att en tråd får köra, men kommer aldrig så långt att den får verkligen utföra CS (kallas livelock om det händer fler trådar så att hela systemet jobbar utan att göra något). Ej acceptabelt! class T2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ c2 = 1; //** c2 = 0; cs2(); c2 = 1; //.. c1 = 0; c2 = 0; while( c1!= 1) { c2 = 1;... while( c2!= 1); cs1(); c1 = 1; noncs1(); c1 = 0;... c2 = 0; while( c1!= 1) { c2 = 1; while( c2!= 1); cs1(); c1 = 1;... 10

Dekkers algoritm int c1, c2, turn; c1 = c2 = turn = 1; class DA1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ if( turn == 2) { c1 = 1; while( turn == 2); c1 = 0; cs1(); c1 = 1; turn = 2; class DA2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ if( turn == 1) { c2 = 1; while( turn == 1); c2 = 0; cs2(); c2 = 1; turn = 1; 11

Dekkers algoritm int c1, c2, turn; c1 = c2 = turn = 1; class DA1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ if( turn == 2) { c1 = 1; while( turn == 2); c1 = 0; cs1(); c1 = 1; turn = 2; class DA2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ if( turn == 1) { c2 = 1; while( turn == 1); c2 = 0; cs2(); c2 = 1; turn = 1; Ömsesidig uteslutning: OK 11

Dekkers algoritm int c1, c2, turn; c1 = c2 = turn = 1; class DA1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ if( turn == 2) { c1 = 1; while( turn == 2); c1 = 0; cs1(); c1 = 1; turn = 2; class DA2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ if( turn == 1) { c2 = 1; while( turn == 1); c2 = 0; cs2(); c2 = 1; turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK 11

Dekkers algoritm int c1, c2, turn; c1 = c2 = turn = 1; class DA1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ if( turn == 2) { c1 = 1; while( turn == 2); c1 = 0; cs1(); c1 = 1; turn = 2; class DA2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ if( turn == 1) { c2 = 1; while( turn == 1); c2 = 0; cs2(); c2 = 1; turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK Inget svält: OK (inte bara yield, men blockerar tills CS har körts en gång minst) 11

Dekkers algoritm int c1, c2, turn; c1 = c2 = turn = 1; class DA1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ if( turn == 2) { c1 = 1; while( turn == 2); c1 = 0; cs1(); c1 = 1; turn = 2; class DA2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ if( turn == 1) { c2 = 1; while( turn == 1); c2 = 0; cs2(); c2 = 1; turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK Inget svält: OK (inte bara yield, men blockerar tills CS har körts en gång minst) Effektivitet / en tråd?: Inte bra. 11

Dekkers algoritm int c1, c2, turn; c1 = c2 = turn = 1; class DA1 extends Thread { //... noncs1(); c1 = 0; while( c2!= 1){ if( turn == 2) { c1 = 1; while( turn == 2); c1 = 0; cs1(); c1 = 1; turn = 2; class DA2 extends Thread { //... noncs2(); c2 = 0; while( c1!= 1){ if( turn == 1) { c2 = 1; while( turn == 1); c2 = 0; cs2(); c2 = 1; turn = 1; Ömsesidig uteslutning: OK Inget dödläge: OK Inget svält: OK (inte bara yield, men blockerar tills CS har körts en gång minst) Effektivitet / en tråd?: Inte bra. Dekkers algoritm fungerar bra för många trådar, men blir då komplex, den löser problemet ömsesidig uteslutning, MEN med busy-wait. Kan vara användbar i vissa system med flera processorer. 11

Ömsesidig uteslutning - Semafor - MutexSem mutex = new MutexSem(); class T1 extends Thread { public void run() { while( true) { noncs1(); mutex.take(); cs1(); mutex.give(); class T2 extends Thread { public void run() { while( true) { noncs2(); mutex.take(); cs2(); mutex.give(); 12

Ömsesidig uteslutning - Semafor - MutexSem mutex = new MutexSem(); class T1 extends Thread { public void run() { while( true) { noncs1(); mutex.take(); cs1(); mutex.give(); class T2 extends Thread { public void run() { while( true) { noncs2(); mutex.take(); cs2(); mutex.give(); Ömsesidig uteslutning: OK 12

Ömsesidig uteslutning - Semafor - MutexSem mutex = new MutexSem(); class T1 extends Thread { public void run() { while( true) { noncs1(); mutex.take(); cs1(); mutex.give(); class T2 extends Thread { public void run() { while( true) { noncs2(); mutex.take(); cs2(); mutex.give(); Ömsesidig uteslutning: OK Inget dödläge: OK 12

Ömsesidig uteslutning - Semafor - MutexSem mutex = new MutexSem(); class T1 extends Thread { public void run() { while( true) { noncs1(); mutex.take(); cs1(); mutex.give(); class T2 extends Thread { public void run() { while( true) { noncs2(); mutex.take(); cs2(); mutex.give(); Ömsesidig uteslutning: OK Inget dödläge: OK Inget svält: OK (give() startar upp den blockerade tråden direkt) 12

Ömsesidig uteslutning - Semafor - MutexSem mutex = new MutexSem(); class T1 extends Thread { public void run() { while( true) { noncs1(); mutex.take(); cs1(); mutex.give(); class T2 extends Thread { public void run() { while( true) { noncs2(); mutex.take(); cs2(); mutex.give(); Ömsesidig uteslutning: OK Inget dödläge: OK Inget svält: OK (give() startar upp den blockerade tråden direkt) Effektivitet / en tråd: OK. Blockerade trådar sövs (sleep), dvs de använder inte CPUn. 12

Ömsesidig uteslutning - Semafor - MutexSem mutex = new MutexSem(); class T1 extends Thread { public void run() { while( true) { noncs1(); mutex.take(); cs1(); mutex.give(); class T2 extends Thread { public void run() { while( true) { noncs2(); mutex.take(); cs2(); mutex.give(); Ömsesidig uteslutning: OK Inget dödläge: OK Inget svält: OK (give() startar upp den blockerade tråden direkt) Effektivitet / en tråd: OK. Blockerade trådar sövs (sleep), dvs de använder inte CPUn. Acceptabelt! 12

Semafor - basfakta 13

Semafor - basfakta Semaforer utgör en minimal mekanism för ömsesidig uteslutning 13

Semafor - basfakta Semaforer utgör en minimal mekanism för ömsesidig uteslutning En semafor är egentligen bara en integer-variabel med två metoder, take() och give(): 13

Semafor - basfakta Semaforer utgör en minimal mekanism för ömsesidig uteslutning En semafor är egentligen bara en integer-variabel med två metoder, take() och give(): class SemaphorePrinciple { int count; public void take() { while( count < 1) suspend executing thread // here, currentthread() is used! --count; public void give() { if( any thread suspended ) resume the first one in queue ; count++; 13

Semafor - basfakta Semaforer utgör en minimal mekanism för ömsesidig uteslutning En semafor är egentligen bara en integer-variabel med två metoder, take() och give(): class SemaphorePrinciple { int count; public void take() { while( count < 1) suspend executing thread // here, currentthread() is used! --count; public void give() { if( any thread suspended ) resume the first one in queue ; count++; 13

Semafor - basfakta Semaforer utgör en minimal mekanism för ömsesidig uteslutning En semafor är egentligen bara en integer-variabel med två metoder, take() och give(): class SemaphorePrinciple { int count; public void take() { while( count < 1) suspend executing thread // here, currentthread() is used! --count; public void give() { if( any thread suspended ) resume the first one in queue ; count++; OBS 1: take och give är odelbara (atomic) operationer, som kräver systemsupport när de ska implementeras (t ex deaktivera hårdvaruinterrupts). 13

Semafor - basfakta Semaforer utgör en minimal mekanism för ömsesidig uteslutning En semafor är egentligen bara en integer-variabel med två metoder, take() och give(): class SemaphorePrinciple { int count; public void take() { while( count < 1) suspend executing thread // here, currentthread() is used! --count; public void give() { if( any thread suspended ) resume the first one in queue ; count++; OBS 1: take och give är odelbara (atomic) operationer, som kräver systemsupport när de ska implementeras (t ex deaktivera hårdvaruinterrupts). OBS 2: take blockerar den anropande tråden sålänge count == 0. Detta kan inte implementeras i vanlig Java-kod. 13

Typer av semaforer 14

Typer av semaforer MutexSem - MutualExclusion semaphore: Den som tar flaggan får jobba med gemensamma resurser, den som vill ha den samtidigt, får vänta (blockeras). 14

Typer av semaforer MutexSem - MutualExclusion semaphore: Den som tar flaggan får jobba med gemensamma resurser, den som vill ha den samtidigt, får vänta (blockeras). CountingSem - Counting semaphore, signalling: Den som gör plats / en resurs tillgänglig, signalerar genom att lägga en flagga på högen, den som vill utnyttja en resursplats tar en flagga från högen. Finns inga fria flaggor, måste den som vill ha en vänta. 14

Typer av semaforer MutexSem - MutualExclusion semaphore: Den som tar flaggan får jobba med gemensamma resurser, den som vill ha den samtidigt, får vänta (blockeras). CountingSem - Counting semaphore, signalling: Den som gör plats / en resurs tillgänglig, signalerar genom att lägga en flagga på högen, den som vill utnyttja en resursplats tar en flagga från högen. Finns inga fria flaggor, måste den som vill ha en vänta. 14

Semaforer vs omvärlden 15

Semaforer vs omvärlden Mutual exclusion (MutexSem): Tåg ska köra mellan Malmö och Lund när det för tillfället råder enkelspårsdrift. 15

Semaforer vs omvärlden Mutual exclusion (MutexSem): Tåg ska köra mellan Malmö och Lund när det för tillfället råder enkelspårsdrift. Signaling (CountingSem): Check-In på Kastrup: Man väntar i en lång rad och blir tilldelad en fri disk så fort det finns en sådan. 15

Semaforer vs omvärlden Mutual exclusion (MutexSem): Tåg ska köra mellan Malmö och Lund när det för tillfället råder enkelspårsdrift. Signaling (CountingSem): Check-In på Kastrup: Man väntar i en lång rad och blir tilldelad en fri disk så fort det finns en sådan. Rendezvous: Last från ett godståg ska lastas om / kopplas om på ett annat tåg utan att något ska lagras. Båda tågen måste alltså stå i omlastningsområdet samtidigt. 15

Semaforer vs omvärlden Mutual exclusion (MutexSem): Tåg ska köra mellan Malmö och Lund när det för tillfället råder enkelspårsdrift. Signaling (CountingSem): Check-In på Kastrup: Man väntar i en lång rad och blir tilldelad en fri disk så fort det finns en sådan. Rendezvous: Last från ett godståg ska lastas om / kopplas om på ett annat tåg utan att något ska lagras. Båda tågen måste alltså stå i omlastningsområdet samtidigt. 15

Semaforer - användning i kod Tråd A: Tråd B: Mutual exclusion (ömsesidig uteslutning)... mutex.take(); *** mutex.give();...... mutex.take(); *** mutex.give();... Signaling (signalering)... buffer.give();...... buffer.take();... Rendezvous *** entry.give(); exit.take(); ***... entry.take(); *** exit.give();... 16

Mutex - bara en kan hantera den 17

Mutex - bara en kan hantera den Det finns enbart en nyckel till toaletten på ett visst fik. 17

Mutex - bara en kan hantera den Det finns enbart en nyckel till toaletten på ett visst fik. Vill man ha nyckeln, måste man fråga efter den vid disken. 17

Mutex - bara en kan hantera den Det finns enbart en nyckel till toaletten på ett visst fik. Vill man ha nyckeln, måste man fråga efter den vid disken. Finns inte nyckeln där (toaletten är upptagen), måste man ställa sig i kön. 17

Mutex - bara en kan hantera den Det finns enbart en nyckel till toaletten på ett visst fik. Vill man ha nyckeln, måste man fråga efter den vid disken. Finns inte nyckeln där (toaletten är upptagen), måste man ställa sig i kön. När toaletten blir ledig, lämnas nyckeln tillbaka och ges vidare till första personen i kön. 17

Mutex - bara en kan hantera den Det finns enbart en nyckel till toaletten på ett visst fik. Vill man ha nyckeln, måste man fråga efter den vid disken. Finns inte nyckeln där (toaletten är upptagen), måste man ställa sig i kön. När toaletten blir ledig, lämnas nyckeln tillbaka och ges vidare till första personen i kön. Står ingen i kön, lämnas nyckeln tillbaka vid disken. 17

Mutex - bara en kan hantera den Det finns enbart en nyckel till toaletten på ett visst fik. Vill man ha nyckeln, måste man fråga efter den vid disken. Finns inte nyckeln där (toaletten är upptagen), måste man ställa sig i kön. När toaletten blir ledig, lämnas nyckeln tillbaka och ges vidare till första personen i kön. Står ingen i kön, lämnas nyckeln tillbaka vid disken. Nyckeln måste alltid lämnas (vidare) av den som hämtade den sist. 17

Signalera med en sorts signal 18

Signalera med en sorts signal Patienten på rummet behöver hjälp och trycker på signalknappen - lampan utanför rummet tänds och larmet i expeditionen går. (signal.give()) 18

Signalera med en sorts signal Patienten på rummet behöver hjälp och trycker på signalknappen - lampan utanför rummet tänds och larmet i expeditionen går. (signal.give()) Sjuksköterskan kommer in i rummet och slår av signalen - lampan och larmet släcks och alla utanför vet att problemet åtgärdas - ingen annan behöver eller ska komma och hjälpa. (signal.take()) 18

Signalera med en sorts signal Patienten på rummet behöver hjälp och trycker på signalknappen - lampan utanför rummet tänds och larmet i expeditionen går. (signal.give()) Sjuksköterskan kommer in i rummet och slår av signalen - lampan och larmet släcks och alla utanför vet att problemet åtgärdas - ingen annan behöver eller ska komma och hjälpa. (signal.take()) Detta kan hända på flera rum samtidigt, eller med korta mellanrum. Sålänge det finns sjuksköterskor kan de ta över rum efter rum, sen måste kanske en patient vänta lite längre. Om ingen larmar, måste sjuksköterskorna vänta på nästa problem att lösa. (signal.give() + signal.give() + signal.take() + signal.give() + signal.take() + signal.take()) 18

Signalera med en sorts signal Patienten på rummet behöver hjälp och trycker på signalknappen - lampan utanför rummet tänds och larmet i expeditionen går. (signal.give()) Sjuksköterskan kommer in i rummet och slår av signalen - lampan och larmet släcks och alla utanför vet att problemet åtgärdas - ingen annan behöver eller ska komma och hjälpa. (signal.take()) Detta kan hända på flera rum samtidigt, eller med korta mellanrum. Sålänge det finns sjuksköterskor kan de ta över rum efter rum, sen måste kanske en patient vänta lite längre. Om ingen larmar, måste sjuksköterskorna vänta på nästa problem att lösa. (signal.give() + signal.give() + signal.take() + signal.give() + signal.take() + signal.take()) 18

Signalera med två olika signaler 19

Signalera med två olika signaler Chefen och Sekreteraren har ett postfack för att överlämna dokument till varandra, egentligen är det dock bara Sekreteraren som lägger dit dokument, och chefen som hämtar ut dem därifrån. I facket får det enbart ligga ett dokument åt gången. 19

Signalera med två olika signaler Chefen och Sekreteraren har ett postfack för att överlämna dokument till varandra, egentligen är det dock bara Sekreteraren som lägger dit dokument, och chefen som hämtar ut dem därifrån. I facket får det enbart ligga ett dokument åt gången. Sekreteraren ser att facket är tomt genom att en tom -lampa lyser på hans kontor. Han går till facket, lägger dit ett dokument som chefen måste signera, och trycker på en knapp som släcker tom -lampan och sedan slår på en det finns ett dokument -lampa på chefens kontor. (free.take() + avail.give()) 19

Signalera med två olika signaler Chefen och Sekreteraren har ett postfack för att överlämna dokument till varandra, egentligen är det dock bara Sekreteraren som lägger dit dokument, och chefen som hämtar ut dem därifrån. I facket får det enbart ligga ett dokument åt gången. Sekreteraren ser att facket är tomt genom att en tom -lampa lyser på hans kontor. Han går till facket, lägger dit ett dokument som chefen måste signera, och trycker på en knapp som släcker tom -lampan och sedan slår på en det finns ett dokument -lampa på chefens kontor. (free.take() + avail.give()) Chefen ser lampan, kommer till facket, tar dokumentet, släcker det finns ett dokument - lampan och slår på tom -lampan hos sekreteraren. (avail.take() + free.give()) 19

Signalera med två olika signaler Chefen och Sekreteraren har ett postfack för att överlämna dokument till varandra, egentligen är det dock bara Sekreteraren som lägger dit dokument, och chefen som hämtar ut dem därifrån. I facket får det enbart ligga ett dokument åt gången. Sekreteraren ser att facket är tomt genom att en tom -lampa lyser på hans kontor. Han går till facket, lägger dit ett dokument som chefen måste signera, och trycker på en knapp som släcker tom -lampan och sedan slår på en det finns ett dokument -lampa på chefens kontor. (free.take() + avail.give()) Chefen ser lampan, kommer till facket, tar dokumentet, släcker det finns ett dokument - lampan och slår på tom -lampan hos sekreteraren. (avail.take() + free.give()) 19

Semaforer i Java (Mutex) Deklarera: import se.lth.cs.realtime.semaphore.*; Semaphore mutex1; // inte tydligt om man vill ha en mutex MutexSem mutex2; // bättre. Skapa / initialisera: /*inte så bra:*/ mutex1 = new CountingSem(); mutex1 = new CountingSem(1); /*bättre:*/ mutex2 = new MutexSem(); // tilldelar värdet 0 till count // tilldelar värdet 1 till count // tilldelar 1 (eller true) till intern status Tillämpning: mutex2.take(); amount += change; mutex2.give(); Förutom att det är tydligare, får man bättre felidentifiering och bättre timing om man skapar ömsesidig uteslutning med en MutexSem istf en CountingSem 20

Mutex i trådar import se.lth.cs.realtime.semaphore.*; class ThreadTest { public static void main(string[] args) { class RogersThread extends Thread { String thename; Semaphore thesem; Thread t1,t2; Semaphore s; s = new MutexSem(); t1 = new RogersThread("Thread one",s); t2 = new RogersThread("Thread two",s); t1.start(); t2.start(); public RogersThread( String n, Semaphore s){ thename = n; thesem = s; public void run() { thesem.take(); for(int t=1;t<=100;t++) { System.out.println(theName + ":" + t); sleep(1); thesem.give(); 21

Signal i trådar import se.lth.cs.realtime.semaphore.*; class ThreadTest { public static void main(string[] args) { class RogersThread extends Thread { String thename; CountingSem mysem, hissem; Thread t1,t2; CountingSem s1, s2; s1 = new CountingSem(1); s2 = new CountingSem(0); t1 = new RogersThread("One",s1, s2); t1.start(); t2 = new RogersThread("Two",s2, s1); t2.start(); public RogersThread( String n, CountingSem s1, CountingSem s2){ thename = n; mysem = s1; hissem = s2; public void run() { for(int t=1;t<=100;t++) { mysem.take(); System.out.println(theName + ":" + t); hissem.give(); sleep(1); 22

Objekt och blockering 23

Objekt och blockering Trådobjekt (som alltså kan referera till en exekverande tråd) kallas för aktiva objekt. 23

Objekt och blockering Trådobjekt (som alltså kan referera till en exekverande tråd) kallas för aktiva objekt. Andra objekt (beskriven genom vanliga Java-klasser), som blir kallade eller drivna genom aktiva objekt (trådar) kallas för passiva objekt. T ex en semafor ;-) 23

Objekt och blockering Trådobjekt (som alltså kan referera till en exekverande tråd) kallas för aktiva objekt. Andra objekt (beskriven genom vanliga Java-klasser), som blir kallade eller drivna genom aktiva objekt (trådar) kallas för passiva objekt. T ex en semafor ;-) Semaforer erbjuder blockerande operationer; hur blir de representerade? 23

Objekt och blockering Trådobjekt (som alltså kan referera till en exekverande tråd) kallas för aktiva objekt. Andra objekt (beskriven genom vanliga Java-klasser), som blir kallade eller drivna genom aktiva objekt (trådar) kallas för passiva objekt. T ex en semafor ;-) Semaforer erbjuder blockerande operationer; hur blir de representerade? : Exekverande (executing) : Blockerad (blocked) Tråd (aktivt objekt) Semafor (passivt objekt) : möjligen blockerande (potential blocking) 23

Sekvens med mutex / blockerade trådar T1 mutex T2 take take give give Anrop till take - give i följd måste komma från samma tråd. Stöds av MutexSem klassen. 24

Signalering T1 give give give signal take take take take T2 En tråd kallar take, en annan give. Stöds av CountingSem klassen. 25

Rendezvous T1 give entry exit take T2 sync take give sync Säker dataöverföring / manipulation med T1 från T2 under sync-tiden. T1 har exklusiv tillgång till datan genom att hålla i semaforen förutom mellan sitt give och T2s give 26

Exekveringstillstånd Due to scheduler / kernel / OS Running Priority, time-sharing Ready Due to application By this : wait, synchronized call Blocked By other: notify, synchronized return Schemaläggningstillstånd (scheduling state) Running Ready Blocked Kontext PC (Program Counter), SP (stack pointer) Data (beroende på tillämpning) Registerinnehåll 27

Övning 1 + Övning 2 28

Övning 1 + Övning 2 ÖVNINGAR ÄR INGA FÖRELÄSNINGAR - Kom förberedd! 28

Övning 1 + Övning 2 ÖVNINGAR ÄR INGA FÖRELÄSNINGAR - Kom förberedd! Övning 1 i häftet handlar om semaforer och deras tillämpning - frågor till dem besvaras 28

Övning 1 + Övning 2 ÖVNINGAR ÄR INGA FÖRELÄSNINGAR - Kom förberedd! Övning 1 i häftet handlar om semaforer och deras tillämpning - frågor till dem besvaras Vid övningstillfället tittar vi på någon tenta-uppgift kring semaforer 28

Övning 1 + Övning 2 ÖVNINGAR ÄR INGA FÖRELÄSNINGAR - Kom förberedd! Övning 1 i häftet handlar om semaforer och deras tillämpning - frågor till dem besvaras Vid övningstillfället tittar vi på någon tenta-uppgift kring semaforer Laboration 1 introduceras lite mera 28

Övning 1 + Övning 2 ÖVNINGAR ÄR INGA FÖRELÄSNINGAR - Kom förberedd! Övning 1 i häftet handlar om semaforer och deras tillämpning - frågor till dem besvaras Vid övningstillfället tittar vi på någon tenta-uppgift kring semaforer Laboration 1 introduceras lite mera 28

Övning 1 + Övning 2 ÖVNINGAR ÄR INGA FÖRELÄSNINGAR - Kom förberedd! Övning 1 i häftet handlar om semaforer och deras tillämpning - frågor till dem besvaras Vid övningstillfället tittar vi på någon tenta-uppgift kring semaforer Laboration 1 introduceras lite mera Övning 2 är till förberedelse för Laboration 1 (väckarklocka) 28

Övning 1 + Övning 2 ÖVNINGAR ÄR INGA FÖRELÄSNINGAR - Kom förberedd! Övning 1 i häftet handlar om semaforer och deras tillämpning - frågor till dem besvaras Vid övningstillfället tittar vi på någon tenta-uppgift kring semaforer Laboration 1 introduceras lite mera Övning 2 är till förberedelse för Laboration 1 (väckarklocka) Tillfället ska utnyttjas till att färdigställa ett design-förslag till laborationen, som ska granskas både i kamrat-granskning och av läraren 28

Sammanfattning Trådar, kapplöpningsproblem, hantering av gemensamma resurser Semaforer Typer av semaforer Användning av semaforer Man ska kunna lösa uppgifterna till övning 1 och påbörja arbetet med övning 2 / lab1 Lästips: e-bok: delar av Kap 5 (s 103-129) kompendium: Kap 2-1 (Threads) samt 2-2 (Semaphores) 29