Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Podobne dokumenty
Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Problemy współbieżności

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Współbieżność w środowisku Java

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Monitory. Jarosław Kuchta

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Wątki w Javie. Piotr Tokarski

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Język Java wątki (streszczenie)

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Systemy operacyjne. Zajęcia 11. Monitory

Programowanie wielowątkowe. Tomasz Borzyszkowski

w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Współbieżność w Javie

synchronizacji procesów

synchronizacji procesów

Współbieżność w Javie

Podstawy współbieżności

Kurs programowania. Wykład 8. Wojciech Macyna

Programowanie współbieżne Wykład 5. Rafał Skinderowicz

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Temat zajęć: Tworzenie i obsługa wątków.

Język Java wątki (streszczenie)

Aplikacje w Javie- wykład 11 Wątki-podstawy

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

1. Uruchom poniższy program tworzący pojedynczy wątek:

Programowanie komputerów

Programowanie Równoległe i Rozproszone

Synchronizacja procesów

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Wstęp do programowania 2

Programowanie współbieżne i rozproszone

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Zaawansowany kurs języka Python

Zaawansowane programowanie w C++ (PCP)

Wielowątkowy serwer TCP

Wprowadzenie do programowania współbieżnego

Mariusz Rudnicki PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.4

Java. Programowanie Obiektowe Mateusz Cicheński

Programowanie współbieżne Laboratorium nr 11

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

Programowanie współbieżne Wykład 2. Rafał Skinderowicz

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Modele programowania równoległego. Pamięć współdzielona Rafał Walkowiak dla III roku Informatyki PP

Multimedia JAVA. Historia

WIELOWĄTKOWOŚĆ. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Programowanie wielowątkowe: podstawowe koncepcje, narzędzia w Javie. J. Starzyński, JiMP2, rok akad. 2005/2006

Plan wykładu. Obliczenia równoległe w zagadnieniach inżynierskich. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

Synchronizacja procesów i wątków

Programowanie współbieżne Wykład 7. Iwona Kochaoska

Architektury systemów równoległych

Model pamięci. Rafał Skinderowicz

1. Tworzenie nowego projektu.

Programowanie współbieżne Wykład 9 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Proces z sekcją krytyczną. Synchronizacja procesów. Synchronizacja procesów, cd. Synchronizacja procesów, cd. Synchronizacja procesów, cd

Systemowe mechanizmy synchronizacji procesów

Mechanizmy komunikacji. spotkania symetryczne (język CSP) spotkania asymetryczne (Ada) przestrzenie krotek (Linda) potoki, komunikaty i kanały (Unix)

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Gdy kilka procesów czyta a przynajmniej jeden dokonuje zapisu wynik odczytu zależeć może od sposobu realizacji przeplotu.

Programowanie współbieżne Laboratorium nr 12

Programowanie obiektowe

Program współbieżny jest zbiorem sekwencyjnych PROGRAMOWANIE C++

Systemy Operacyjne 2: Wątki pthreads. dr inż. Arkadiusz Chrobot

Programowanie współbieżne i rozproszone w języku Java

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Wykład 8: klasy cz. 4

Wielowątkowość 1. Marcin Orchel. AGH University of Science and Technology in Poland 1 / 58

Systemy Rozproszone - Ćwiczenie 4

6.1 Pojęcie wątku programu 6.2 Klasy Timer, TimerTask 6.3 Klasa Thread 6.4 Synchronizacja pracy wątków 6.5 Grupowanie wątków

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Kurs rozszerzony języka Python

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

4.1 Napisz kod, w którym definiujesz, tworzysz oraz uruchamiasz wątki z uŝyciem klas java.lang.thread oraz java.lang.runnable.

W Javie wątki są obiektami zdefiniowanymi za pomocą specjalnego rodzaju klas.

Przetwarzanie równoległe i współbieżne

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Implementacje zgodne z tym standardem są nazywane wątkami POSIX lub Pthreads.

Programowanie obiektowe

Podstawy programowania współbieżnego. 1. Wprowadzenie. 2. Podstawowe pojęcia

Programowanie obiektowe

Proces z sekcją krytyczną. Synchronizacja procesów. Synchronizacja procesów, cd. Synchronizacja procesów, cd. Synchronizacja procesów, cd

Plan wykładu. Programowanie aplikacji równoległych i rozproszonych. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

Transkrypt:

