SO-1st-2.3-w12.tresc-1.0-Slajd6: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Dwa (dyskusja | edycje)
Nie podano opisu zmian
 
Dwa (dyskusja | edycje)
Nie podano opisu zmian
 
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 8: Linia 8:
W celu wyeksponowania przepływu sterowania i wskazania instrukcji, które muszą być wykonane niepodzielnie, implementację operacji ''P'' można przedstawić następująco:
W celu wyeksponowania przepływu sterowania i wskazania instrukcji, które muszą być wykonane niepodzielnie, implementację operacji ''P'' można przedstawić następująco:


'''procedure''' '''P(var''' ''s'' : Semaphore)'''begin''' próbuj:
'''procedure''' P('''var''' ''s'' : Semaphore)'''begin''' próbuj:
 
    zablokuj_obsługę_przerwań;
zablokuj_obsługę_przerwań;
    '''if''' ''s'' = 0 '''then'''  
 
    '''begin'''
'''if''' ''s'' = 0 '''then'''  
      odblokuj_obsługę_przerwań;
 
      '''goto''' próbuj
'''begin''' odblokuj_obsługę_przerwań;
    '''end''';
 
    '''else''' '''begin''' ''s'' := ''s'' – 1;
'''goto''' próbuj
      odblokuj_obsługę_przerwań
 
    '''end''';
'''end''' ;
'''end''';
 
'''else''' '''begin''' ''s'' ?? ''s'' – 1;
 
odblokuj_obsługę_przerwań
 
'''end''' ; '''end''' ;


Ciąg instrukcji pomiędzy zablokowaniem, a odblokowaniem przerwań wykonywany jest niepodzielnie. Istotne jest zatem niepodzielne sprawdzenie i zmniejszenie wartości zmiennej ''s'' (pod warunkiem, że jest większa od 0).
Ciąg instrukcji pomiędzy zablokowaniem, a odblokowaniem przerwań wykonywany jest niepodzielnie. Istotne jest zatem niepodzielne sprawdzenie i zmniejszenie wartości zmiennej ''s'' (pod warunkiem, że jest większa od 0).

Aktualna wersja na dzień 19:41, 24 wrz 2006

Implementacja semafora ogólnego na poziomie maszynowym

Implementacja semafora ogólnego na poziomie maszynowym


W implementacji na poziomie maszynowym semafor ogólny jest zmienną całkowitą nieujemną (teoretycznie nieograniczoną od góry), na której wykonywane są operacje P i V . Takie podejście do implementacji wynika zatem bezpośrednio z definicji.

W celu wyeksponowania przepływu sterowania i wskazania instrukcji, które muszą być wykonane niepodzielnie, implementację operacji P można przedstawić następująco:

procedure P(var s : Semaphore)begin próbuj:
   zablokuj_obsługę_przerwań;
   if s = 0 then 
   begin
      odblokuj_obsługę_przerwań;
      goto próbuj
   end;
   else begin s := s – 1;
      odblokuj_obsługę_przerwań
   end;
end;

Ciąg instrukcji pomiędzy zablokowaniem, a odblokowaniem przerwań wykonywany jest niepodzielnie. Istotne jest zatem niepodzielne sprawdzenie i zmniejszenie wartości zmiennej s (pod warunkiem, że jest większa od 0).

Skok do linii zaetykietowanej jako próbuj oznacza aktywne czekanie.


<< Poprzedni slajd | Spis treści | Następny slajd >>