SOP wyk nr 13-Slajd8: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Dwa (dyskusja | edycje)
Nie podano opisu zmian
 
Dwa (dyskusja | edycje)
m drobne zmiany treści opisu
 
(Nie pokazano 3 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
==Implementacja semafora ogólnego na poziomie systemu (2)==
==Implementacja semafora ogólnego na poziomie systemu operacyjnego (2)==


[[Image:SOP_wyk_nr_13-Slajd8.PNG|Implementacja semafora ogólnego na poziomie systemu (2)]]
[[Image:SOP_wyk_nr_13-Slajd8.PNG|Implementacja semafora ogólnego na poziomie systemu operacyjnego (2)]]




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ść ?? ''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''' ;
'''procedure''' V('''var''' ''s'' : Semaphore)
'''begin'''
'''if''' ''s''.wartość < 1 '''then'''
    ''s''.wartość := ''s''.wartość + 1;
    '''if''' ''s''.wartość &ge; 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ń 23:44, 5 wrz 2006

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