Programowanie równoległe i rozproszone W1. Wielowątkowość Krzysztof Banaś Programowanie równoległe i rozproszone 1

Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np. komputery macierzowe) realizowana programowo (bariera, sekcja krytyczna, operacje atomowe) wzajemne wykluczanie sekcja krytyczna protokoły wejścia i wyjścia z sekcji krytycznej cechy rozwiązań zagadnień synchronizacji: pożądane bezpieczeństwo i żywotność, uczciwość możliwe błędy zakleszczenie, zagłodzenie Krzysztof Banaś Programowanie równoległe i rozproszone 2

Wzajemne wykluczanie wątków Specyfikacja POSIX: muteks mutual exclusion tworzenie muteksa int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex attr_t *mutexattr) zamykanie muteksa (istnieje wersja pthread_mutex_trylock) int pthread_mutex_lock(pthread_mutex_t *mutex) otwieranie muteksa int pthread_mutex_unlock(pthread_mutex_t *mutex) odpowiedzialność za poprawne użycie muteksów (gwarantujące bezpieczeństwo i żywotność) spoczywa na programiście Krzysztof Banaś Programowanie równoległe i rozproszone 3

Problemy współbieżności Problem producentów i konsumentów: jedna grupa procesów produkuje dane, druga grupa je konsumuje jak zagwarantować sprawny (bez zakleszczeń i zagłodzeń) przebieg tej procedury Problem czytelników i pisarzy podobnie jak powyżej, z tym że produkować (pisać) może jednocześnie tylko jeden proces, natomiast konsumować (czytać) może wiele procesów na raz Krzysztof Banaś Programowanie równoległe i rozproszone 4

Zmienne warunku Pthreads Zmienne warunku condition variables: zmienne warunku są zmiennymi wspólnymi dla wątków, które służą do identyfikacji grupy uśpionych wątków tworzenie zmiennej warunku: int pthread_cond_init( pthread_cond_t *cond, pthread_condattr_t *cond_attr) uśpienie wątku w miejscu identyfikowanym przez zmienną warunku cond, wątek śpi (czeka) do momentu, gdy jakiś inny wątek wyśle odpowiedni sygnał budzenia dla zmiennej cond int pthread_cond_wait( pthread_cond_t *cond, pthread_mutex_t *mutex) sygnalizowanie (budzenie pierwszego oczekującego na zmiennej *cond) int pthread_cond_signal( pthread_cond_t *cond) rozgłaszanie sygnału (budzenie wszystkich oczekujących na zmiennej *cond) int pthread_cond_broadcast( pthread_cond_t *cond) Krzysztof Banaś Programowanie równoległe i rozproszone 5

Wykorzystanie zmiennych warunku Schemat rozwiązania problemu producenta i konsumenta procedura główna pthread_mutex_t muteks= PTHREAD_MUTEX_INITIALIZER; pthread_cond_t nie_pelna, nie_pusta; // należy także zainicjować int main(){ pthread_t producent, konsument; kolejka *fifo; fifo = inicjuj_kolejka(); // kolejka zawiera bufor do zapisu i odczytu pthread_create( &producent, NULL, produkuj, fifo ); pthread_create( &konsument, NULL, konsumuj, fifo ); pthread_join( producent, NULL); pthread_join( konsument, NULL ); } Krzysztof Banaś Programowanie równoległe i rozproszone 6

