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

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

Język Java wątki (streszczenie)

Wątki w Javie. Piotr Tokarski

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

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

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

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.

Język Java wątki (streszczenie)

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

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

Programowanie współbieżne i rozproszone

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

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

Programowanie komputerów

Współbieżność w Javie

Współbieżność w Javie

Interfejsy i klasy wewnętrzne

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

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

Kurs programowania. Wykład 8. Wojciech Macyna

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

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

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

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

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Język Java część 2 (przykładowa aplikacja)

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

Podstawy współbieżności

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

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

4. Procesy pojęcia podstawowe

Procesy, wątki i zasoby

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

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Technologie i usługi internetowe cz. 2

4. Procesy pojęcia podstawowe

dr Krzysztof Podlaski

Monitory. Jarosław Kuchta

Wstęp do Java. Operacje Wejścia-Wyjścia Programowanie Wielowątkowe. dr Krzysztof Podlaski. Wydział Fizyki i Informatyki Stosowanej

Java Podstawy. Michał Bereta

Język Java część 2 (przykładowa aplikacja)

Struktura i funkcjonowanie komputera pamięć komputerowa, hierarchia pamięci pamięć podręczna. System operacyjny. Zarządzanie procesami

Programowanie obiektowe

Zarządzanie procesami i wątkami

Systemy operacyjne III

Java. Programowanie Obiektowe Mateusz Cicheński

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe

Wstęp do programowania 2

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

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

Zaawansowane programowanie w C++ (PCP)

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

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

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

Lab 9 Podstawy Programowania

Procesy i wątki. Blok kontrolny procesu. Proces. Proces - elementy. Stan procesu

Multimedia JAVA. Historia

Proces y i y w i ąt ą ki

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

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

PHP 5 język obiektowy

Systemy operacyjne. Zajęcia 11. Monitory

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: kilka brakujących szczegółów i uniwersalna nadklasa Object

Dokumentacja do API Javy.

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

Wykład 8: klasy cz. 4

Programowanie obiektowe

Zaawansowane aplikacje internetowe

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco

Szablony klas, zastosowanie szablonów w programach

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Programowanie obiektowe

Podstawy obiektowości

Języki i techniki programowania Ćwiczenia 2

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Systemy operacyjne III

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

1.1 Definicja procesu

Ćwiczenie 1. Przygotowanie środowiska JAVA

Projektowanie aplikacji internetowych laboratorium

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

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

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

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Java EE produkcja oprogramowania

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Programowanie obiektowe

Struktura systemu operacyjnego. Opracował: mgr Marek Kwiatkowski

Metody obsługi zdarzeń

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Transkrypt:

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

Uruchomienie programu powoduje stworzenie nowego procesu przez system operacyjny. Proces wykonywany program wraz z dynamicznie przydzielanymi mu zasobami (pamięć, pliki) i/lub innymi kontekstami wykonania procesu. Kontekst (procesu) minimalny zestaw danych używanych przez proces, które muszą być zapisane, aby umożliwić przerwanie procesu i jego wznowienie w bliżej nieokreślonym momencie czasu. Wątek sekwencja działań, która może wykonywać się równolegle z innymi w obrębie danego procesu. Program składa się z jednego lub wielu wątków. Równoległość w ramach jednego procesu osiągana jest przez uruchamianie kilku różnych wątków. Wielowątkowość vs. Wielozadaniowość czym to się różni?

Każdy wątek uzyskuje dostęp do procesora na krótki czas*, po czym udostępnia procesor innemu wątkowi. Zmiany te są tak szybkie, że ponownie mamy wrażenie równoległego wykonania. Przydzielanie wątkowi czasu procesora może się odbywać w dwóch trybach: Współpracy wątek sam decyduje kiedy oddać czas procesora innym wątkom, Wywłaszczania o dostępnie wątków do procesora decyduje systemowy zarządca wątków. Przydziela on kwant czasu procesora danemu wątkowi, po upłynięciu którego przydziela zazwyczaj taki sam kwant czasu innemu wątkowi. Różne systemy operacyjne stosują różne mechanizmu udostępniania wątków czasu procesora, więc należy zakładać, że mogą one działać zarówno w środowisku współpracy jak i wywłaszczania (możliwe jest nawet połączenie obu naraz). * Dla jednego procesora (1-rdzeniowego)

Zarządzaniem wątkami w Javie zajmuje się klasa Thread. Aby uruchomić nowy wątek należy wywołać metodę start() obiektu klasy Thread. Klasa wykorzystująca wątki musi implementować interfejs Runnable zawiera on metodę run() określającą co dany wątek ma robić. Klasa Thread implementuje interfejs Runnable. Występują dwie możliwości tworzenia wątków w Javie: Dziedzicząc po klasie Thread. Implementując interfejs Runnable.

