Wstęp do programowania Wykład 7 Programowanie współbieżne, równoległe i rozproszone
Definicje Proces – wykonujący się program wraz z zasobami przydzielonymi mu przez system operacyjny. Wątek – sekwencja działań, która może wykonywać się jednocześnie z innymi sekwencjami działań w kontekście jednego procesu
Przetwarzanie równoległe, współbieżne i rozproszone Przetwarzanie równoległe (ang. parallel computing) Wykonywanie dwóch lub więcej procesów jednocześnie. Przetwarzanie współbieżne (ang. concurrent computing) Wykonywanie dwóch lub więcej procesów w taki sposób, że każdy z nich rozpoczyna się zanim skończą się pozostałe. Przetwarzanie rozproszone (ang. distributed computing) Wykonywanie dwóch lub więcej procesów jednocześnie na kilku komputerach połączonych siecią.
Superkomputer IBM Blue Gene P (2007) 36*1012 FLOPS FLOPS – FLoating point Operations Per Second
Superkomputer Sequoia (2012) 17.17*1015 FLOPS
Superkomputer Tianhe-2 (2013) 33.86 *1015 FLOPS Pamięć operacyjna: 1.34*106 gigabajtów 390 000 000 $
Klaster Ariel IV firmy Sun
Gęstość mocy
Procesor wielordzeniowy
Zasób dzielony Zasób dzielony – zasób, z którego korzysta kilka procesów (wątków). Problem powstaje wtedy jeśli tylko jeden proces (ograniczona liczba procesów) może w danej chwili korzystać z zasobu. W codziennym życiu: łazienka, telefon, wózki w hipermarkecie.
Sekcja krytyczna Sekcja krytyczna – fragment procesu, w którym korzysta on z zasobu dzielonego. Jeśli jeden z procesów wykonuje swoją sekcję krytyczną, inne procesy, które chcą wykonywać swoje sekcje krytyczne muszą czekać.
Przykład int x; proces1; proces2; int i,y; int i,y; { { { { for (i=1; i<=10; i++) for (i=1; i<=10;i++) { { y=x; y=x; y++; y++; x=y; x=y; } } } }
Problem wzajemnego wykluczania Zsynchronizować n procesów, z których każdy na przemian zajmuje się własnymi sprawami i wykonuje sekcję krytyczną, w taki sposób, aby żadne dwa procesy nie wykonywały swoich sekcji krytycznych w tym samym czasie. proces_i; obudź_sie; wstań; zjedz_śniadanie ……. umyj_się sekcja krytyczna
Schemat procesu proces; //deklaracje { while (true) własne sprawy; protokół wstępny; sekcja krytyczna; protokół końcowy; }
Poprawność programów współbieżnych Bezpieczeństwo Program współbieżny jest bezpieczny jeśli nie doprowadza do niepożądanego stanu. W przypadku problemu wzajemnego wykluczania własność bezpieczeństwa oznacza, że nigdy dwa procesy nie znajdą się jednocześnie w swoich sekcjach krytycznych. Żywotność Program współbieżny jest żywotny jeśli zapewnia, że każde pożadane zdarzenie w końcu zajdzie. W przypadku problemu wzajemnego wykluczania własność żywotności oznacza, że jeśli jakiś proces czeka na wejście do swojej sekcji krytycznej, to w końcu do niej wejdzie.
Blokada (zakleszczenie) Zbiór procesów znajduje się w stanie blokady, jeśli każdy z tych procesów jest wstrzymany w oczekiwaniu na zdarzenie, które może być spowodowane tylko przez jakiś inny proces z tego zbioru. Przykład: osoby A i B potrzebują noża i widelca. Na stole znajduje się jeden nóż i jeden widelec. Jeśli osoba A posiada widelec i czeka aż osoba B zwróci nóż, a osoba B posiada nóż i czeka aż osoba A zwróci widelec, to mamy blokadę.
Problem producentów i konsumentów … Producenci produkują porcje informacji i kładą je na bufor. Konsumenci pobierają porcje z bufora. Porcje powinny być pobierane w kolejności ich produkcji. Jeśli bufor jest pełny, producent musi czekać. Jeśli bufor jest pusty, konsument P1 P2 P3 Pn Producenci … Bufor … K1 K2 Km K3 Konsumenci
Problem czytelników i pisarzy Należy zsynchronizować dwie grupy procesów reprezentujących czytelników i pisarzy konkurujących o dostęp do wspólnej czytelni. Proces czytelnik co jakiś czas odczytuje informację zgromadzoną w czytelni i może to robić z innymi czytelnikami. Proces pisarz co jakiś czas zapisuje nową informację w czytelni i musi wówczas przebywać w czytelni sam. Zakładamy, że operacje czytania i pisania trwają skończoną ilość czasu.
Problem pięciu filozofów
Algorytm piekarniany (Lampart) Proces, który chce wejść do swojej sekcji krytycznej, pobiera numerek. Następnie czeka aż wszystkie procesy, które pobrały wcześniejsze numerki zrealizują swoje sekcje krytyczne. Wada: aktywne czekanie!
Semafory (Dijkstra) Semafor -- zmienna całkowita przyjmująca wartości nieujemne. Na semaforze S określone są dwie atomowe operacje: wait(S) (opuszczenie semafora) i signal(S) (podniesienie semafora) wait(S): jeśli S>0, to S=S-1 wpp wstrzymaj działanie procesu wykonującego tę operację. signal(S): jeśli są procesy wstrzymane w wyniku operacji opuszczania, wznów jeden z nich. W przeciwnym przypadku S++.
Semafory i wzajemne wykluczanie semaphore S=1; proces(int i) { while(true) { własne sprawy; wait(S); sekcja krytyczna; signal(S); } }
Spotkanie (rendezvous) Wątek 1: Wątek 2: A; B; C;D; (A, B, C, D – instrukcje) Chcemy, aby A wykonała się przed D oraz C przed B. semaphore jest1=0, jest2=0; Wątek 1: Wątek 2: A ; C; signal(jest1); signal(jest2); wait(jest 2); wait(jest1); B; D