SO-1st-2.3-w12.tresc-1.0-Slajd9

Z Studia Informatyczne
Wersja z dnia 19:47, 24 wrz 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 operacyjnego (2)

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 nagotowyend;
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 >>