systemy_czasu_rzeczywistego:semafory [mgr Wiki]

[[systemy_czasu_rzeczywistego:semafory]]
mgr Wiki

Z definicji, współbieżne systemy czasu rzeczywistego używają zadań , aby osiągnąć własności asynchroniczne. Jednak czasami istnieje konieczność synchronizacji zadań poprzez blokowanie ich do czasu, aż potrzebny im zasób będzie dostępny. Synchronizacja zarządza dostępem do wspólnych zasobów przez wstrzymanie zadania poprzez wejście w obszar krytyczny na czas, gdy inne zadanie używa danych. Każda dzielona zmienna lub globalna wspólna pamięć musi posiadać mechanizm wzajemnego wykluczania w celu zapobieżenia niepoprawnemu przetwarzaniu danych. Takim mechanizmem są semafory.

Semafor (semaphore) S jest zmienną systemową, której wartość może być sprawdzana i zmieniana przez wszystkie zadania za pomocą jednej z dwóch niepodzielnych instrukcji:

              Wait(S)  if S >0 then
                           S = S – 1
                       else
                           zawieś wykonywanie zadania

              Post (S) if istnieje zadanie zawieszone then
                           wznów jedno zdanie
                       else
                           S = S + 1

Lista zadań zawieszonych na semaforze może być obsługiwana zgodnie z algorytmem FIFO lub też mogą być brane pod uwagę priorytety zdań. Zaletą pierwszego sposobu jest prostota i uczciwość tzn, żadne zdanie zawieszone nie będzie czekać w nieskończoność na zasób. Wadą jest możliwość wstrzymywania zadania o wyższych priorytetach przez wcześniej zawieszone zadania o niższych priorytetach. Cechy algorytmu priorytetowego są przeciwstawne. W praktyce najczęściej stosowany jest algorytm FIFO. Niepodzielność operacji wait oraz post oznacza niemożliwość jednoczesnego wykonywania dwóch dowolnych operacji na tym samym semaforze przez wiecej niż jeno zadanie.

Anomaliami synchronizacji są:

- Zakleszczenie – katastrofalna sytuacja, która może nastąpić, gdy zadania oczekują na wznowienie przez inne zadania, które z kolei są zwieszone w oczekiwaniu na wznowienie przez zadania pierwszej grupy.

- Inwersja priorytetów – problem występuje, gdy zadnie o wysokim priorytecie i zadnie o niskim priorytecie współdzielą jakiś zasób. Zadanie o niskim priorytecie pobiera krytyczny zasób. Zadanie o średnim priorytecie wywłaszcza zadanie o niskim priorytecie (nie konkuruje o zasób, czyli nie jest ograniczony semaforem). Zadanie o wysokim priorytecie nie może się wykonać, bo czeka na zwolnienie zasobu, będącego w posiadaniu zadania o niskim priorytecie, a zadanie to nie może się wykonać, ponieważ zostało wywłaszczone przez zadanie o wyższym priorytecie.

systemy_czasu_rzeczywistego/semafory.txt · Last modified: 2006/05/13 11:55 by 80.55.115.122