1. Problemy synchronizacji rozwiązywane za pomocą semaforów. AD1. Problem 5 ucztujących filozofów, problem czytelników-pisarzy, problem palaczy tytoniu, problem śpiącego golibrody, problem producentów-konsumentów. 2. Cechy poprawnego programu współbieżnego. -własność bezpieczeństwa (która ogółem mówi o tym, że nie może dojść do nieporządanej sytuacji), na którą składa się wzajemne wykluczanie oraz brak blokady 4. W jakich przypadkach zagłodzenie w problemie czytelników- pisarzy. W 1 przypadku, gdy pisarze mają ciągle wyższe priorytety niż czytelnicy i w ten sposób czytelnicy mogą nigdy nie dostać się do czytania pliku. W 2 przypadku, czytelnicy mają ciągle wyższe priorytety i nie muszą czekać tylko dlatego, że czeka pisarz/pisarze. 5. Spotkania w Adzie zaimplementowane za pomocą (bez) selecta. Ile minimalnie zadań może uczestniczyć w spotkaniu. minimalnie 2 równoległości co najmniej dwóch procesów sekwencyjnych. Kapsułkowanie – abstrakcja programowania osiągana poprzez podział modułu programu na publiczną specyfikację i wewnętrzną implementację. Programowanie współbieżne jest abstrakcją umożliwiającą wnioskowanie o dynamicznym wykonywaniu programów. System rozproszony jest systemem komputerowym złożonym z więcej niż jednego komputera. Wzajemne oddziaływanie między procesami może przyjąć następujący charakter: • Współzawodnictwo • Komunikacja. Współbieżność: Klasyczne programowanie współbieżne - polega na dekompozycji problemu na wiele elementów oprogramowania, które są wykonywane przez pewną liczbę procesorów z pamięcią współdzieloną, tzw. systemy ściśle powiązane, inaczej systemy wieloprocesorowe. Współbieżność rozproszona - polega na dekompozycji problemu na wiele elementów oprogramowania, które są wykonywane przez pewną liczbę niezależnych procesorów (własny zegar taktujący i pamięć operacyjna) komunikujących się poprzez sieć połączeń (np. sieć lokalna, przełącznica krzyżowa, itp.), czyli tzw. systemy luźno powiązane, inaczej systemy rozproszone. 2. Co w praktyce oznacza własność żywotności programu współbieżnego ? Jest to uogólnienie własności stopu na programy współbieżne. Program współbieżny jest żywotny, jeśli zapewnia, że każde pożądane zdarzenie kiedyś zajdzie. W przypadku problemu wzajemnego wykluczania własność żywotności oznacza, że jeśli jakiś proces czeka na wejście do swojej sekcji krytycznej, to w końcu do niej wejdzie. Aby pokazać, że program nie ma własności żywotności, trzeba podać szczególnie dobrany scenariusz synchronizacji przy którym nie da się osiągnąć pożądanej sytuacji. 3. Wymień co najmniej 3 języki programowania współbieżnego z konstrukcją monitora procesów. Pascal_C, Concurrent Pascal, Pascal Plus, Modula 2, Modula 3, Concurrent Euclid |
4. Jeżeli w problemie czytelników i pisarzy może dojść do zagłodzenia, to scharakteryzuj odpowiednią(e) sytuację(e). W problemie czytelników i pisarzy może dojść do zagłodzenia zarówno pisarzy jak i czytelników, w zależności od wybranego rozwiązania. Zgodnie z warunkami zadania czytelnik, który zapragnie wejść do czytelni powinien móc to zrobić, jeśli jest ona pusta lub jeśli są w niej już inni czytelnicy. W przeciwnym razie (tzn. gdy w czytelni jest już pisarz) powinien być wstrzymany do czasu, gdy zajdą warunki pozwalające mu wejść. Pisarz, który chce wejść do czytelni, powinien być wstrzymany aż będzie ona pusta. Rozwiązanie z możliwością zagłodzenia pisarzy: Czytelnicy na zawsze zawładną czytelnią. Wystarczy, że w każdej chwili będzie w niej przebywał co najmniej jeden czytelnik, a pisarze nie doczekają się pustej czytelni. Ta sytuacja wymaga aby do czytelni przychodził następny czytelnik zanim poprzedni zdąży czytelnie opuścić. Rozwiązanie z możliwością zagłodzenia czytelników: Wydaje się, że jeśli pisarze chcą coś zapisać, tp należy im to umożliwić najszybciej jak to możliwe, nie ma sensu bowiem, aby czytelnicy odczytywali przestarzałe dane. Zatem jeśli jakiś pisarz czeka na wejście do czytelni, bo są w niej jacyć czytelnicy, to nowo przybyły czytelnik powinien być wstrzymany, gdy już żaden pisarz nie będzie czekał. Dzięki temu po pewnym czasie wszyscy czytelnicy przebywający w czytelni ją opuszczą i będą mogli wejść pisarze. Wystarczy, że zawsze jakiś pisarz będzie czekał na możliwość pisania, a żaden z czytelników nie będzie mógł wejść doc czytelni. 5. Wymień różnice miedzy semaforem zdefiniowanym przez Dijkstrę a semaforem dostępnym w systemie SVR4. Semafory w systemie Unix są uogólnieniem semaforów zaproponowanych przez Dijkstrę. -U D. Wartość początkową semafora określamy przy deklaracji, a w SVR4 przypisanie wartości semaforowi jest możliwe w dowolnej chwili. -U D. operacje podniesienia i opuszczenia semafora polega na zwiększeniu/zmniejszeniu wartości zmiennej semaforowej o 1, podczas gdy w Unixie można zmieniać o dowolną liczbę całkowitą. Oprócz operacji P(opuść) i V(podnieś) dostępnych u D. w Unixie można wykonywać operację przechodzenia pod opuszczonym semaforem (Z – wstrzymaj działanie procesy aż S będzie równe 0). Dodatkowo w systemie Unix można wykonywać jednocześnie operacje na wielu semaforach, przy czym każda z nich może być inna. 6. Dlaczego sekcja krytyczna powinna być "możliwie najkrótsza" w sensie czasu pobytu w niej procesu sekwencyjnego Ponieważ w trakcie wykonywania sekcji krytycznej jednego procesu inne procesy, które również chcą wejść do sekcji krytycznej muszą oczekiwać na wyjście tego procesu z sekcji. Tracony jest przez to czas (pozostałe procesy nic nie robią), zanika częściowo współbieżność programu i zaczyna on działać jak zwykły program sekwencyjny, ponadto czekanie na zwolnienie sekcji krytycznej również pochłania czas procesora (np. aktywne czekanie). 7. Wymień warunki konieczne do wystąpienia zakleszczenia procesów sekwencyjnych. Wzajemne wykluczanie: przynajmniej jeden zasób musi być niepodzielny, tzn., że z zasobu tego może korzystać w danym czasie tylko jeden proces. Jeśli inny proces zamawia dany zasób, to musi być opóźniany, aż zasób zostanie zwolniony Przetrzymywanie i oczekiwanie: Musi istnieć proces, któremu przydzielono co najmniej jeden zasób i który oczekuje na przydział dodatkowego zasobu (zasobów), przetrzymywanego właśnie przez inny proces. Brak wywłaszczeń: zasoby nie podlegają wywłaszczeniu, tzn., że proces może zostać zwolniony tylko z inicjatywy przetrzymującego go procesu, po zakończeniu pracy tego procesu. Czekanie cykliczne: Musi istnieć zbiór {P0..Pn} procesów czekających, takich, że P0 czeka na zasób przetrzymywany przez proces P1, P1 czeka na zasób przetrzymywany przez P2, .. a Pn na zasób przetrzymywany przez P0. |
8. Podaj podstawowe modele oddziaływania procesów sekwencyjnych. Procesy niezależne od siebie Rywalizacja (współzawodnictwo) 1. Wynik jednego procesu nie zależy od działań pozostałych 2. Możliwe jest oddziaływanie na tempo wykonywania procesu 1. Wzajemne wykluczanie 2. Blokowanie (zasoby wymienne) 3. Zagłodzenia =============================== Procesy pośrednio zależne od siebie (poprzez obiekty współdzielone) Współpraca poprzez wspólne wykorzystywanie obiektów 1. Wynik jednego procesu może zależeć od danych otrzymanych od innych 2. Możliwy jest wpływ na tempo wykonywania procesu 1. Wzajemne wykluczanie 2. Blokowanie (zasoby wymienne) 3. Zagłodzenia 4. Zachowanie spójności danych ================================ Procesy bezpośrednio zależne od siebie (korzystanie z elementarnych procedur komunikacyjnych) Współpraca poprzez komunikację 1. Wynik jednego procesu może zależeć od danych otrzymanych od innych 2. Możliwy jest wpływ na tempo wykonywania procesu 1. Blokowanie (zasoby wyczerpywalne) 2. Zagłodzenia 9. Dlaczego operacja Wait(S), gdzie S jest semaforem, powinna być operacją atomową. Opuszczenie semafora, czyli operacja wait(S) to wykonanie instrukcji: Czekaj, aż S>0; S:=S-1; Jeśli proces rozpoczynający opuszczanie semafora stwierdzi, że jego wartość nie jest dodatnia, musi zaczekać. Ale aby mógł on zakończyć opuszczenie semafora jakiś inny proces musi mieć możliwość wykonania operacji podniesienia. W rzeczywistości w takim przypadku operacja opuszczania musi być przerwana w trakcie sprawdzania warunku S>0. Podczas tej przerwy jakiś Iny proces może rozpocząć opuszczanie semafora i ta operacja również musi zostać przerwana. W rezultacie można mieć wiele rozpoczętych a nie zakończonych operacji opuszczenia. Jednak w chwili, gdy jakiś inny proces zwiększy S, tylko jedna z tych operacji będzie mogła wykonać się do końca, ponieważ zakłada się, iż stwierdzenie S>0 i wykonanie s:=S-1 to jedna niepodzielna operacja. W definicji klasyczne przyjmuje się więc, że operacja opuszczenia semafora jest niepodzielna tylko wtedy, gdy sprawdzany w niej warunek jest spełniony. 10. Określ powody, dlaczego próby I, II, III i IV prowadzące do algorytmu Dekkera były rozwiązaniami niepoprawnymi. I próba W przypadku braku współzawodnictwa, tzn. gdy jeden z procesów utknie w swojej sekcji lokalnej drugi proces może wejść do sekcji krytycznej tylko raz. Gdy jeden z procesów wchodzi do sekcji krytycznej bardzo często a drugi bardzo rzadko rozwiązanie to wprowadza konieczność czekania przez proces szybszy. Jest to spowodowane naprzemiennym przekazywaniem prawa wejścia do sekcji krytycznej. II próba: Druga próba nie spełniała nawet własności wzajemnego wykluczania. Poza tym wadą tego rozwiązania jest również to, że proces po wyjściu z protokołu wstępnego nie może być powstrzymany przed wejściem do sekcji krytycznej. III próba: w programie juz po kilku instrukcjach może nastąpić blokada, jeśli będą sie one wykonywały na przemian z każdego procesu. Zmienne obu procesów będą miały wartość 0. teraz program będzie jedynie sprawdzał warunki które cały czas pozostaną fałszywe. nastąpi sytuacja w której oba procesy będą chciały wejść do sekcji krytycznych ale żadnemu sie to nie uda IV próba: istnieje ciąg wykonań instrukcji w którym p1 wchodzi do sekcji krytycznej nieskończenie wiele razy, a p2 pozostaje w nieskończoność w protokole wstępnym. Jeśli instrukcje będą wykonywane naprzemian w nieskończoność dojdzie do pół-blokady. |
---|
1. Na przykładzie języka Ada (wersje 83 i 95) zdefiniuj pojęcie pierwotnych i wtórnych mechanizmów synchronizacji. Mechanizmy pierwotne – mechanizmy dostarczone razem z językiem Ada, np. spotkania Mechanizmy wtórne – mechanizmy powstałe na bazie innych, dostarczone przykładowo w postaci pakietu, np. semafory 2. Określ zadania planisty programu współbieżnego. -przydzielanie zasobów procesom -rozstrzyganie pierwszeństwa dostępu do zasobu 3. N. Dunstan i I. Fris autorzy artykułu „Process Scheduling and UNIX Semaphores” podają 3 różnice między semaforem Dijsktry, a semaforami w systemie UNIX. Wymień co najmniej 2 z nich. -włączenie flag do klasyfikowania operacji -wykonanie listy operacji jest niepodzielne -nie jednolite operacje 4. P. A. Buhr i G. Ditchfield autorzy artykułu „Adding Concurrency to a Programming Language” w części 3 Design Options podają 8 udogodnień języka programowania wspierających programowanie współbieżne (ang. concurrency facilites). Wymień i w jednym zdaniu wyjaśnij 4 z nich. zadaniowość - język nie zorientowany obiektowo przestawia 'taski' jako niezależny wykonywalny program, analogicznie do ciała nie współbieżnego programu. język zorientowany obiektowo przedstawia 'taski' jako obiekt, jako interfejs ze zdefiniowanymi funcjami -komunikacyjność -statyczny typ kontroli -zakresy deklaracji - jesli 'taski' przypominają obiekty to powinny być możliwe do zadeklarowania tam gdzie można zadeklarować obiekty -bezpośrednia i pośrednia komunikacja - komunikacja 'tasków' może sie odbywać poprzez elementy pośrednie np. monitory. 'taski 'mogą także komunikować sie bezpośrednio ze sobą -synchronizacja i wzajemne wykluczanie -synchroniczna i asynchroniczna komunikacja -kolejka zadań procesów 5. Zakłada się, żę w pewnym programie współbieżnym może dojść do zakleszczenia. Wyjaśnij, dlaczego nie dla każdego uruchomienia tego programu dochodzi do zakleszczenia. Procesy wykonują sie w sposób niedeterministyczny. Podczas nowego uruchomienia programu, procesy mogą zażądać inną ilość zasobów, i nie zawsze musi to być maksymalna ilość zadeklarowanych przez siebie zasobów. Jeśli tak się stanie do zakleszczenia może nie dojść. 6. Wyjaśniej różnicę w działaniu instrukcji accept w języka Ada kiedy jest ona umieszczona wewnątrz instrukcji select oraz kiedy nie została umieszczona wewnątrz instrukcji select. Gdy instrukcja accept znajduje się wewnątrz instrukcji select, i jakieś procesy czekają w kolejce do tego wejścia, to zadanie przyjmujące będzie kontynuowało spotkanie z procesem z tej kolejki. Natomiast gdy instrukcja accept znajduje się poza instrukcją select to zadanie przyjmujące nie kontynuuje spotkań z kolejnymi zadaniami czekającymi w kolejce do tego wejścia. Instrukcja select pozwala zadaniu przyjmującem spotkać się z tym spośród zadań, które wywoła go jako pierwsze. 7. Całkowita poprawność programu sekwencyjnego oznacza, że program na pewno się zakończy, a wyniki będą poprawne. Wyjaśnij dlaczego całkowita poprawność jest nie zawsze właściwa dla programów współbieżnych. Całkowita poprawność zakłada, że program zakończy się a wyniki będą prawdziwe. Istnieją taki programy współbieżne, które nigdy się nie kończą, dlatego całkowita poprawność nie jest właściwa dla tego typu programów. 9. Czy spotkania w Adzie są symetryczne, czy asymetryczne? Uzasadnij swoją odpowiedź. Spotkania w Adzie są asymetryczne z tego względu, że zadanie wywołujące wie z kima się chce spotkać, natomiast zadanie przyjmujące nie wie z kim się spotka (kto je wywołał). 10. W pewnej implementacji monitora procesów zastosowano regulamin LIFO (Last Input First Output) kolejki procesów czekających na wejście do monitora. Dokonaj oceny powyższego rozwiązania. Przedstawione rozwiązanie jest rozwiązaniem błędnym ponieważ, procesy juz czekające na wejście do monitora mogą zostać zagłodzone w sytuacji kiedy nowe procesy będą cały czas wchodzić do kolejki bo zgodnie z algorytmem LIFO jako pierwsze zostaną obsłuzone procesy, które dołączą do kolejki jako ostatnie. |
2. Zalety semaforów: - Nie wymagają aktywnego czekania – proces, który wykonał operację ‘Czekaj’ na semaforze zostaje uśpiony. Nie sprawdza on w pętli warunku pozwalającego na dalszą pracę. - Implementacja efektywna czasowo – procesy zatrzymane na semaforze (uśpione) , zostają natychmiast wznowione po wykonaniu operacji ‘Sygnalizuj’ na semaforze. - Operacje na semaforze są niepodzielne – dwa procesy nie mogą wykonać operacji na tym samym semaforze w tym samym czasie 3.Co zrobili różni ludzie - Dekker – przedstawił rozwiązanie problemu wzajemnego wykluczania dal 2 procesów - Peterson – podał kolejne, prostsze rozwiązanie problemu wzajemnego wykluczania dla 2 procesów oraz dal n procesów - Lamport – rozwiązanie problemu wzajemnego wykluczania dla n procesów - Dijkstra – podał jako pierwszy definicję semaforów - Hansen – Definicja monitorów - Hoare – definicja monitorów (przedstawił ją prawie w tym samym czasie co Hansen ale były to dwie niezależne od siebie definicje) 4. Udogodnienia programowania współbieżnego: - zadaniowość - język nie zorientowany obiektowo przestawia 'taski' jako niezależny wykonywalny program, analogicznie do ciała nie współbieżnego programu. język zorientowany obiektowo przedstawia 'taski' jako obiekt, jako interfejs ze zdefiniowanymi funcjami - komunikacyjność - statyczny typ kontroli - zakresy deklaracji - jesli 'taski' przypominają obiekty to powinny być możliwe do zadeklarowania tam gdzie można zadeklarować obiekty - bezpośrednia i pośrednia komunikacja - komunikacja 'tasków' może sie odbywać poprzez elementy pośrednie np. monitory. 'taski 'mogą także komunikować sie bezpośrednio ze sobą - synchronizacja i wzajemne wykluczanie - synchroniczna i asynchroniczna komunikacja - kolejka zadań procesów 5. Języki programowania zawierające monitory procesów: - Concurent Pascal - Modula 3 - Mesa - Java W monitorach Hoara’a wystąpienie operacji Signal(c) musi spowodować natychmiastowe wznowienie procesu oczekującego na zmiennej warunkowej c. Monitory z powiadamianiem Inne rozwiązanie stosowane jest w monitorach z powiadamianiem (wprowadzone -Lampson, Redell w języku Mesa). Zdefiniowana tam operacja Notify(c) powoduje odblokowanie jednego z procesów związanej ze zmienną warunkową c ale proces ten nie musi być natychmiast zaszeregowany. Monitory z rozgłaszaniem NotifyAll(c) powoduje odblokowanie wszystkich z procesów związanej ze zmienną warunkową c. Proces te będą konkurowały o dostęp do monitora. Będą zaszeregowane gdy będzie to możliwe. 6. Gdy instrukcja accept znajduje się wewnątrz instrukcji select, i jakieś procesy czekają w kolejce do tego wejścia, to zadanie przyjmujące będzie kontynuowało spotkanie z procesem z tej kolejki. Natomiast gdy instrukcja accept znajduje się poza instrukcją select to zadanie przyjmujące nie kontynuuje spotkań z kolejnymi zadaniami czekającymi w kolejce do tego wejścia. Instrukcja select pozwala zadaniu przyjmującem spotkać się z tym spośród zadań, które wywoła go jako pierwsze. 7. Procesy wykonują sie w sposób niedeterministyczny. Podczas nowego uruchomienia programu, procesy mogą zażądać inną ilość zasobów, i nie zawsze musi to być maksymalna ilość zadeklarowanych przez siebie zasobów. Jeśli tak się stanie do zakleszczenia może nie dojść. 9. Spotkania w CSP są symetryczne dlatego że, oba procesy które chcą się spotkać muszą wzajemnie znać swoje nazwy i jawnie je podać. 10. Problemy które należy rozwiązać aby poprawnie zaimplementować semafor: - Operacje na semaforze muszą wykonywać się w sposób niepodzielny - Semafor musi posiadać kolejkę dla procesów czekających za zakończenie operacji na semaforze - Semafor musi mieć nadaną nieujemną wartość początkową - Operacja podniesienie semafora musi wznowić jeden ze wstrzymanych procesów |
zakleszczenie (deadlock) – dwa lub więcej wątków zostaje zablokowane na zawsze, każdy czeka na każdy zagłodzenie (starvation) – sytuacja, w której dany wątek nie może otrzymać dostępu do zasobów i wykonać swojego zadania livelock – bardzo podobne do deadlock. Wątki nie zostają zatrzymane, natomiast nie wykonują postępów 5 filozofów rozwiązanie: Wprowadzenie kelnera. Filozofowie będą pytać go o pozwolenie przed wzięciem widelca. Ponieważ kelner jest świadomy, które widelce są aktualnie w użyciu, może nimi rozporządzać zapobiegając zakleszczeniom. Gdy cztery widelce są w użyciu, następny filozof (chcący uzyskać możliwość jedzenia) będzie musiał czekać na pozwolenie kelnera. Pozwolenie nie zostanie udzielone do czasu zwolnienia widelca przez jednego z jedzących. Logika zostanie zachowana, jeśli założymy, że filozofowie w pierwszej kolejności sięgają po widelec leżący po ich lewej stronie a następnie po prawy (lub na odwrót). 1. Podany był program typu producent-konsument, napisać jakiego rodzaju jest to implementacja A) Podany program dla jednego producenta i jednego konsumenta będzie działał poprawnie, ponieważ, producent i konsument będą naprzemiennie korzystać ze współdzielonego zasobu i dopóki jeden z nich nie wywoła polecenia sem_signal, drugi będzie czekał na semaforze na swoją kolej. B) Tu szukałem miejsca w którym program się wykrzaczy(killerski przeplot), ale nie mogłem znaleźć, więc zostawiłem to pytanie, a pod koniec dopisałem, że dla wielu producentów i konsumentów program również będzie działał poprawnie, gdyż w sekcji krytycznej jednocześnie będzie naprzemiennie tylko jeden producent lub konsument. #define size 10 Int Findempty(int tab[]) { Int i; For (i = 0; i < size; i++) If (tab[i] == 0) return i; Return -1; } #define size 10 Int findfull(int tab[]) { Int i; For (i = 0; i < size; i++) If (tab[i] != 0) return i; Return -1; } Dopisałem jeszcze: przyjmujemy, że tablica pusta jest uzupełniona zerami, a zapisywane w niej dane są różne od zera. Można go zastosować w taki sposób, że współdzielony zasób sieciowy (np. drukarka sieciowa) będzie obiektem(procesem – już nie pamiętam co napisałem) który czeka na spotkanie, natomiast użytkownicy chcący skorzystać z tego zasobu to zadania, które idą na spotkanie. W ten sposób mamy pewność, że zasób będzie jednocześnie wykorzystywany tylko przez jednego użytkownika, gdyż jeżeli proces(zasób) będzie na spotkaniu z jednym zadaniem, to nie obsłuży drugiego spotkania, dopóki nie zakończy pierwszego. Wpłynie pozytywnie, ponieważ przy wykorzystaniu algorytmu FCFS nie wystąpią zagłodzenia. FCFS to algorytm analogiczny do kolejki FIFO(first In first out), oznacza to, że każdy z procesów, jeżeli zgłosi chęć wykorzystania zasobu, to ma gwarancję, że w skończonym okresie czasu zostanie obsłużony, dzięki czemu nie powstaną zagłodzenia. Przede wszystkim semafory Dijkstry to semafory dwustanowe (binarne). Nie posiadają one sprecyzowanej kolejności wzbudzania procesów i nie można sprawdzić ich stanu. W obecnych semaforach mamy dowolną ilość stanów przez co semafor nie są one tylko opuszczone lub podniesione (mogą być częściowo opuszczone). Jest określony sposób wzbudzania procesów po użyciu funkcji Signac (np. FIFO) i możemy sprawdzić ich stan. Ponieważ programy współbieżne są programami niedeterministycznymi. Podczas każdego uruchomienia programu może wystąpić inny przeplot funkcji przez co nie zawsze dojdzie do zakleszczenia. Dodatkowo dla każdego uruchomienia procesy mogą potrzebować dostępu do innych zasobów które współdzielą z innymi procesami. |
---|