Wstęp do programowania 2
Transkrypt
Wstęp do programowania 2
Wstęp do programowania 2 wykład 10 Zadania Agata Półrola Wydział Matematyki UŁ 2005/2006 http://www.math.uni.lodz.pl/~polrola Współbieżność dotychczasowe programy wykonywały akcje sekwencyjnie Ada umożliwia również pisanie programów, w których program wykonuje kilka sekwencji akcji równolegle Każda sekwencja akcji jest wykonywana przez inne zadanie (task) Programy wielozadaniowe Programy z wieloma zadaniami mogą być wykonywane zarówno na komputerze o wielu procesorach, jak i o jednym procesorze Komputer z wieloma procesorami każdy procesor może wykonywać równocześnie inne zadanie (ang. overlapped concurrency) W przypadku komputerów z jednym procesorem zadaniom przydziela się kolejno czas procesora (ang. interleaved concurrency) w każdym przypadku możemy uważać, że każde zadanie korzysta z odrębnego wirtualnego procesora Po co współbieżność Współbieżność jest bardziej naturalnym podejściem niż wykonanie sekwencyjne np. w przypadku modelowania rzeczywistości programów do analizy danych z kilku urządzeń monitorujących programów nadzorujących pracę kilku urządzeń Dodatkowa zaleta: obliczeniowe programy współbieżne mogą dać wynik szybciej niż sekwencyjne jest to możliwe nawet w przypadku jednego procesora (jedno zadanie wykonuje się, inne czeka na operacje I/O) Wykonanie zadań Różne procesory mogą wykonywać zadania z różną prędkością W ogólnym przypadku nie można nic założyć o relatywnej prędkości wykonywania zadań (zadania wykonują się asynchronicznie) Zadania, które mają współdziałać, muszą synchronizować się ze sobą Mechanizmy synchronizacji Ada zawiera trzy mechanizmy umożliwiające synchronizację i wzajemną komunikację zadań: zmienne dzielone (ang. shared variables) obiekty chronione (ang. protected objects) randki (spotkania) (ang. rendezvous) zmienna dzielona – zmienna która może być sprawdzana lub modyfikowana przez więcej niż jedno zadanie zadania powinny zawierać synchronizację dostępu do zmiennych, aby uniknąć sytuacji, w której jedno zadanie czyta zmienną, a drugie ją równocześnie modyfikuje obiekt chroniony służy do przechowywania danych wykorzystywanych przez więcej niż jedno zadanie na obiekcie można wykonywać tylko pewne operacje, jeśli jedno zadanie wykonuje operację modyfikującą obiekt chroniony, to inne zadania muszą czekać na dostęp do obiektu do czasu jej zakończenia randka (spotkanie) jest rodzajem interakcji, w której zadania synchronizują się i jedno z nich wykonuje pewną „usługę” na rzecz drugiego. Komunikacja następuje za pomocą działania podobnego do wywołania procedury jeśli jedno z zadań będzie gotowe do wykonania tej operacji wcześniej niż drugie, zatrzymuje się i „czeka” na drugie zadanie. Po spotkaniu zadania mogą dalej wykonywać się niezależnie Zadanie w Adzie Każde zadanie jest obiektem typu zadaniowego (task object) Z obiektem typu zadaniowego związane są: sekwencja instrukcji do wykonania zadanie które je wykonuje zbiór zmiennych używanych wyłącznie przez to zadanie interfejs umożliwiający synchronizację i komunikację z innymi zadaniami Deklaracja zadania Zadania umieszczamy w części deklaracyjnej programu, bloku, ciała zadania lub w odrębnym pakiecie task T is .... end T; -- specyfikacja task body T is ... end T; -- ciało Przykłady zadań zakupy.adb taski1.adb przykłady deklaracji, uruchomienia i zakończenia zadań aktywowanie zadania następuje automatycznie zadanie zadeklarowane w pewnej jednostce (procedurze, pakiecie) nazywamy zależnym od tej jednostki jednostki nie można zakończyć dopóki nie zakończą się wszystkie zależne od niej zadania program główny jest traktowany jako zadanie główne Typ zadaniowy Poza pojedynczymi obiektami typu zadaniowego można deklarować typy deklaracja typu: task type nazwa [opcjonalna część wyróżnikowa] is .... end nazwa; task body nazwa is ...... end nazwa; definicja zadania: t: nazwa; przykład programu z typami zadaniowymi: zakupy_typy.adb wyróżnik może być typu dyskretnego lub wskaźnikowego Interakcja - spotkania Spotkanie dwóch zadań: jedno zadanie wykonuje wejście (entry) zadeklarowane w innym zadaniu Wejścia deklaruje się w specyfikacji zadania w podobny sposób jak procedury w specyfikacji pakietów: task T is entry E (...); end T; Wejście może mieć parametry in, out i in out (jak procedura) Nie może zwracać wyniku jak funkcja Wejście jest wywoływane w sposób podobny do procedury T.E(..); (potrzebna notacja kropkowa – standardowe zasady widoczności) Zadanie może mieć część prywatną, zawierającą wejścia, które nie będą widoczne dla zewnętrznego użytkownika Instrukcje, które mają być wykonane po wywołaniu wejścia, są umieszczane w odpowiedniej instrukcji accept w ciele zadania accept E(...) do -- instrukcje exception --- obsługa wyjątków --- (część opcjonalna) end E; Accept nie ma części deklaracyjnej, wszelkie lokalne deklaracje należy umieścić w bloku Wykonanie wejścia Jeśli zadanie wywołuje procedurę, to wykonuje jej wszystkie instrukcje Jeśli zadanie wywołuje wejście, to odpowiednia instrukcja accept jest wykonywana przez zadanie do którego należy wejście Zadanie wywołujące pozostaje w stanie oczekiwania Po wykonaniu instrukcji „accept” oba zadania działają dalej niezależnie Zadanie może mieć kilka wejść (chociaż najczęściej ma jedno) każde wejście ma kolejkę zadań oczekujących na wywołanie wejścia kolejka jest obsługiwana jako FIFO każde wykonanie instrukcji accept usuwa jedno zadanie z kolejki liczbę zadań oczekujących w kolejce wejścia E możemy określić za pomocą atrybutu E’Count. Można go wywołać tylko w zadaniu do którego należy wejście Ograniczenia instrukcji accept: instrukcja może zawierać wywołania wejść, podprogramów, bloki i kolejne instrukcje accept może zawierać blok obsługi wyjątków nie może zawierać instrukcji select ani instrukcji accept dla tego samego wejścia lub wejścia z tej samej rodziny – rodzina wejść i instrukcja select będą wyjaśnione później wywołanie instrukcji return wewnątrz accept zakańcza spotkanie instrukcje goto i exit wewnątrz accept nie mogą spowodować wyjścia poza instrukcję accept zadanie może wywołać własne wejście, ale prowadzi to do zakleszczenia przykłady programów ze spotkaniami: taski2.adb prod_kon.adb kli_ser.adb kli3_ser.adb