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

Podobne dokumenty