SOP wyk nr 13-Slajd8: Różnice pomiędzy wersjami
m d |
m drobne zmiany treści opisu |
||
Linia 14: | Linia 14: | ||
'''if''' ''s''.wartość ≥ 0 '''then''' | '''if''' ''s''.wartość ≥ 0 '''then''' | ||
'''begin''' | '''begin''' | ||
''wybierz'' ''i'' ''usuń'' ''jakiś'' ''/'' ''kolejny'' ''proces'' ''z'' ''kolejki'' ''s''.L | ''wybierz'' ''i'' ''usuń'' ''jakiś'' ''/'' ''kolejny'' ''proces'' ''z'' ''kolejki'' ''s''.L; | ||
''zmień'' ''stan'' ''wybranego'' ''procesu'' ''na'' „''gotowy''” | ''zmień'' ''stan'' ''wybranego'' ''procesu'' ''na'' „''gotowy''” | ||
'''end''' ; | '''end'''; | ||
'''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: | 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: |
Aktualna wersja na dzień 23:44, 5 wrz 2006
Implementacja semafora ogólnego na poziomie systemu operacyjnego (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.L; zmień 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.