Jarosław Kuchta Monitory.

Slides:



Advertisements
Podobne prezentacje
Systemy czasu rzeczywistego
Advertisements

Wstęp do strumieni danych
C++ wykład 2 ( ) Klasy i obiekty.
Podstawowe pojęcia programowania współbieżnego
Mechanizmy pracy równoległej
Jarosław Kuchta Semafory.
Klasyczne problemy współbieżności i ich rozwiązania
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Klasy i obiekty.
Wzorce.
Dynamiczne struktury danych Listy, Kolejki, Stosy
Static, const, volatile.
Systemy rozproszone W. Bartkiewicz Wykład 9. Wprowadzenie do koordynacji programów współbieżnych.
Semafory Autorzy : Michał Winciorek Łukasz Jackowicz.
SYSTEMY OPERACYJNE PROCESY I WĄTKI
SYSTEMY OPERACYJNE SYNCHRONIZACJA PROCESÓW
ZŁOŻONOŚĆ OBLICZENIOWA
Instrukcje Instrukcja : definicja obliczenia i określenie sposobu wykonania tego obliczenia. Program : ciąg instrukcji wykonywanych kolejno od pierwszej.
Systemy operacyjne Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do informatyki.
Programowanie imperatywne i język C
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
SEMAFORY Dominik Niewiadomy Łukasz Dąbrowski.
Programowanie wielowątkowe
Wykład nr 7: Synchronizacja procesów
Systemy operacyjne Wykład nr 4: Procesy Piotr Bilski.
Wykład nr 2: Struktura systemu komputerowego a system operacyjny
Gniazda komunikacji sieciowej w języku Java
Zdarzenia w programach VI (zdarzenia rejestrowane dynamicznie)
Język Java Wielowątkowość.
6. SZEREGOWANIE PROCESÓW
Muteksy Muteksy (mutex – MUTual EXclusion) są prostymi obiektami synchronizacyjnymi pełniącymi rolę semaforów binarnych dla wątków (chroniącymi sekcje.
Semafory według normy POSIX
RODZAJE KOMUNIKACJI MIĘDZY PROCESAMI
Semafory.
Wątki.
C# Windows Forms Zastosowania Informatyki Wykład 3
Podstawy C# Grupa .NET PO.
Podstawy programowania
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
PIO 3_2, Zofia Kruczkiewicz1 Wykład 3 – część druga Iteracyjno-rozwojowy cykl oprogramowania 3.
PHP: warunki, pętle, switch, break, continue
Architektura aplikacji wielowątkowych Jakub Binkowski.
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Problem sekcji krytycznej
C# Platforma .NET CZ.3 Kuba Ostrowski.
1 Strumienie Hierarchie klas strumieniowych, strumienie bajtowe - klasy InputStream i OutputStream i ich metody, klasa File, strumienie plikowe, strumienie.
Wykład 7 Synchronizacja procesów i wątków
Bariery synchronizacyjne Bariery są obiektami synchronizacyjnymi pakietu pthread służącymi do wyrównywania czasów pracy wątków wykonujących wspólne zadanie.
Kurs języka C++ – wykład 4 ( )
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
1 Zagadnienia na egzamin. 2 Język C podsumowanie Struktura programu w języku C Zmienne, Stałe Operacje arytmetyczne Operatory logiczne Priorytety operatorów.
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
Systemy Operacyjne Synchronizacja
Model współbieżności w Javie
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie wielowątkowe w Javie Wykład 9 mgr inż. Michał Misiak.
Paweł Starzyk Obiektowe metody projektowania systemów
Programowanie imperatywne i język C Copyright, 2007 © Jerzy R. Nawrocki Wstęp do.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
Wstęp do programowania Wykład 7
Asocjacja,Kompozycja,Agregacja
PHP (wstęp) Personal Home Page Tools (PHP Tools)
Wątki, programowanie współbieżne
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
ALGORYTMY I STRUKTURY DANYCH
Tworzenie wątków w Javie
Zapis prezentacji:

Jarosław Kuchta Monitory

Co to jest monitor Monitor to zebrane w jednej konstrukcji programowej zmienne i operacje na tych zmiennych. Część tych operacji jest udostępnianych na zewnątrz monitora. Tylko udostępnione operacje umożliwiają działanie na zmiennych. Wykonanie operacji monitora jest sekcją krytyczną wykonującego ją procesu. Wewnątrz monitorowanej operacji istnieje możliwość wstrzymywania i wznawiania procesów.

Szczegóły zmienna c typu contition operacje: umożliwia wstrzymywanie / wznawianie procesów posiada własną kolejkę procesów operacje: wait(c) – powoduje wstrzymanie procesu wykonującego tę operację; proces jest wstawiany na koniec kolejki właściwej dla zmiennej c; monitor jest zwalniany signal(c) – powoduje wznowienie wstrzymanego procesu; wznawiany jest pierwszy proces z kolejki właściwej dla zmiennej c; proces ten czeka, aż proces wywołujący tę operację zwolni monitor empty(c) – funkcja sprawdzająca, czy kolejka właściwa dla zmiennej c nie jest pusta

Przechodzenie procesów przez monitor Monitor M kolejka wejściowa kolejka procesów oczekujących na C void P(float x) { … wait (C); signal (C); } M.P(1.0) kolejka procesów wstrzymanych po signal

Przykłady Wzajemne wykluczanie Producenci i konsumenci Czytelnicy i pisarze Pięciu filozofów

Wzajemne wykluczanie static class Wykluczanie: Monitor { public static void Dostęp() Enter (this); // Działanie na zasobach Exit (this); } class ProcesGłówny { void Działaj() // własne sprawy Wykluczanie.Działaj(); }

Producenci i konsumenci Monitor Bufor; Object Producenci = new Object(); Object Konsumenci = new Object(); const int N=10; Dane[] bufor = new Dane[N]; int n=0; int i = 0; int j = 0; void Produkuj (Dane element) { if (n == N) Bufor.Wait (Producenci); n = n + 1; bufor[ i] = element; i = (i+1) % N; Bufor.Signal (Konsumenci); } void Konsumuj (out Dane element) { if (n == 0) Bufor.Wait (Konsumenci); n = n – 1; element = bufor [j]; j = (j+1) % N; Bufor.Signal (Producenci); }

Czytelnicy i pisarze (z możliwością zagłodzenia pisarza) class Czytelnia: Monitor { Object Czytelnicy = new Object(); Object Pisarze = new Object(); int ile_czyta = 0; int ile_pisze = 0; void Początek_Pisania() { if (ile_czyta + ile_pisze > 0) Wait (Pisarze); ile_pisze = 1; } void Początek_Czytania() { if (ile_pisze > 0) Wait (Czytelnicy); ile_czyta++; } void Koniec_Pisania() { ile_pisze = 0; if (!Empty(Pisarze) Signal (Pisarze) else do Signal (Czytelnicy) while (!Empty(Czytelnicy)) } void Koniec_Czytania() { ile_czyta--; if (ile_czyta == 0) Signal (Pisarze); }

Czytelnicy i pisarze (rozwiązanie poprawne) class Czytelnia: Monitor { Object Czytelnicy = new Object(); Object Pisarze = new Object(); int ile_czyta = 0; int ile_pisze = 0; void Początek_Pisania() { if (ile_czyta + ile_pisze > 0) Wait (Pisarze); ile_pisze = 1; } void Początek_Czytania() { if (!Empty(Czytelnicy) || ile_pisze > 0) Wait (Czytelnicy); ile_czyta++; } void Koniec_Pisania() { ile_pisze = 0; if (!Empty(Pisarze) Signal (Pisarze) else do Signal (Czytelnicy) while (!Empty(Czytelnicy)) } void Koniec_Czytania() { ile_czyta--; if (ile_czyta == 0) Signal (Pisarze); }

Pięciu filozofów (przymiarka pierwsza) class Pałeczki: Monitor { int [] wolne = new int[] { 2, 2, 2, 2, 2}; object [] Filozof = new object[5]; void Biorę(int i) { while (wolne [i] < 2) Wait (Filozof [i]); wolne [(i–1 ) % 5] = wolne [(i–1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1; } void Odkładam(int i) { wolne [(i–1) % 5] = wolne [(i–1) % 5] + 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] + 1; Signal (Filozof[(i–1) % 5]); Signal (Filozof[(i+1) % 5]); }

Pięciu filozofów (przymiarka druga) class Pałeczki: Monitor { int [] wolne = new int[] { 2, 2, 2, 2, 2}; object [] Filozof = new object[5]; void Biorę(int i) { while (wolne [i] < 2) Wait (Filozof [i]); wolne [(i–1 ) % 5] = wolne [(i–1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1; } void Odkładam(int i) { wolne [(i–1) % 5] = wolne [(i–1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1; if (wolne[(i-1) % 5] == 2) Signal (Filozof[(i–1) % 5]); if (wolne[(i+1) % 5] == 2) Signal (Filozof[(i+1) % 5]); }

Pięciu filozofów (rozwiązanie poprawne) class Pałeczki: Monitor { bool [] zajęta = new bool[5]; object [] Pałeczka = new object[5]; object Lokaj = new object(); int ile_je = 0; void Biorę(int i) { if (ile_je == 4) Wait (Lokaj); ile_je ++; if (zajęta [i]) Wait (Pałeczka [i]); zajęta[ i] = true; if (zajęta[(i+1) % 5]) Wait (Pałeczka [(i+1) % 5]); zajęta[(i+1) % 5] = true; } void Odkładam(int i) { zajęta [i] = false; Signal (Pałeczka[i]); zajęta [(i+1) % 5] = false; Signal (Pałeczka[(i+1) % 5]); ile_je --; Signal (Lokaj); }

Implementacje Monitora Zmienne warunkowe z blokowaniem Zmienne warunkowe bez blokowania Monitory z niejawnym warunkiem

Zmienne warunkowe z blokowaniem (monitor Hoara) wątek powiadamiający jest blokowany do czasu, aż powiadomiony wątek oczekujący nie opuści monitora lub nie zatrzyma się w ponownym oczekiwaniu na warunek. dwie główne kolejki wątków: e - kolejka wejściowa s - kolejka wątków powiadamiających każda zmienna warunkowa c posiada własną kolejkę c.q wątków oczekujących na spełnienie warunku. enter e s a.q wait(a) signal b.q wait(b) exit

Zmienne warunkowe bez blokowania (monitor Massy) operacja signal nie powoduje opuszczenia monitora wątek oczekujący jest przenoszony do kolejki e, aby zaczekać, aż wątek powiadamiający zakończy swoje zadanie kolejka s jest niepotrzebna operacja signal nazywa się teraz notify enter notified e notified wait(b) b.q a.q wait(a) exit

Monitory z niejawnym warunkiem W języku Java każdy obiekt może stać się monitorem metody wykluczane są oznaczone słowem kluczowym synchronized. monitor ma kolejkę wejściową i pojedynczą kolejkę wszystkie operacje dotyczą tej jednej kolejki (najwyżej jeden warunek) enter e notified wait q exit

Klasa Monitor w C# (1) public static class Monitor public static void Enter (Object obj) – wejście do monitora public static bool TryEnter (Object obj) public static bool TryEnter (Object obj, int millisecondsTimeout) public static bool TryEnter (Object obj, TimeSpan timeout) public static void Exit (Object obj) – wyjście z monitora

Klasa Monitor w C# (2) public static bool Wait (Object obj) – oczekiwanie public static bool Wait (Object obj, int millisecondsTimeout) public static bool Wait(Object obj, TimeSpan timeout) public static bool Wait (Object obj, int millisecondsTimeout, bool exitContext) public static bool Wait( Object obj, TimeSpan timeout, bool exitContext ) public static void Pulse (Object obj) – sygnalizacja public static void PulseAll (Object obj) – sygnalizacja do wszystkich