Deadlock uppstår när två eller flera processer hamnar i ett cirkelberoende Processen vill ha resursen Resurs 1 Process A Processen äger resursen Processen äger resursen Process B Resurs 2 Processen vill ha resursen
Fyra villkor för att deadlock ska uppstå Ömsesidig uteslutning. En resurs kan användas av ett begränsat antal processer. Väntar på resurser. En process som redan har en resurs väntar på en annan resurs. Kan inte ta bort en resurs från en process (preemptive) Cirkulärberoende.
semaphore r1, r2; void processa(){ down(r1); down(r2); OK semaphore r1, r2; void processa(){ down(r1); down(r2); /* Använd resurser */ /* Använd resurser */ } up(r2); up(r1); } up(r2); up(r1); void processb(){ down(r1); down(r2); NIX void processb(){ down(r2); down(r1); /* Använd resurser */ /* Använd resurser */ } up(r2); up(r1); } up(r1); up(r2);
Hur löser man problemet? Strunta i det. Det är så många andra problem som kan sänka en process så det är inte värt kostnaden att hantera deadlock. Försök hitta deadlocks och lös upp dem. Om man kan hitta deadlock så kan man kanske hitta nåt sätt att knyta upp knuten. Undvik genom att vara försiktig vid resurstilldelningen. Om man inte delar ut resurser när det finns risk för deadlock så undviker man ju problemet. Designa så att de fyra villkoren aldrig uppstår
Strunta i problemet Vanlig och lättimplementerad lösning som används av tex Unix och Windows
Hitta och fixa R A B C S D T E F U Y W G Algoritm för att upptäcka cirkelberoenden finns i boken på sidan 170
Hitta och fixa Resurser som finns totalt (E 1, E 2, E 3,, E m ) Resurser som är tillgängliga (A 1, A 2, A 3,, A m ) C 11 C 12 C 13 C 1m R 11 R 12 R 13 R 1m Process har C 21 C 22 C 23 C 2m Process vill ha R 21 R 22 R 23 R 2m C k1 C k2 C k3 C km R k1 R k2 R k3 R km
Exempel Anta att de existerande resurserna är (4,3,4) av de tre resurstyperna Vid en viss tidpunkt så har de tre processerna följande resurser tilldelande 1 2 0 0 0 3 1 0 0 För att kunna avsluta så behöver processerna följande resurser 1 0 1 2 1 0 1 3 0 Tillgängligt är alltså (2,1,1). Ta den första begäran som passar, dvs (1,2,0) P1 kan avsluta och lämna igen resurser, dvs (3,3,1) P2s begäran passar, dvs (3,3,4) P3s begäran passar. OK Tillstånd 2 2 0 0 1 3 1 0 1 Tillgängligt (1,0,1) => P3 passar => (2,0,2) => varken P1 eller P2 passar Behöver 1 2 0 0 0 3 1 0 0
Hur återhämtar man sig?? (inte lätt) Avbryta en exekverande process. Är det möjligt att på nåt sätt rycka bort en resurs från en process? Hoppa tillbaka till ett tidigare tillstånd. Processerna får spara sitt tillstånd då och då, när deadlock uppstår så får nån/några processer backa tillbaka. Slå ihjäl en process. Brutalt och i vissa lägen omöjligt.
Se till att det aldrig uppstår deadlock Finns det nåt säkert sätt att tilldela resurserna?
Bankers Algorithm Samma sak som för att upptäcka deadlocks Men hur vet man vilka resurser en process behöver? Vad händer om en ny process startas? Och en process låser antagligen inte upp alla resurser hela livstiden.
Förhindra genom att angripa de fyra villkoren Ta bort möjligheten att låsa resurser Låsanordning Lämna ifrån sig jobb... funkar dock inte generellt Skrivare Skrivare
Inte göra det möjligt att ta resurser och vänta på flera Begära att få alla resurser då man startar... men hur vet man vilka resurser en process behöver? Reursslöseri!! Innan man får nåt nytt så får man släppa det man har och begära allt på nytt (på en gång)
Se till att man kan ta bort resurser Svårt
Göra det möjligt att ta tillbaka resurser Svårt
Se till att inte cirkelberoenden uppstår Bara använda en resurs i taget!! (jojo) Numrera resurserna och tillåt endast att man tar resurserna i nummerordning 1. Skrivare 2. Scanner 3. CD-ROM 4. DVD spelare Men vilken ordning ska man ha dem i??
För vissa speciella tillämpningar så kan man göra speciallösningar, t.ex. two-phase locking för databaser Ett annat problem är svält There is still a little research on distributed deadlock detection... Its main function seems to be keeping otherwise unemployed graph theorists off the streets