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

Relevanta dokument
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)

Synkronisering. Ordning och reda

Summering av fält. Synkronisering. Summering av fält. Bounded Buffer. Bounded Buffer (get) Bounded Buffer (put)

Tentamen i TDIU16 Process- och operativsystemprogrammering

Mekanismer. (implementation)

Att använda pekare i. C-kod

Deluppgift 10 Starta den första processen (3.5h förarbete, 30min kodning)

Övning från förra gången: readword

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Deluppgift 17 Processhantering: exec, sleep, exit, plist

#include <stdio.h> #include <string.h>

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

Fö 2 TSEA81 Datorteknik och realtidssystem

(Lösningsförslag finns sist i denna fil.)

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

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

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

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Tentamen Nätverksprogrammering Lösningsförslag

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmering B med Visual C

Tentamen. Datorteknik och realtidssystem

Tentamen TEN1 HI

Loopar och datatyper. Föreläsning 3

const och pekare Output: char *unsafe(char *s) { // Returnerar pekare till det andra tecknet i s printf("%s \n", s);

Tentamen *:58/ID100V Programmering i C Exempel 3

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

TDIU01 - Programmering i C++, grundkurs

Tentamen TEN1 HI

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

Uppgift 1 (grundläggande konstruktioner)

TDIU01 - Programmering i C++, grundkurs

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Skizz till en enkel databas

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

Datorteknik 2 (AVR 2)

Föreläsning 6: Introduktion av listor

Tentamen Datastrukturer (DAT036)

Tentamen i Algoritmer & Datastrukturer i Java

Hur kan man designa req_lock_acquire och req_lock_release för ett sådant lås?

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Introduktion till MATLAB, med utgångspunkt från Ada

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Abstrakta datastrukturer

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

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

Tentamen EDAF30 Programmering i C++

Tentamen. Datorteknik och realtidssystem

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

TDIU01 - Programmering i C++, grundkurs

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

HI1024 Programmering, grundkurs TEN

HI1024 Programmering, grundkurs TEN

Föreläsning 4: Poster

Fö 4 TSEA81. Monitors and Message passing

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

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Programmeringsteknik med C och Matlab

Arrayer. results

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Klassdeklaration. Metoddeklaration. Parameteröverföring

Tentamen Grundläggande programmering

Lösningsförslag till exempeltenta 1

Tentamen EDAF30 Programmering i C++

Tommy Färnqvist, IDA, Linköpings universitet

C++ Objektorientering - Klasser. Eric Elfving

Tentamen i Realtidsprogrammering

Funktionens deklaration

Tentamen. Datorteknik och realtidssystem

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Loopar och datatyper. Föreläsning 3

Föreläsning 7: Filer

OOP Objekt-orienterad programmering

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Filer och structer Del 2

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Gissa det hemliga talet

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Planering Programmering grundkurs HI1024 HT TIDAA

Övning 4. Arv och andra relationer

Symboliska konstanter const

Arrays (indicerade variabler) Föreläsning 4

Kapitel 6 - Undantag

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Typkonvertering. Java versus C

Generiska konstruktioner. Kursbokens kapitel 13

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Föreläsning 2, vecka 8: Repetition

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Föreläsning 6: Metoder och fält (arrays)

Transkript:

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

Dörrvakten Har order uppifrån pga brandregler: Släpp in max 40 personer Garanterar att det aldrig är fler insläppta än order angivit Kommer fler måste de vänta tills det finns plats (någon går eller order ändras) Måste hålla koll på både hur många som kommer och hur många som går 1

Semaforen Har order från programmeraren pga resursbegränsning eller krävd händelseordning: Släpp in max N trådar Garanterar att fler aldrig släpps förbi Ankommer fler trådar måste de vänta tills fler får släppas in (någon går eller order ändras) Anropas både vid insläpp (down) och utsläpp (up) 2

Ett posthämtningsbryderi Bonden Lena Bertilsson hämtar posten Posten har dragit ned på servicen till gården, så det är 3 kilometer till brevlådan Posten brukar komma runt kl 13 Lena kommer till lådan kl 13:25 Lådan visar sig vara tom. Har brevbäraren passerat? Hur skall Lena göra för att slippa gå i onödan? 3

Summering av fält 1.1 Vi har en stor array fylld med ettor: int array[2_000_000_000]={1,1,...} Vi har variabler för att lagra summor och delsummor av arrayen. Dessa initieras med noll: int sum, suml, sumh = 0 Vi har två funktioner som summerar var sin del av arrayen. 5

Summering av fält 1.2 function sum_low is begin for i in 0..999_999_999 suml += array[i] end sum_low function sum_high is begin for i in 1_000_000_000..1_999_999_999 sumh += array[i] end sum_high 6

Summering av fält 1.3 Vi har ett huvudprogram som startar två trådar för att sköta summeringen (varför inte bara göra en loop?) run_in_thread(sum_low) run_in_thread(sum_high) sum = suml + sumh Vad blir resultatet i sum? 7

Summering av fält 2.1-2.2 bool low_not_done, high_not_done = true function sum_low is begin for i in 0..999_999_999 suml += array[i] low_not_done = false end sum_low function sum_high is begin for i in 1_000_000_000..1_999_999_999 sumh += array[i] high_not_done = false end sum_high 8

Summering av fält 2.3 (INTE GK) run_in_thread(sum_low) run_in_thread(sum_high) while (low_not_done) noop while (high_not_done) noop sum = suml + sumh Hur mycket CPU-tid behövs? Busy wait! EJ godkänd lösning! 9

Bounded Buffer Vi har t.ex. en applikation som skall skyffla datapaket mellan två (eller fler) nätverkskort. En tråd tar emot data och lägger till i en kö. En tråd läser data från kön och skickar vidare. Kön (buffer) har begränsad (bounded) storlek. Vad gör vi om kön är full när vi skall lägga till? Vad gör vi om kön är tom när vi skall läsa? 10

Bounded Buffer 1.1 typedef unsigned char byte; const int SIZE = 256; struct BB { int buffer[size]; byte rpos, wpos = 0; int free = SIZE; }; int get(struct BB* b); void put(struct BB* b, int data); 11

Bounded Buffer 1.2 (get) int get(struct BB* b) { while (b->free == SIZE) ;/* busy wait INTE OK */ ++b->free; // signal return b->buffer[b->rpos++]; } OBS! Ordningen på två sista raderna, finns någon ordning som alltid fungerar? 12

Bounded Buffer 1.3 (put) void put(struct BB* b, int data) { while (b->free == 0) ;/* busy wait INTE OK */ --b->free; // signal b->buffer[b->wpos++] = data; } OBS! Ordningen på två sista raderna, finns någon ordning som alltid fungerar? 13

Ett järnvägsproblem SJ X2000 möter Green Cargo En järnvägsknut med två spår österut, ett västerut X2000 kommer västerifrån och fortsätter mot sydost. Tidtabellen anger att passagen sker 16:10. Green Cargos godståg kommer från nordost och fortsätter västerut. Klockan är 16:15 när det når järnvägsknuten. Du är lokförare på godståget. Vad gör du när du kommer till järnvägsknuten? Kör? Väntar? Hur länge? 14

Binär semafor Har två lägen (d.v.s. den är binär) Talar om ifall en händelse inträffat eller inte X2000 har passerat Brevbäraren har passerat Talar om ifall en resurs är tillgänglig eller inte Spåret västerut är fritt Posten finns i lådan Kan starta på vilket som av de båda lägena 15

Binär semafor Avgör om man skall vänta... Resursen inte tillgänglig ännu Händelsen inte inträffat ännu eller fortsätta direkt Händelsen har inträffat redan Resursen finns tillgänglig Avgör när man kan sluta vänta Semaforen ändrar läge då det vi väntar på inträffar 16

Bron mellan bergen Mellan två bergstoppar går en gångbro Bron är byggd av spända rep och brädor. Bron är inte särskilt stadig och mycket lång. Bron är utsatt för väder och vind. Bron är på en sådan höjd att den ofta helt eller delvis är inbäddad i moln (dimma). I detta exempel är sikten lika med noll. Bron kan bära max 5 personer åt gången. Går du ut på bron? Väntar du? Hur länge? 17

Räknande semafor Räknar antalet TILLGÄNGLIGA resurser Avgör när en brukare av resursen måste vänta När antalet är NOLL Avgör när brukaren kan sluta vänta När antalet blir ett eller mer Kan användas som binär semafor Låt räknaren vara endast 1 eller 0 (två lägen) 18

Räknande semafor Vi väntar bara då vi försöker räkna ned en semafor som redan är 0, d.v.s. använda en resurs som inte är tillgänglig En räknande semafor kan alltså INTE användas för att räkna upptagna resurser: Skulle räkna upp när en resurs förbrukas D.v.s. sluta vänta när en resurs förbrukas???? Skulle räkna ned när en resurs blir ledig D.v.s. eventuellt (om räknaren 0) vänta på något som precis blev ledigt???? 19

Semaforer i Pintos #include threads/synch.h struct semaphore sema; // initiera räknaren till N sema_init(&sema, N); // räkna ned eller vänta sema_down(&sema); // räkna upp och väck upp sema_up(&sema); 20

Semaforer andra funktionsnamn För att räkna ned eller vänta P() // Proberen, ursprungligt Wait() // Mer beskrivande... Down() // Pintos, ännu bättre (?) För att räkna upp och signalera V() // Verhogen, ursprungligt Signal()// Mer beskrivande Up() // Pintos, ännu bättre (?) 21

Semaforen väntar själv Semaforen väntar automatiskt på effektivaste sätt när det behövs: // vet ej om resursen är tillgänglig // eller händelsen inträffat sema_down(...) // väntar om det behövs // har väntat klart och vet säkert att // resursen finns tillgänglig eller att // händelsen inträffat (sema_up måste ge // en signal för varje sema_down) 22

Summering av fält 3.2 extern struct semaphore low, high function sum_low is begin for i in 0..999_999_999 suml += array[i] sema_up(&low) // signal done end sum_low function sum_high is begin for i in 1_000_000_000..1_999_999_999 sumh += array[i] sema_up(&high) // signal done end sum_high 23

Summering av fält 3.1, 3.3 (OK) struct semaphore low, high sema_init(&low, 0) // ingen summa finns från start... sema_init(&high, 0) //...så initiera med 0 resurser run_in_thread(sum_low) run_in_thread(sum_high) sema_down(&low) // räkna ned eller vänta sema_down(&high) // räkna ned eller vänta sum = suml + sumh Hur mycket CPU-tid behövs nu? Hur är semaforen implementerad? Senare Fö! Vi antar en effektiv implementation där väntande tråd läggs på väntekö! 24

Summering av fält 4.x (OK) struct semaphore wait_for_two // ingen summa finns från start... sema_init(&wait_for_two, 0) run_in_thread(sum_low) run_in_thread(sum_high) for i in 1..2 sema_down(&wait_for_two) // räkna ned eller vänta sum = suml + sumh // För att fungera med ovan kod ändras sema_up i // vardera tråd till följande anrop: sema_up(&wait_for_two) 25

Summering av fält 5.x (FEL) struct semaphore wait_for_two // FEL: Semaforer ska initieras med antalet // FEL: just nu tillgängliga resurser (0). sema_init(&wait_for_two, 2) run_in_thread(sum_low) run_in_thread(sum_high) // FEL: Semaforen väntar endast när den inte har någon // FEL: resurs att förbruka. Felet här är alltså att // FEL: den aldrig kommer vänta eftersom 2 resurser // FEL: finns från start och endast en förbrukas här. sema_down(&wait_for_two) sum = suml + sumh // summeringstrådarna är ej färdiga?! 26

Bounded Buffer 2.1 typedef unsigned char byte; const byte SIZE = 256; struct BB { int buffer[size]; byte rpos, wpos = 0; struct semaphore free = SIZE; struct semaphore filled = 0; }; int get(struct BB* b); void put(struct BB* b, int data); 27

Bounded Buffer 2.2 (get) int get(struct BB* b) { sema_down(&b->filled); int r = b->buffer[b->rpos++]; sema_up(&b->free); return r; } 28

Bounded Buffer 2.3 (put) void put(struct BB* b, int data) { sema_down(&b->free); b->buffer[b->wpos++] = data; sema_up(&b->filled); } 29

Bounded Buffer med fler trådar Fortfarande inte OK om mer än en tråd läser eller mer än en tråd skriver. Varför? Flera olika trådar som kör samtidigt Gemensam data som används samtidigt Nästa föreläsning Vad händer när olika trådar samtidigt modifierar gemensam data i en sekvens om flera maskininstruktioner? Fundera på i++ Fundera igen på ordningen av två sista raderna i Bounded Buffer 1.x (put/get) Nästa föreläsning 30

Summering av fält igen (nästa Fö) function sum_low is begin for i in 0..999_999 sum += array[i] end sum_low function sum_high is begin for i in 1_000_000..1_999_999 sum += array[i] end sum_high 31