SOP wyk nr 13-Slajd8: 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''' V('''var''' ''s'' : Semaphore)'''begin''' '''if''' ''s'' .wartość < 1 '''then''' ''s'' .wartość | '''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: |
Wersja z 11:08, 16 sie 2006
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 .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.