Wykorzystanie zmiennych warunku procedura producenta void *produkuj( void *q){ kolejka *fifo; int i; fifo = (kolejka *)q; // kolejka zawiera bufor do zapisu i odczytu for(...){ pthread_mutex_lock (&muteks); while( kolejka_pelna(fifo) ) pthread_cond_wait(&nie_pelna, &muteks ); kolejka_wstaw(fifo,...); pthread_mutex_unlock( &muteks ); pthread_cond_signal( &nie_pusta ); } } Krzysztof Banaś Programowanie równoległe i rozproszone 7

Wykorzystanie zmiennych warunku procedura konsumenta void *konsumuj( void *q){ kolejka *fifo; int i, d; fifo = (kolejka *)q; // kolejka zawiera bufor do zapisu i odczytu for(...){ pthread_mutex_lock (&muteks); while( kolejka_pusta(fifo) ) pthread_cond_wait(&nie_pusta, &muteks); kolejka_pobierz(fifo,...); pthread_mutex_unlock( &muteks ); pthread_cond_signal( &nie_pelna ); } } Krzysztof Banaś Programowanie równoległe i rozproszone 8

Monitory W ujęciu klasycznym monitor jest modułem posiadającym: stan atrybuty (stałe i zmienne) zachowanie metody (procedury i funkcje)) Metody monitora dzielą się na: udostępniane na zewnątrz publiczne wewnętrzne prywatne Podstawową zasadą działania monitora jest realizowanie sekcji krytycznej na poziomie obiektu: jeżeli jakiś proces/wątek rozpoczął realizację dowolnej publicznej metody, żaden inny proces/wątek nie może rozpocząć realizacji tej samej lub innej publicznej metody monitora inaczej: wewnątrz monitora może znajdować się tylko jeden proces/wątek Krzysztof Banaś Programowanie równoległe i rozproszone 9

Monitory Realizacją wzajemnego wykluczania w dostępie do monitorów zarządza środowisko w ramach, którego funkcjonuje monitor Wątek, który wywołuje publiczną metodę monitora jest: wpuszczany do monitora, jeśli w monitorze nie ma innych wątków ustawiany w kolejce oczekujących wątków, jeśli w monitorze znajduje się wątek Po opuszczeniu monitora przez wątek system wznawia działanie pierwszego wątku w kolejce Istnieje jedna kolejka dla monitora (obsługuje próby wywołań wszystkich funkcji monitora) Krzysztof Banaś Programowanie równoległe i rozproszone 10

Monitory Monitor jest skuteczną realizacją wzajemnego wykluczania przy dostępie do swoich wewnętrznych zasobów inaczej: jeśli chcemy dostęp do jakiegoś zasobu uczynić wyłącznym dla pojedynczego wątku, należy umieścić ten zasób jako zasób wewnętrzny monitora Monitor umożliwia także synchronizację działania wątków opartą o mechanizm zmiennych warunku zmienne warunku (typ condition) są wewnętrznymi zmiennymi monitora udostępniającymi na zewnątrz operacje: wait(c) protokół wejścia do monitora, jeśli wejście zamknięte wątek jest usypiany na zmiennej warunku c empty(c) informacja czy na zmiennej c oczekują jakieś wątki signal(c) obudzenie jednego z wątków czekających na wejście do monitora lub otwarcie wejścia do monitora Krzysztof Banaś Programowanie równoległe i rozproszone 11

Monitory przykład Rozwiązanie problemu czytelników i pisarzy za pomocą monitorów Zakładamy, że system uruchamia dowolną liczbę procesów realizujących programy czytelników i pisarzy Pisarze wykonują operację piszę jednak, żeby program był poprawny poprzedzają ją protokołem wejścia chcę_pisać i kończą protokołem wyjścia koniec_pisania Podobnie czytelnicy wykonują sekwencję operacji: chcę_czytać czytam koniec_czytania Rozwiązanie polega na umieszczeniu wszystkich procedur zarządzających (chcę_pisać, koniec_pisania, chcę_czytać, koniec_czytania) w monitorze o nazwie Czytelnia Krzysztof Banaś Programowanie równoległe i rozproszone 12

Monitory przykład monitor Czytelnia { int liczba_czyt = 0; int liczba_pisz = 0; condition czytelnicy, pisarze; chcę_czytać(){ JEŻELI( liczba_pisz > 0 lub ~empty( pisarze ) ) wait( czytelnicy ); liczba_czyt ++; signal( czytelnicy ); } koniec_czytania(){ liczba_czyt --; JEŻELI( liczba_czyt = 0 ) signal( pisarze ); } Krzysztof Banaś Programowanie równoległe i rozproszone 13

Monitory przykład } chcę_pisać(){ JEŻELI( liczba_czyt+liczba_pisz > 0 ) wait( pisarze ); liczba_pisz ++; } koniec_pisania(){ liczba_pisz --; JEŻELI( ~empty( czytelnicy ) ) signal( czytelnicy ); WPP signal( pisarze ) } Krzysztof Banaś Programowanie równoległe i rozproszone 14

Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie wątkami operacje atomowe (wiele standardowych operacji na referencjach, zmiennych typów wbudowanych, operacje na zmiennych deklarowanych jako volatile, a także specjalne operacje takie jak np. compareandset, getandincrement itp.) mechanizmy synchronizacji (zamki, zmienne warunku i inne charakterystyczne dla funkcjonowania obiektów) klasy kontenerowe przystosowane do współbieżnego używania, takie jak: BlockingQueue, ConcurrentMap itp. Krzysztof Banaś Programowanie równoległe i rozproszone 15

Wątki w Javie Podstawowe metody klasy Thread (pakiet java.lang) void start() polecenie dla JVM uruchomienia metody run void run() uruchomienie metody run przekazanego obiektu implementującego interfejs Runnable (jeśli nie została przeciążona) static void sleep(long millis) uśpienie bieżącego wątku na określony czas void join(long millis), void join() oczekiwanie na zakończenie wątku void interrupt() przerwanie działania wątku (dokładniej ustawienie sygnalizatora przerwania przerwanie następuje jeśli wątek znajduje się wewnątrz metody dającej się przerwać, np. sleep, join, wait lub jeśli w trakcie realizacji wątku wywołana jest metoda: static boolean interrupted() sprawdzenie stanu sygnalizatora przerwania (dla bieżącego wątku) później powinna znajdować się reakcja wątku na próbę przerwania, np. zwrócenie wyjątku InterruptedException Krzysztof Banaś Programowanie równoległe i rozproszone 16

Wątki w Javie Nie tylko każdy obiekt w Javie może funkcjonować jak monitor, ale także dla każdego obiektu Javy możemy wywołać funkcje typowe dla zmiennych warunku: wait() tym razem bez argumentów, jedyną identyfikacją miejsca oczekiwania jest fakt wystąpienia w danym obiekcie notify() obudzenie jednego z wątków oczekujących w danym obiekcie (tak jak signal) notifyall() obudzenie wszystkich wątków oczekujących w danym obiekcie (tak jak broadcast) Powyższe funkcje zdefiniowane są w klasie Object, po której dziedziczy każda z klas Javy W pakiecie java.util.concurrency zdefiniowane są standardowe zmienne warunku (typ condition) Krzysztof Banaś Programowanie równoległe i rozproszone 17

Java obiekt jako monitor przykład public class Pojemnik { private boolean pusty = true; public synchronized /* dane */ wyjmij() { while (pusty) { try { wait(); // oczekujemy gdzie? w obiekcie! } catch (InterruptedException e) { /* reakcja na przerwanie */ } }... // pobierz_dane pusty = true; notifyall(); // budzimy wszystkie wątki oczekujące w obiekcie } Krzysztof Banaś Programowanie równoległe i rozproszone 18

Java obiekt jako monitor przykład public synchronized void wloz( /* dane */ ) { while (!pusty) { try { wait();// funkcja wait nie posiada identyfikatora miejsca // oczekiwania, dlatego zalecane jest umieszczenie // jej w pętli sprawdzającej warunek! } catch (InterruptedException e) {} }... // umieść_dane pusty = false; notifyall(); // nie ma określonego miejsca oczekiwania budzimy } // wszystkie watki! } Krzysztof Banaś Programowanie równoległe i rozproszone 19

Java obliczenia masowo równoległe Dotychczas omówione mechanizmy ukierunkowane były głównie na przetwarzanie wielowątkowe z mała liczbą zadań Dla masowej równoległości Java posiada specjalne udogodnienia: pule wątków (thread pool) i interfejsy wykonawców (executor) Konkretna pula wątków (obiekt klasy ThreadPoolExecutor ) realizuje zarządzanie dostarczonymi zadaniami (obiektami implementujacymi interfejs Runnable lub Callable), które może obejmować: uruchamianie, zatrzymywanie, sprawdzanie stanu itp. Uruchamianie zadań w ramach wykonawców posiada mniejszy narzut niż uruchamianie nowych wątków (klasy Thread) Krzysztof Banaś Programowanie równoległe i rozproszone 20

Pula wątków Krzysztof Banaś Programowanie równoległe i rozproszone 21

Work stealing Krzysztof Banaś Programowanie równoległe i rozproszone 22

Pule wątków Najprostsze zadania (interfejs Runnable) nie zwracają wyniku Interfejs Callable umożliwia definiowanie zadań zwracających wynik Do przekazywania wyników z obiektów Callable i sprawdzania zakończenia działania obiektów Runnable służą obiekty Futures interfejs Futures jest parametryzowany typem zwracanego wyniku interfejs Futures definiuje funkcje do: sprawdzania czy zadanie zostało zakończone oczekiwania na zakończenie zadania i pobierania wyniku realizacji zadania zapisanego w obiekcie Futures anulowania zadań i sprawdzania czy zostały anulowane Krzysztof Banaś Programowanie równoległe i rozproszone 23