SO-1st-2.3-w12.tresc-1.0-Slajd9: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 8: | Linia 8: | ||
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: | 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''' ''' | '''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: | 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ń 19:47, 24 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.