1. Zdefiniować klasę dziedziczącą po Thread 2. Zredefiniować odziedziczoną metodę run(), podając kod który ma się wykonywać w nowym wątku. 3. Stworzyć obiekt zdefiniowanej w pkt. 1 klasy. 4. Wywołać na rzecz tego obiektu metodę start().

Prosta klasa testująca: Wynik: Proszę zmodyfikować kod klasy Czasomierz, tak aby zamienił się w minutnik (zliczał od tyłu, podaną przez użytkownika liczbę minut)

Proszę zmodyfikować kod quizu tak by kod całego programu mieścił się w jednej klasie (bez wykorzystania klasy czasomierz). W okienkach komunikatów proszę pokazać informacje o aktualnym w momencie otwarcia okna stanie licznika czasu. Przed zakończeniem programu podać w okienku ile trwało wypisywanie stolic. http://www.tomaszx.pl/materialy/ztp_lab4_quiz.zip

1. Zdefiniować klasę implementującą interfejs Runnable. 2. Zdefiniować w niej metodę run(). 3. Utworzyć obiekt klasy z pkt. 1. 4. Utworzyć obiekt klasy Thread, przekazując w konstruktorze referencję do obiektu utworzonego w pkt. 3. 5. Wywołać na rzecz obiektu klasy Thread metodę start().

Przedstawiony sposób ma dwie wyraźne zalety: Lepsza separacja kodu Czasem jest jedyną możliwością (jak już dziedziczymy po innej klasie niż Thread).

Inne metody klasy nie były modyfikowane. Zmieniła się lekko metoda start(), a z metody stop() zniknęło zatrzymanie timera.

Wydaje się, że wszystko w porządku

A co jeśli zatrzymamy samochód po np. 5 sekundach? Czas dalej upływa Mimo iż wymusiliśmy stop samochodu

Wątek kończy się, gdy zostanie zakończona metoda run(). Aby programowo zakończyć wątek, należy dodać sprawdzanie odpowiednich warunków końca do metody run(), które to warunki mogą być modyfikowane przez inne wątki. Wyjście z metody run() można zrealizować przez odpowiednio dobrane bloki instrukcji warunkowych lub z zastosowaniem słowa kluczowego return.

Wykorzystamy kilka metod z klasy Thread. konstruktor Thread(Runnable, String) dzieki czemu każdemu wątkowi można nadać unikalną nazwę. Statyczną metodę currentthread() zwracającą referencję do bieżącego wątku. Metodę getname(), która zwraca nazwę wątku.

Kod testujący: Wynik:

Jaki będzie wynik? A innym razem tak:

liczba = 0; Wątek1: liczba++ //liczba = 1 Wątek1 jest wywłaszczony (jest przerywany) Wątek2: liczba++ //liczba = 2 Wątek2 jest wywłaszczony (jest przerywany) Wątek1: liczba-- //liczba = 1 Wątek1: Zwraca wynik 1 Wątek1 kończy działanie. Procesor zostaje przydzielony wątkowi2. Wątek2: liczba-- //liczba = 0 Wątek2: Zwraca wynik 0 Wątek2 kończy działanie.

Synchronizowane mogą być metody oraz bloki. Metoda synchronizowana oznaczana jest w deklaracji słowem synchronized. synchronized void metoda() { } Kiedy dany wątek wywołuje na rzecz jakiegoś obiektu metodę synchronizowaną, automatycznie zamykany jest rygiel obiekt jest zajmowany przez wątek. Inne wątki usiłujące wywołać na rzecz tego obiektu jakąkolwiek metodę synchronizowaną lub wykonać instrukcję synchronized z odniesieniem do zaryglowanego obiektu są blokowane i czekają, aż wątek który zajął obiekt zakończy działanie. I po problemie

