SOP wyk nr 13-Slajd8

Z Studia Informatyczne
Wersja z dnia 10:55, 16 sie 2006 autorstwa Dwa (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Implementacja semafora ogólnego na poziomie systemu (2)

Implementacja semafora ogólnego na poziomie systemu (2)


Zwiększenie wartości zmiennej semaforowej (pole wartość struktury semafora) jest operacją oczywistą, ale wartość ta mogła być ujemna, co oznacza, że w kolejce są procesy oczekujące na podniesienie semafora. Wówczas z kolejki wybierany jest jeden z procesów, który jest z niej usuwany, a następnie jest budzony (jego stan z oczekujący zmienia się na gotowy ).

W podobny sposób można zrealizować semafor binarny, z tą różnicą, że jeśli pole wartość jest równe 1 (co oznacza otwarcie), a wykonywana jest operacja podnoszenia, to stan semafora nie ulega zmianie, czyli:

procedure V(var s : Semaphore)begin if s .wartość < 1 then s .wartość ?? s .wartość + 1; if s .wartość ? 0 then begin wybierz i usuń jakiś / kolejny proces z kolejki s .Lzmień stan wybranego procesu na gotowy end ; end ;

Nieco bardziej skomplikowany jest przypadek implementacji semaforów uogólnionych. Pozostawia się to jako ćwiczenie. Warto mieć jednak na uwadze dwa kryteria przy podnoszeniu semafora:

  • zwiększanie przepustowości i budzenie procesów, dla których zmienna semaforowa osiągnęła wystarczającą wartość, nawet jeśli nie znajdują się na czele kolejki (ryzyko głodzenia procesów, które chcą opuścić semafor o relatywnie dużą wartość),
  • zachowanie sprawiedliwości i budzenie procesów w kolejności ich kolejkowania.


<< Poprzedni slajd | Spis treści | Następny slajd >>