Synkronisering Föreläsning 8
Synkronisering Så stort, intrikat och viktigt att det finns hela kurser om det i parallellprogrammering. Vi fuskar lite med några av de viktigaste bitarna!
Synkronisering Vad händer då flera processer vill ha samma resurser? Vilka programmeringsmodeller finns för hantering av synkronisering? Hur gör man i distribuerade system? Synkroniseringsproblematik Synkronisering i distribuerade system Kap: 2.3-2.4, 6.1-6.9 OS Föreläsning 8, Synkronisering 4
Synkroniseringsproblem Vad vi borde kunna från fö 6 Deadlock (baklås) Livelock Svältning
Vad vi borde kunna från föreläsning 6! Race-condition: Två processer tävlar om samma resurs Utfallet beror på i vilken ordning processerna accessar resursen Ex: två processer läser, uppdaterar och skriver samma variabel I = X J = X I = X J = X I = I+1 X=4 X=6 5 J = J+1 I = I+1 X=4 X=5 J = J+1 X = I X = J X = I X = J OS Föreläsning 8, Synkronisering 6
Vad vi borde kunna forts. Kritisk sektion Kod där flera processer accessar samma resurs Att undvika race-conditions Ömsesidig uteslutning mutal exclusion Primitiver för att åstadkomma ömsesidig uteslutning Lås Semaforer Synkronisering När processer kommunicerar med varandra för att bestämma i vilken ordning man får göra saker OS Föreläsning 8, Synkronisering 7
Kan ömsesidig uteslutning och synkronisering leda till problem? Deadlock baklås kan uppstå vid: Resurskonflikter En process har reserverat skrivaren och vill ha bandstationen En annan process har reserverat bandstationen och vill ha skrivaren Synkronisering: Två artiga herrar vid en dörr; bägge säger Efter er min herre! OS Föreläsning 8, Synkronisering 8
Deadlock, formell definition En mängd processer P sådan att varje p P väntar (är Blocked) på någon händelse som endast kan orsakas av att någon p P kör. Orsaker till väntan kan till exempel vara I/O-enheter: p vill ha skrivaren som p reserverat ömsesidig uteslutning: p vill öppna en fil som p låst andra resurser: p vill starta en process men processtabellen är full kommunikation: p väntar på att p skall skicka ett meddelande OS Föreläsning 8, Synkronisering 9
Synkroniseringsrelaterade deadlock Process A... recieve(b,&msg1) send(b,msg2)... Process B... recieve(a,&msg1) send(a,msg2)... Bägge processerna väntar på ett meddelande från den andra Kan åtgärdas om de kan göra send() först OS Föreläsning 8, Synkronisering 10
Villkor för deadlock - Coffmans villkor Ömsesidig uteslutning Endast en process åt gången kan använda en resurs Behåll och vänta En process kan behålla (reserverade) resurser medan den väntar på att få andra Ingen pre-emption (konfiskering ) Resurser kan inte tas ifrån en process Cirkulär väntan Det måste finnas en cykel av processer där varje process väntar på att få en resurs av nästa OS Föreläsning 8, Synkronisering 11
Vad är en resurs i det här sammanhanget? En resurs är allt man kan vänta på att få tillgång till. Ex: Minne Diskenhet Lås, semafor Meddelande OS Föreläsning 8, Synkronisering 12
Visualisering av resursrelaterat baklås Process A Resurs X Y Indikerar att B väntar på att få X B Indikerar att Y ägs av B OS Föreläsning 8, Synkronisering 13
Deadlock och schemaläggning Process A Begär X Begär Y Släpp X Släpp Y Process B Begär Y Begär X Släpp Y Släpp X Schemaläggning 12 A begär X A får X B begär Y B A får begär Y Y B A begär får Y X A släpper begär Y X Baklås! A släpper Y B får Y B begär X B får X B släpper Y B släpper X Inget baklås! X A B Y OS Föreläsning 8, Synkronisering 14
Hantering av deadlockproblemet Gör ingenting (strutsalgoritmen): Unix m fl Varför: Det är dyrt och krångligt att undvika/upptäcka deadlock Detektering och återhämtning: VMS systemet håller reda på resursallokering och letar cykler Undvikande genom försiktighet kräver begränsningar för användarprocesser Förhindrande genom elimination av nödvändigt villkor kan inte alltid genomföras fullt ut, men kan användas för att eliminera vissa källor till deadlock OS Föreläsning 8, Synkronisering 15
Att upptäcka deadlock Ganska enkelt om det bara finns en enhet av varje resurs Systemet håller för varje process reda på vilka resurser den har och vilka den väntar på Se det som ett grafproblem: Om det finns cykler så föreligger baklås; bra algoritmer för att hitta cykler är kända (linjär tid) OS Föreläsning 8, Synkronisering 16
Att upptäcka baklås Mer komplicerat om det finns flera av varje resurs (till exempel minne) en process som väntar på att få en resurs väntar på att någon av de processer som har resursen skall släppa den cirkulär väntan kan komma att brytas av att processer som är klara med användningen av en resurs/alla resurser släpper sina resurser En lösning är att konstruera Bankiralgoritm tabeller (mer om det senare) OS Föreläsning 8, Synkronisering 17
Baklås med flera resurser av samma typ 2 A 1 C 2 X 1 Y 0 5 B 1 OS Föreläsning 8, Synkronisering 18
Att reda upp ett baklås som inträffat Återhämtning (recovery)
Återhämtning - via pre-emption Inför pre-emption (konfiskation): Ta ifrån en process en resurs Fysiskt minne: page-out Processorn: Om man har pre-emptiv schemaläggning Bryter mot villkoret att resurser inte kan pre-emptas OS Föreläsning 8, Synkronisering 20
Återhämtning - via roll-back Roll-back (tillbakarullning): Gå tillbaka till tidigare punkt i exekveringen och välj en annan schemaläggning Processer måste spara sitt tillstånd då och då Sidoeffekter som t.ex. I/O är problematiska att rulla tillbaka Jfr: Ordbehandlare med undo-möjlighet OS Föreläsning 8, Synkronisering 21
Återhämtning - via att döda processer Ihjälslagning: Någon av de låsta processerna slås ihjäl Ingen garanti för att baklåset låses upp på en gång, men om man slår ihjäl process efter process... Tillämpas av VMS OS Föreläsning 8, Synkronisering 22
Att aldrig hamna i båklås Bankiralgoritmen Bryta Coffmans villkor
Bankiralgoritmen Bygger på att systemet kan kontrollera schemaläggningen av processerna Vissa scheman leder till baklås, andra inte Varje process måste anmäla sitt maximala resursbehov i förväg OS Föreläsning 8, Synkronisering 24
Bankiralgoritmen forts. Systemet kan skall alltid befinna sig i ett säkert tillstånd Ett tillstånd är säkert om det finns en ordning i vilken processerna kan köras som inte leder till låsning även om alla processer utnyttjar hela sitt maximala resursbehov Om en process kommer med en begäran som skulle leda till att systemet kom i ett osäkert tillstånd om den uppfylldes så körs någon annan process i stället Den uppskjutna begäran uppfylls senare OS Föreläsning 8, Synkronisering 25
Bankiralgoritmen, ett exempel Antag att vi har 9 enheter totalt A Har Max 3 9 B begär 3 enheter B 3 6 A begär 2 enheter Har Max Har Max A 3 9 A 5 9 B 6 6 B 3 6 A B Har Max 3 9 0 - B terminerar Osäkert tillstånd ty A kan vilja ha 4 enheter till B kan vilja ha 3 enheter till Algoritmen undviker detta tillstånd OS Föreläsning 8, Synkronisering 26
Är bankiralgoritmen användbar? Hur ofta känner varje process hela sitt resursbehov innan exekveringen startar Hur ofta har man en fix processpopulation (går visserligen att fixa dynamiska populationer men det blir lite krångligt) Inte användbar i så många sammanhang för att undvika att hamna i deadlock Men har använts i gamla batch-system En lite mer förfinad variant kan användas för att upptäcka om man är i deadlock (se boken) OS Föreläsning 8, Synkronisering 27
Att förhindra låsning (prevention) Man ser till att något av Coffmans fyra villkor inte gäller Kan ibland lösa hela problemet Kombineras i annat fall med t.ex. strutsalgoritmen OS Föreläsning 8, Synkronisering 28
Undvika deadlock - bryt ömsesidig uteslutning Ömsesidig uteslutning Tillåt inte processer att äga resurser exklusivt alla resurser ska kunna delas Går det verkligen? I vissa fall kan man hantera resurser som måste ägas exklusivt genom att ha en process som fungerar som resurshanterare: ex: Hantering av skrivare Endast skrivardemonen reserverar skrivaren explicit Processer som vill skriva ut lägger en fil i en spoolkatalog där skrivardemonen hämtar dem OS Föreläsning 8, Synkronisering 29
Undvika deadlock -bryta behålla och vänta (hold-and-wait) Behåll och vänta Kräv att en process släpper alla resurser när den begär en ny, eller begär alla resurser på en gång Mer drakonisk variant av bankmannens algoritm OS Föreläsning 8, Synkronisering 30
Undvika deadlock -bryta no-preemption Ingen konfiskering Vissa resurser kan konfiskeras Fysiskt minne (dock kan inte swaputrymme på disken konfiskeras) Processorn (om man har avbrytande schemaläggning) Men inte alla resurser kan tas från en process på ett enkelt sätt om ens alls... OS Föreläsning 8, Synkronisering 31
Undvika deadlock -att bryta cirkulär väntan Cirkulär väntan Absolut mest populära villkoret att ge sig på Ge alla resurser ett nummer Det är bara tillåtet att allokera resurser i ökande ordning Om man har en resurs av typ N får man bara begära en resurs M om N<M Fungerar bäst om man vet vad alla processer kommer att göra, t.ex. i ett realtidssystem OS Föreläsning 8, Synkronisering 32
Vad kan man lära sig av att bryta cirkulär väntan? Om man t.ex har lås för flera kritiska sektioner och flera processer använder flera av de kritiska sektionerna så gäller: Om alla processer som behöver låsa mer än en sektion i taget låser sektionerna i samma ordning så undviker man deadlock OS Föreläsning 8, Synkronisering 33
Ett gammalt exempel Om processerna alltid måste ta resurser av typen X före resurser av typen Y skulle vi aldrig kunna få en deadlocksituation i det här exemplet! X A Y B OS Föreläsning 8, Synkronisering 34
Livelock En grupp av processer som exekverar men inte kommer vidare eftersom de hela tiden synkroniserar med varandra Ex: två personer möts i en smal gång och går fram och tillbaka åt samma håll för att släppa förbi den andre Svårt att upptäcka eftersom processerna fortfarande exekverar (ej blockerade) OS Föreläsning 8, Synkronisering 35
Svältning... ett relaterat ämne
SJF för online schemaläggning Shortest Job First är en optimal schemaläggningsalgoritm om man har alla jobb från början man vet hur lång tid de tar Om man får in nya jobb hela tiden kan det hända att ett jobb med körtid 10 kommer in, men det finns redan ett jobb i kön med körtid 5 ochdessutom kommer det hela tiden in nya korta jobb så det första jobbet får aldrig köra! Dvs. jobb kan bli utsatta för svältning OS Föreläsning 8, Synkronisering 37
Svältning Svältning inträffar när någon process aldrig får köra för att andra processer prioriteras Kanske andra processer har högre prioritet Kanske olika synkroniseringsproblem avlöser varandra OS Föreläsning 8, Synkronisering 38
Lösningar på svältningsproblemet Vanlig lösning Ge processer som fått vänta länge ökad prioritet (aging) Undvik prioriteter alla processer har samma prioritet OS Föreläsning 8, Synkronisering 39
Synkroniseringsexempel - gamla kära vänner Det finns ett antal synkroniseringsproblems-exempel som täcker in många av de vanligaste problemen som dyker upp vid synkronisering Bounded-buffer Readers and writers Sleeping barber Dining philosophers Förstår man dem kan man hantera många (de allra flesta) problem som kan dyka upp i samband med synkronisering OS Föreläsning 8, Synkronisering 40
Synkronisering koordinering i distribuerade system Klockor och tidsstämplar Ömsesidig uteslutning Valalgoritmer Att komma överens
Klockor Det är en fysikalisk omöjlighet att exakt synkronisera klockor Vi kan komma ganska nära med GPS-systemen Statistisk klocksynkronisering Men vi kan inte använda vanliga klockor för att exakt avgöra i vilken ordning händelser inträffat i ett distribuerat system Att kunna sekvensiera händelser kan vara viktigt i t.ex. databassystem och vid återhämntning efter krasch OS Föreläsning 8, Synkronisering 42
Logiska klockor - Lamports arbete Varje process i har en egen logisk klocka T i Vid varje lokal händelse i processen sätts T i = T i +1 Sändande av meddelande till en annan process är kommunikation och då uppdateras T i och skickas med meddelandet Vid mottagning av meddelande uppdateras den lokala tiden till max(lokaltid+1, meddelandetid + 1) Ger kausal ordning, dvs om en händelse A orsakat händelse B, direkt eller indirekt, är tidsstämpeln av A mindre än tidsstämpeln för B Total ordning av händelser kan man få om man t.ex använder (unikt) processid för att ordna händelser med samma tidsstämpel OS Föreläsning 8, Synkronisering 43
Ömsesidig uteslutning Centraliserad approach En server delar ut tillstånd att accessa kritisk sektion som sedan återlämnas till servern Token ring Rättigheten att accessa kritisk sektion, token, skickas runt i ring mellan processer som vill in i kritiska sektionen Distribuerad approach En process som vill in i kritiska sektionen skickar ut ett meddelande till alla andra om det stämplat med sin logiska klocka En process som tar emot meddelandet gör följande Om den inte vill in i KS svara direkt OK Om den vill in i KS och skickat ett meddelande om det med mindre tidsstämpel än på den förfrågan den tog emot vänta till dess att den fått använda KS svara sedan annars svara direkt OK Om den är inne i KS vänta med att svara till dess ute ur KS När en process fått ok från har den exklusiv tillgång till KS OS Föreläsning 8, Synkronisering 44
Annat intressant Strategier för att hantera lås så man undviker deadlock Programmeringsprimitiver: monitorer, kritiska sektioner, meddelandesändning i olika former Hur åstadkommer man atomiska transaktioner? Hur kan man återställa ett tillstånd efter krasch? (feltolerans i distribuerade databassystem) Hur väljer man koordinatorer? Hur kommer man överens? Hur hanterar man felaktiga processer? Kan problemen med ömsesidig uteslutning och kritiska sektioner minska/försvinna i distribuerade system med meddelandesändning? Hur hanteras borttappade meddelanden? OS Föreläsning 8, Synkronisering 45