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



Podobne dokumenty
Programowanie równoległe i rozproszone. W1. Wielowątkowość. 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

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

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

Monitory. Jarosław Kuchta

Problemy współbieżności

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

Systemy operacyjne. Zajęcia 11. Monitory

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

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

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

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

synchronizacji procesów

synchronizacji procesów

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

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

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

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

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

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

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

Programowanie Równoległe i Rozproszone

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

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

Język Java wątki (streszczenie)

Podstawy współbieżności

Wielowątkowy serwer TCP

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

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

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

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

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

Kurs programowania. Wykład 8. Wojciech Macyna

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

Synchronizacja procesów

Wstęp do programowania 2

Język Java wątki (streszczenie)

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

Współbieżność w Javie

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

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

Wprowadzenie do programowania współbieżnego

Współbieżność w Javie

Synchronizacja procesów i wątków

Wątki w Javie. Piotr Tokarski

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

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

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

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

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

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

Systemowe mechanizmy synchronizacji procesów

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Systemy Rozproszone - Ćwiczenie 4

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

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

Model pamięci. Rafał Skinderowicz

Mechanizmy pracy równoległej. Jarosław Kuchta

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

Ingerencja w kod systemu operacyjnego (przerwania) Programowanie na niskim poziomie (instrukcje specjalne) Trudności implementacyjne (alg.

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

Przeplot. Synchronizacja procesów. Cel i metody synchronizacji procesów. Wątki współbieżne

Monitory. Wady semafora

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

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

Programowanie współbieżne Laboratorium nr 12

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

Klasyczne problemy współbieżności. Problem producenta i konsumenta Problem czytelników i pisarzy Problem pięciu filozofów

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

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

Klient-Serwer Komunikacja przy pomocy gniazd

Programowanie obiektowe

Programowanie aplikacji równoległych i rozproszonych. Wykład 1

Wykład 8: klasy cz. 4

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Nazwa Wydziału Nazwa jednostki prowadzącej moduł Nazwa modułu kształcenia Kod modułu Język kształcenia Efekty kształcenia dla modułu kształcenia

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

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie komputerów

Zaawansowany kurs języka Python

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Zaawansowane programowanie w C++ (PCP)

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

Multimedia JAVA. Historia

Klasy abstrakcyjne, interfejsy i polimorfizm

Systemy operacyjne. Studia podyplomowe Wydział Informatyki PB

Dokumentacja do API Javy.

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

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

3URJUDPRZDQLHZVSyáELH*QHZVWS

Programowanie obiektowe

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

Programowanie obiektowe

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

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Transkrypt:

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

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 2

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 3

Wykorzystanie zmiennych warunku Schemat rozwiązania problemu producenta i konsumenta procedura główna pthread_mutex_t muteks= PTHREAD_MUTEX_INITIALIZER; pthread_cond_t nie_pelny, nie_pusty; // należy także zainicjować int main(){ pthread_t producent, konsument; zasob *fifo; fifo = inicjuj_zasob(); // zasob zawiera bufor do zapisu i odczytu // interfejs zasobu: inicjuj_zasob(), zasob_pelny(), zasob_pusty() // zasob_wstaw(...), zasob_pobierz() 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 4

Wykorzystanie zmiennych warunku procedura producenta void *produkuj( void *q){ zasob *fifo; int i; fifo = (zasob *)q; // zasob zawiera bufor do zapisu i odczytu for(...){ pthread_mutex_lock (&muteks); while( zasob_pelny(fifo) ) pthread_cond_wait(&nie_pelny, &muteks ); zasob_wstaw(fifo,...); pthread_mutex_unlock( &muteks ); pthread_cond_signal( &nie_pusty ); Krzysztof Banaś Programowanie równoległe i rozproszone 5

Wykorzystanie zmiennych warunku procedura konsumenta void *konsumuj( void *q){ zasob *fifo; int i, d; fifo = (zasob *)q; // zasob zawiera bufor do zapisu i odczytu for(...){ pthread_mutex_lock (&muteks); while( zasob_pusty(fifo) ) pthread_cond_wait(&nie_pusty, &muteks); zasob_pobierz(fifo,...); pthread_mutex_unlock( &muteks ); pthread_cond_signal( &nie_pelny ); Krzysztof Banaś Programowanie równoległe i rozproszone 6

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 7

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 8

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 9

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 10

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 11

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 12

Wątki w Javie 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 13

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 14

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 15

Zamki odczytu/zapisu Alternatywą dla stosowania konstrukcji programistycznych może być wykorzystanie gotowych API zaprojektowanych do rozwiązania konkretnych problemów wykonania współbieżnego: przykład: zamki odczytu/zapisu (read/write locks) do rozwiązania problemu czytelników i pisarzy Zamki odczytu i zapisy są konstrukcją uwzględnioną w nowszym standardzie POSIX (2001), który wprowadza m.in. funkcje: pthread_rwlock_init (tworzenie zamków na podstawie odpowiednich obiektów z atrybutami), pthread_rwlock_destroy pthread_rwlock_rdlock zamknięcie do odczytu (istnieje też wersja pthread_rwlock_tryrdlock) pthread_rwlock_wrlock zamknięcie do zapisu (wersja: pthread_rwlock_trywrlock) pthread_rwlock_unlock otwarcie zamka Krzysztof Banaś Programowanie równoległe i rozproszone 16