05.Mechanizmy pracy rownoleglej
Download
Report
Transcript 05.Mechanizmy pracy rownoleglej
Jarosław Kuchta
Mechanizmy pracy
równoległej
Zagadnienia
Algorytmy wzajemnego wykluczania
Mechanizmy niskopoziomowe
algorytm Dekkera
przerwania
mechanizmy ochrony pamięci
instrukcje specjalne
Mechanizmy wysokopoziomowe
mechanizmy synchronizacji
mechanizmy komunikacji
semafory, monitory
sygnały, komunikaty, zdarzenia, potoki, gniazda, zdalne wywołania procedur,
usługi sieciowe
Rodzaje komunikacji i synchronizacji
Algorytmy wzajemnego
wykluczania
Algorytmy wzajemnego
wykluczania (1)
2
P1
P2
P1
=1?
Czyja kolej
{1/2}
=2?
1
P2
Kod algorytmu 1
void P1()
{
do
{
while (czyja_kolej ==2) do ;
sekcja_krytyczna_1();
czyja_kolej = 2;
sekcja_lokalna_1();
} while (true);
}
void P2()
{
do
{
while (czyja_kolej ==1) do ;
sekcja_krytyczna_2();
czyja_kolej = 1;
sekcja_lokalna_2();
} while (true);
}
Wady algorytmu 1
Częstotliwość pracy P1 i P2 muszą być równe.
Jeśli P1 zawiesi się w swojej sekcji krytycznej (albo poza
nią), to P2 nie będzie już mógł działać.
Algorytmy wzajemnego
wykluczania (2)
P2
=N?
P1
P1 w sekcji krytycznej
N
{T/N}
T
P2
T
P2 w sekcji krytycznej N
{T/N}
=N?
P1
Kod algorytmu 2
void P1()
{
do
{
while (c2) do ;
c1 = true;
sekcja_krytyczna_1();
c1 = false;
sekcja_lokalna_1();
} while (true);
}
void P2()
{
do
{
while (c1) do ;
c2 = true;
sekcja_krytyczna_2();
c2 = false;
sekcja_lokalna_2();
} while (true);
}
Wada algorytmu 2
Nie zabezpiecza przed blokadą
P1 w sekcji krytycznej?
(c1)
P2 w sekcji krytycznej?
(c2)
Stan początkowy
N
N
P1 sprawdza c2
N
N
P2 sprawdza c1
N
N
P1 ustawia c1
T
N
P2 ustawia c2
T
T
P1 wchodzi do sekcji
krytycznej
T
T
P2 wchodzi do sekcji
krytycznej
T
T
Algorytm 3 – ustawianie c1 i c2
przed oczekiwaniem
void P1()
{
do
{
c1 = true;
while (c2) do ;
sekcja_krytyczna_1();
c1 = false;
sekcja_lokalna_1();
} while (true);
}
void P2()
{
do
{
c2 = true;
while (c1) do ;
sekcja_krytyczna_2();
c2 = false;
sekcja_lokalna_2();
} while (true);
}
Wada algorytmu 3
Również nie zabezpiecza przed blokadą
P1 w sekcji krytycznej?
(c1)
P2 w sekcji krytycznej?
(c2)
Stan początkowy
N
N
P1 ustawia c1
T
N
P2 ustawia c2
T
T
P1 sprawdza c2
T
T
P2 sprawdza c1
T
T
…
T
T
T
T
Algorytm 4 – wydłużone
oczekiwanie
void P1()
{
do
{
c1 = true;
while (c2) do
{
c1 = false;
wait_for_some_time(delay);
c1 = true;
}
sekcja_krytyczna_1();
c1 = false;
sekcja_lokalna_1();
} while (true);
}
void P2()
{
do
{
c2 = true;
while (c1) do
{
c2 = false;
wait_for_some_time(delay);
c2 = true;
}
sekcja_krytyczna_2();
c2 = false;
sekcja_lokalna_2();
} while (true);
}
Wada algorytmu 4
W specyficznej sytuacji nie zabezpiecza przed blokadą
P1 w sekcji krytycznej? (c1)
P2 w sekcji krytycznej? (c2)
Stan początkowy
N
N
P1 ustawia c1
T
N
P2 ustawia c2
T
T
P1 sprawdza c2
T
T
P2 sprawdza c1
T
T
P1 kasuje c1
N
T
P2 kasuje c2
N
N
P1 ustawia c1
T
N
P2 ustawia c2
T
T
Algorytm Dekkera
– połączenie algorytmu 1. i 4.
void P1()
{
do
{
c1 = true;
while (c2) do
{
if (czyja_kolej == 2)
{
c1 = false;
while (czyja_kolej == 2) do;
c1 = true;
}
}
sekcja_krytyczna_1();
czyja_kolej = 2;
c1 = false;
sekcja_lokalna_1();
} while (true);
}
void P2()
{
do
{
c2 = true;
while (c2) do
{
if (czyja_kolej == 1)
{
c2 = false;
while (czyja_kolej == 1) do;
c2 = true;
}
}
sekcja_krytyczna_2();
czyja_kolej = 1;
c2 = false;
sekcja_lokalna_2();
} while (true);
}
Mechanizmy
niskopoziomowe
Przerwania
wątek podstawowy
przerwanie o niższym priorytecie
przerwanie o wyższym priorytecie
Przerwania maskowalne
wątek podstawowy
czas maskowania przerwań
obsługa przerwań
zgłoszenia przerwań
Przerwania niemaskowalne
wątek podstawowy
czas maskowania przerwań
obsługa przerwań
zgłoszenia przerwań
Przerwania w systemie
równoległym
Wykorzystanie maskowania do ochrony sekcji
krytycznej
W systemie wieloprocesorowym brak gwarancji
ochrony sekcji krytycznej
Mechanizmy ochrony pamięci
Arbitraż dostępu do pamięci
Nieznana kolejność dostępu
Instrukcje specjalne
Na poziomie procesora
BTC – Bit Test and Complement
BTS – Bit Test and Set
BTR – Bit Test and Reset
Na poziomie języka (C#)
lock(object) { … }
Mechanizmy
wysokopoziomowe
Semafor
Zmienna całkowita
podnoszenie
opuszczanie
Wada:
programowanie
niestrukturalne
Monitor
Nadzoruje dostęp do wspólnego zasobu.
Tylko jeden proces ma dostęp w danej chwili.
Sygnał
Zmienna systemowa do komunikacji między procesami.
Proces 1. czeka na sygnał.
Proces 2. ustawia sygnał.
Ustawienie sygnału powoduje wznowienie procesu 1. i
jednoczesne skasowanie sygnału.
Komunikat
Informacja przekazywana od procesu 1. do procesu 2.
Komunikat trafia do kolejki komunikatów procesu 2.
Proces 2. co pewien czas sprawdza, czy ma jakieś
komunikaty w kolejce.
Odbiera komunikat z kolejki i obsługuje go.
Zdarzenie
Proces 1. definiuje zdarzenie jako procedurę obsługi.
Proces 2. wywołuje procedurę obsługi zdarzenia w
procesie 1.
Procedura obsługi jest wykonywana w wątku procesu 2,
ale ma dostęp do danych procesu 1.
Potok (pipe)
umożliwia wymianę danych między dwoma procesami
potok nienazwany łączy standardowe wyjście jednego
procesu ze standardowym wejściem drugiego procesu
potok nazwany – plik do którego jeden proces pisze, a
drugi proces czyta
Gniazdo (socket)
dwukierunkowy punkt końcowy połączenia
umożliwia wysyłanie i przyjmowanie danych
wykorzystywane przez aplikacje do komunikacji
międzyprocesowej przez sieć (Internet)
Zdalne wywołanie procedur
(RPC)
Remote Procedure Call
Standard RFC 1057
Protokół:
Serwer nasłuchuje na wybranym porcie.
Klient nawiązuje łączność z serwerem przez sieć komputerową i wysyła
żądanie usługi (dane)
Serwer wykonuje usługę i zwraca potwierdzenie lub kod błędu.
Protokoły (RPC, CORBA, DCOM, czy XML-RPC) ukrywają
mechanizm wywołania usługi.
Dla programisty zdalne wywołanie procedury ma taką samą
postać jak wywołanie każdej innej lokalnej procedury.
Usługa sieciowa (WebService)
Niezależna od platformy sprzętowo-programowej i
sposobu implementacji.
Opisywana przez język opisu usług WSDL (Web
Services Description Language)
Opublikowana i wyszukiwana w rejestrze usług za
pomocą standardowego mechanizmu (UDDI)
Wywołana zdalnie przez zdefiniowany interfejs.
Rodzaje usług sieciowych
Synchroniczne (jak RPC)
Asynchroniczne (np. RIA)
Po stronie serwera usługa jak zwykła funkcja.
Po stronie klienta:
zdefiniowanie operacji,
określenie danych wejściowych i procedury zwrotnej (callback),
asynchroniczne wywołanie – wysłanie żądania wykonania do serwera,
asynchroniczne wywołanie procedury zwrotnej przez serwer –
potwierdzenie wykonania, przekazanie żądanych danych, stwierdzenie
błędu wykonania.
Rodzaje komunikacji i
synchronizacji
Komunikacja synchroniczna – nadawca wysyła
komunikat i czeka na odpowiedź od odbiorcy.
wywołanie procedury zdarzenia
zdalne wywołanie procedur
Komunikacja asynchroniczna – nadawca wysyła
komunikat i kontynuuje działanie. Odbiorca odbiera i
obsługuje komunikat, po czym wysyła komunikat
potwierdzenia.
kolejki komunikatów
niektóre usługi sieciowe