Bloki synchronizowane wprowadzane są instrukcją synchronized z podaną jako parametr referencją do obiektu który ma być zaryglowany. synchronized (obiekt) { //jakiś kod } Wykonanie instrukcji synchronized przez wątek rygluje obiekt, do którego referencja podana jest jako parametr tej instrukcji. Inne wątki, które usiłują operować na tym obiekcie za pomocą metod synchronizowanych lub wykonać instrukcję synchronized z referencją do tego obiektu są blokowane, aż wątek blokujący obiekt nie zakończy działania. Bloki synchronizowane są ogólniejsze od metod synchronizowanych i można za ich pomocą synchronizować dowolne fragmenty kodu wewnątrz metod.

Takie rozwiązanie: jest lepsze od poprzedniego, ponieważ ryglowanie obiektu a odbywa się tylko tyle razy ile jest wątków, a nie tyle ile jest powtórzeń pętli for jak z wykorzystaniem metody synchronizowanej.

Gdy ważna jest kolejność wykonywanych działań przez wątki, skoordynowanie ich interakcji między sobą uzyskuje się za pomocą metod wait, notify, notifyall klasy Object. Koordynacja powinna przebiegać według schematu: 1. Wątek wywołuje metodę wait na rzecz danego obiektu, gdy oczekuje, że ma się coś zdarzyć (np. jakieś pole obiektu zmieni swoją wartość). 2. Wywołanie wait blokuje wątek (odsuwany od CPU) i jednocześnie powoduje otwarcie rygla zajętego przez niego obiektu, umożliwiając dostęp do obiektu innym wątkom. Wait może być wywołana tylko z sekcji krytycznej. 3. Odblokowanie następuje, gdy inny wątek wywoła metodę notify lub notifyall (która odblokowuje wszystkie czekające na danym obiekcie wątki) na rzecz określonego wcześniej obiektu. Wywołanie notify lub notifyall musi być zawarte w sekcji krytycznej.

Wątki czekają na siebie. Wątek pobierający musi czekać, aż wątek ustawiający nada wartość. Metody wait() i notify() są wywoływane na rzecz tego obiektu, na rzecz którego zostały wywołany get i set. Wprowadzono nową zmienną informującą czy dokonano zmiany wartości jest to zgodne z ogólnym schematem postępowania.

Każdy obiekt posiada też kolejkę oczekiwania. Kolejka zawiera odniesienia do wszystkich wątków zablokowanych na obiekcie. Kolejka oczekiwania jest zarządzana przez JVM i można ją modyfikować tylko przez odpowiednie wywołanie metod wait, notify, notifyall z klasy Object lub interrupt (z klasy Thread). Byty posiadające rygle i kolejki nazywane są monitorami, zatem w Javie każdy obiekt jest monitorem.

Wątek ogólnie rzecz biorąc może się znajdować w jednym z czterech stanów: New, Runnable (ready-to-run), NotRunnable (agregujący stany Waiting, Sleeping, Blocked) oraz Dead.

Obecnie wykorzystywany jest mechanizm waitnotify. Użycie metody interrupt() z klasy Thread powoduje ustalenie statusu wątku jako przerwany (pod warunkiem, że nie zostanie wygenerowany wyjątek). Nie jest to równoznaczne ze wprowadzeniem wątku do stanu Dead. Kiedy wątek ze statusem przerwany zostanie zablokowany przez wywołanie metod wait(), sleep(), join() jego status jest zmieniany na nieprzerwany i generowany jest wyjątek.

Co się stanie jeśli w metodzie run() zawrzemy pętle wykonującą się 10 milionów razy? Czy inny wątek w trakcie działania tej pętli będzie miał szanse na dostęp do procesora? Wątek zawłaszczający nazywany jest samolubnym, a wątek bez szans na dostęp do procesora wątkiem zagłodzonym. Jak to rozwiązać? Można nadawać wątkom różne priorytety za co odpowiada metoda setpriority(). Można liczyć, że systemowe wywłaszczanie zadziała tak jak tego oczekujemy (co nie zawsze ma miejsce). Rozwiązanie właściwe zapewnić dobrowolne wywłaszczanie się wątków: Za pomocą metody sleep(). Zastosowanie metody yield() powoduje ona oddanie czasu procesora innemu oczekującemu wątkowi.

Zakleszczenie jest pojęciem opisującym sytuację, w której co najmniej dwie różne akcje czekają na siebie nawzajem, więc żadna nie może się zakończyć. Rozwiązanie: Odpowiednie Projektowanie Programów.

1. Zmodyfikować kod Quizu o stolicach tak, aby pytania mogły być dowolne (nie tylko o stolice). Dodać w dialogu informacje na ile pytań odpowiedziano dotąd poprawnie i ile jeszcze zostało. http://www.tomaszx.pl/materialy/ztp_lab4_quiz.zip 2. Zmodyfikować klasy Ustaw i Pobierz tak aby Ustaw generował losowo zdania, na podstawie dużej tablicy słów (słowa mają być pobierane z pliku tekstowego). http://www.tomaszx.pl/materialy/ztp_lab4_koordynacja.zip

1. Przetestuj kod znajdujący się pod adresem: http://www.tomaszx.pl/materialy/ztp_lab4_test.zip W jakich stanach wątek jest aktywny? Czy któraś metoda generuje wyjątek? Przerywnik humorystyczny