Programowanie współbieżne i rozproszone

Slides:



Advertisements
Podobne prezentacje
Wprowadzenie do informatyki Wykład 6
Advertisements

Podstawowe pojęcia programowania współbieżnego
Mechanizmy pracy równoległej
Jarosław Kuchta Monitory.
Semafory Autorzy : Michał Winciorek Łukasz Jackowicz.
PROGRAMOWANIE STRUKTURALNE
Sieci komputerowe.
ZŁOŻONOŚĆ OBLICZENIOWA
Wykład nr 1: Wprowadzenie. Pojęcia podstawowe
Systemy operacyjne Wykład nr 4: Procesy Piotr Bilski.
Wykład nr 2: Struktura systemu komputerowego a system operacyjny
Systemy operacyjne.
Magistrala & mostki PN/PD
Systemy operacyjne Bibliografia:
Temat nr 10: System przerwań
Artur Szmigiel Paweł Zarębski Kl. III i
Projektowanie i programowanie obiektowe II - Wykład IV
Wstęp do interpretacji algorytmów
ZARZĄDZANIE PROCESAMI
Problem rozbieżności czasów jednym z wielu problemów pojawiających się w systemach rozproszonych jest rozbieżność wartości zegarów na poszczególnych węzłach-maszynach.
Język Java Wielowątkowość.
Semafory według normy POSIX
1 Podstawy informatyki H. P. Janecki- 2006_ Systemy Operacyjne W6.
Opracował: mgr Mariusz Bruździński
USŁUGA FTP 1. Definicja FTP. FTP (File Transfer Protocol, ang. protokół transmisji plików) jest protokołem typu klient-serwer, który umożliwia przesyłanie.
SIEĆ P2P 1. Definicja sieci równouprawnionej. To taka sieć, która składa się z komputerów o takim samym priorytecie ważności, a każdy z nich może pełnić.
Wykonawcy:Magdalena Bęczkowska Łukasz Maliszewski Piotr Kwiatek Piotr Litwiniuk Paweł Głębocki.
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.
Podstawy programowania II
Systemy operacyjne.
Zasada działania komputera
Budowa systemu komputerowego
BUDOWA I DZIAŁANIE SIECI KOMPUTEROWYCH
Autor: Justyna Radomska
Budowa komputera.
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Programowanie obiektowe – zastosowanie języka Java SE
Problem sekcji krytycznej
Przerwanie ang. interrupt.
Maszyna wirtualna ang. virtual machine, VM.
Buforowanie D e f i n i c j a.
Koncepcja procesu Zadanie i proces. Definicja procesu Process – to program w trakcie wykonywania; wykonanie procesu musi przebiegać w sposób sekwencyjny.
POŚREDNIK Jak reprezentowana jest informacja w komputerze? liczby – komputer został wymyślony jako zaawansowane urządzenie służące do wykonywania.
Architektura PC.
Sieci komputerowe.
Wykład 7 Synchronizacja procesów i wątków
W ą t e k (lekki proces) thread.
EcoCondens BBS 2,9-28 E.
Projektowanie stron WWW
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.
User experience studio Użyteczna biblioteka Teraźniejszość i przyszłość informacji naukowej.
Systemy rozproszone  Rozdzielenie obliczeń między wiele fizycznych procesorów.  Systemy luźno powiązane – każdy procesor ma lokalną pamięć; procesory.
WYNIKI EGZAMINU MATURALNEGO W ZESPOLE SZKÓŁ TECHNICZNYCH
Algorytmika.
Obliczalność czyli co da się policzyć i jak Model obliczeń sieci liczące dr Kamila Barylska.
Testogranie TESTOGRANIE Bogdana Berezy.
Jak Jaś parował skarpetki Andrzej Majkowski 1 informatyka +
Programowanie strukturalne i obiektowe C++
Diagram aktywności (czynności)
Procesor, pamięć, przerwania, WE/WY, …
Elementy geometryczne i relacje
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.
Struktura systemu operacyjnego
Wstęp do interpretacji algorytmów
Model warstwowy ISO-OSI
Wstęp do programowania Wykład 7
Wątki, programowanie współbieżne
POJĘCIE ALGORYTMU Wstęp do informatyki Pojęcie algorytmu
Zapis prezentacji:

Programowanie współbieżne i rozproszone Instytut Informatyki dr Anna Kwiatkowska

Literatura M. Ben – Ari „Podstawy programowania współbieżnego i rozproszonego” B. E. Borowik „Programowanie równoległe w zastosowaniach” G. Coulouris, J. Dollmore, T. Kindberg „Systemy rozproszone podstawy i projektowanie” D. Harel „Rzecz o istocie informatyki – algorytmika” Z.Weiss, T. Gruźlewski "Programowanie współbieżne i rozproszone„ http://ważniak.mimuw.edu.pl

Literatura (c.d.) Mike Morgan „Poznaj język Java”, Mikom 2001 Steve Potts „Java w zadaniach”, wydawnictwo Robomatic 2001 K. Barteczko „Programowanie obiektowe i zdarzeniowe w Javie”, wydawnictwo PJWSTK, 2005 H. Schildt „Java2, kurs podstawowy”, Edition 2002 Elliote Rusty Harold,”Java Programowanie sieciowe”, RM, Warszawa 2001

Wstęp Ciągle wzrastające zapotrzebowanie na zwiększenie mocy obliczeniowej komputerów (obecnie prędkości są rzędu kilkuset GFLOPS) Ograniczenia technologiczne sprzętu komputerowego hamują ten postęp Rozwiązania problemu poszukuje się w: implementacji obliczeń na komputerach o architekturze równoległej realizacji algorytmów współbieżnych GFLOPS=10^9 operacji zmp na sek wzrost mocy obliczeniowej – ograniczeniem jest wynikająca z technologii i architektury maksymalna częstotliwość zegara, czy opłacalna wielkość krzemowego chipu, cena sprzętu oraz w wypadku stosowania unikatowych rzadkiego sprzętu – kłopoty z serwisem i oprogramowaniem. Dodatkowym bodźcem do rozwoju komputerów równoległych jest to, że większość najpoważniejszych zadań obliczeniowych opiera się na modelach wektorowych i macierzowych, a działania tego typu stosunkowo łatwo dzielić na niezależne ciągi operacji. Obliczenia na komputerach równoległych przeprowadzane w sposób współbieżny dają szerokie możliwości obliczeń w czasie rzeczywistym.

Współbieżność Jeśli w jednym komputerze istnieje w tej samej chwili czasowej wiele procesów, to mówimy, że są one wykonywane współbieżnie Komputer ma jeden procesor centralny – współbieżność osiąga się przez przeplatanie porcji poszczególnych procesów Komputer ma N procesorów – N procesów może być wykonywanych równolegle (realnie jednocześnie) Ponieważ każdy proces istnieje tylko przez czas wykonywania programu, współistnienie pociąga za sobą współbieżność wykonania.

Dlaczego? Pisanie programów jest trudne Jest to stwierdzenie prawdziwe już w przypadku programów sekwencyjnych, gdy na raz wykonuje się jedna instrukcja i nie trzeba rozważać wszystkich możliwych interakcji z innymi działającymi w tym samym czasie programami Wprowadzenie współbieżności jeszcze bardziej utrudnia programowanie Dlaczego zatem warto i należy rozważać programy współbieżne?

Dlaczego rozważamy programowanie współbieżne Niektóre problemy są z natury współbieżne, rozwiązania innych dają się łatwo i elegancko wyrazić w postaci niezależnie wykonujących się procedur

Przykład chcemy napisać grę akcji, w której wiele postaci porusza się na ekranie wykonując pewne działania taką scenę możemy oprogramować sekwencyjnie rozważając akcje wszystkich postaci w jednym fragmencie kodu znacznie elegantszym rozwiązaniem jest oprogramowanie z osobna każdej postaci (można to zrobić obiektowo, nadając każdej z nich pewne indywidualne cechy), a następnie uruchomienie współbieżne tylu procesów, ile postaci chcemy uzyskać na ekranie oczywiście wymaga to także prawidłowej synchronizacji działania wszystkich procesów, co obejmuje działania takie jak na przykład wykrywanie kolizji i zapobieganie im.

Dlaczego? Systemy operacyjne optymalizują czas obrotu zadania wykonując nowy proces, w czasie, gdy wykonywany dotychczas proces czeka np. na zakończenie operacji wejścia- wyjścia Stale zwiększają się moc obliczeniowa procesorów umożliwia wykonanie wielu zadań interakcyjnych na jednym procesorze w sposób niezauważalny dla użytkownika

Przykład system operacyjny z podziałem czasu potrafi wykonywać wiele procesów współbieżnie dzieląc czas procesora między wiele procesów proces otrzymuje pewien kwant czasu (rzędu milisekund), w czasie którego korzysta z procesora gdy kwant skończy się, system operacyjny "przełącza" procesy: odkłada ten, który się wykonywał na później i zajmuje się innym ponieważ przełączanie odbywa się często, więc użytkownicy komputera mają wrażenie, że komputer zajmuje się wyłącznie ich procesem

Przykład (cd) co więcej, rozwiązując pewien problem, użytkownik może uruchomić "jednocześnie" dwa procesy, które ze sobą w pewien sposób współpracują jest to powszechnie stosowane na przykład w środowisku systemu operacyjnego Unix, który umożliwia wykonywanie programów w potoku, np.: ls -l | grep moje | more wszystkie trzy programy wchodzące w skład takiego potoku wykonują się współbieżnie, z tym że wyniki generowane przez pierwszy z nich są podawane na wejście drugiego, wyniki drugiego --- na wejście trzeciego itd

Dlaczego? malejące ceny sprzętu sprzyjają powstawaniu architektur wieloprocesorowych, w których można uzyskać prawdziwą współbieżność tzn. wykonywać jednocześnie wiele procesów na różnych procesorach system operacyjny nie musi już "oszukiwać" dzieląc czas jedynego procesora między wiele procesów, lecz może wykonywać każdy z nich na innym procesorze (przynajmniej dopóki wystarczy procesorów) nowoczesne układy zawierają udogodnienia takie jak: wielowątkowość (hyperthreading), czy wręcz kilka rdzeni w jednej kości procesora.

Dlaczego? rozpowszechnienie się sieci komputerowych stwarza jeszcze inne możliwości współbieżnego wykonywania poszczególne obliczenia składające się na duże zadanie mogą być wykonywane na różnych komputerach połączonych siecią rozproszone systemy operacyjne potrafią zarządzać czasem wielu procesorów, znajdujących się w wielu różnych węzłach sieci

Podstawowe cele programowania współbieżnego : 1) przyspieszenie wykonywania obliczeń (w przypadku procesów transformacyjnych); 2) lepsze wykorzystanie zasobów (sprzętu); 3) umożliwienie współpracy wielu użytkownikom;

Pojęcia podstawowe Praca sekwencyjna poszczególne akcje procesu są wykonywane jedna po drugiej, kolejna akcja rozpoczyna się po całkowitym zakończeniu poprzedniej

Pojęcia podstawowe Praca współbieżna: składające się na nią zjawiska, czynności lub działania odbywają się równocześnie. Współbieżność jest abstrakcją równoległości. Rozproszoność jest specjalnym typem współbieżności, w której składniki współbieżne są fizycznie oddalone

Realizacja procesu zajmuje się procesor. Procesy Proces – program w trakcie wykonywania, jest sekwencją zmian systemu komputerowego, które odbywają się zgodnie z zapisanym w programie algorytmem. Realizacja procesu zajmuje się procesor. Procesor i pamięć operacyjna to urządzenia niezbędne do wykonania każdego procesu.

Pojęcia podstawowe Proces - program w trakcie działania. Proces jest ciągiem czynności, zaś program jest ciągiem instrukcji. Program nie jest procesem, gdyż jest obiektem pasywnym, natomiast proces jest obiektem aktywnym z licznikiem rozkazów wskazującym następny rozkaz do wykonania oraz ze zbiorem przydzielonych mu zasobów.

Procesy współbieżne Dwa procesy są współbieżne, jeśli jeden z nich rozpoczyna się przed zakończeniem drugiego.

Rodzaje procesów skończone nieskończone (system operacyjny, systemy czasu rzeczywistego sterujące automatami lub wskutek błędu w programie) Od systemu operacyjnego wymagamy, aby trwał nieskończenie, gotowy na każde nasze żądanie.

Procesy współbieżne Proces nieskończony jest współbieżny ze wszystkimi procesami, które rozpoczęły się od niego później. Przykład: System operacyjny, a dokładniej procesy wchodzące w jego skład wykonują się współbieżnie ze wszystkimi procesami uruchamianymi przez użytkowników systemu komputerowego.

Klasyfikacja procesów współbieżnych procesy rozłączne interakcyjne konkurencyjne (współzawodniczące) kooperujące (współpracujące)

Procesy współbieżne Współbieżne są np. procesy wykonywane na dwóch nie połączonych ze sobą komputerach osobistych – procesy te nie mają na siebie wpływu, są rozłączne

Zasób dzielony Wspólny obiekt, z którego może korzystać w sposób wyłączny wiele procesów nazywa się zasobem dzielonym (może być wykorzystywany tylko przez jeden proces lub ograniczoną ich liczbę, mniejszą od liczby chętnych). Jest to sytuacja często spotykana w życiu: potrzeba skorzystania z łazienki, wtedy, gdy była zajęta, zadzwonić gdy ktoś korzystał z telefonu, zrobić zakupy w sklepie samoobsługowym, gdy wszystkie koszyki były w użyciu. Wiadomo, że w takiej sytuacji trzeba zaczekać a w sytuacji, gdy dwie osoby jednocześnie chcą wejść do pustej łazienki, zadzwonić z tego samego telefonu, czy wziąć ten sam koszyk trzeba zastosować zasadę dobrych obyczajów. zasób dzielony: łazienka, koszyk, telefon

Procesy współbieżne O współzawodnictwie mówimy, gdy dwa procesy ubiegają się o ten sam zasób (np. dostęp do tej samej komórki pamięci). Współzawodnictwo wymaga synchronizacji, gdyż akcja procesu musi być wstrzymana, jeśli zasób potrzebny do jej wykonania jest w danej chwili zajęty przez inny proces.

Procesy współbieżne Współpraca procesów równoległych wymaga komunikowania się, gdyż do działania jednego z nich jest potrzebna informacja tworzona przez drugi proces. Akcje tych procesów muszą być częściowo uporządkowane w czasie, gdyż informacja musi być najpierw utworzona, potem wykorzystana. informacja

Komunikacja miedzy procesami Komunikacja miedzy parą procesów obejmuje działania po stronie procesu nadawczego oraz odbiorczego, dające w wyniku: przenoszenie danych za środowiska procesu nadawczego do środowiska procesu odbiorczego synchronizację czynności odbiorczych z czynnościami nadawczymi tak, aby powstrzymać działanie procesu nadawczego lub odbiorczego do czasu, aż inny proces go uwolni Podstawowe instrukcje programowania przyjmują postać elementarnych działań wyślij i odbierz –łącznie te działania dokonują przekazania komunikatu miedzy parą procesów

Komunikacja miedzy procesami Każde przekazanie komunikatu obejmuje przesłanie przez proces nadawczy zbioru wartości danych (komunikatu) za pomocą określonego mechanizmu komunikacji i akceptację komunikatu przez proces odbiorczy mechanizm komunikacji – kanał lub port

Program współbieżny Poziomy uzależnienia procesów współbieżnych: procesy będące współbieżnym wykonaniem niezależnych programów użytkowych – synchronizacją tą zajmuje się system operacyjny Nie współpracują, a jedynie współzawodniczą między sobą wymagając synchronizacji przy dostępie do różnych urządzeń komputera

Program współbieżny procesy interakcyjne komunikują się i synchronizują w sposób określony przez programistę – program opisujący zachowanie się zbioru takich współbieżnych procesów nazywa się programem współbieżnym

Program współbieżny Program współbieżny składa się z kilku (co najmniej dwóch) współbieżnych procesów sekwencyjnych, które muszą się ze sobą komunikować lub synchronizować swoje działania

Poprawność W celu wykazania, że program sekwencyjny jest poprawny należy udowodnić dwie rzeczy: zawsze, jeśli program się zatrzyma to zwróci nam dobre wyniki (częściowa poprawność) w ogóle się zatrzyma (własność stopu) Program współbieżny może się w ogóle nie zatrzymywać

Własność bezpieczeństwa Własność bezpieczeństwa jest uogólnieniem własności częściowej poprawności na programy współbieżne. Program współbieżny jest bezpieczny jeśli nigdy nie doprowadza do niepożądanego stanu (zawsze utrzymuje system w pożądanym stanie). W przypadku problemu wzajemnego wykluczania własność bezpieczeństwa oznacza, że nigdy dwa procesy nie znajdą się jednocześnie w swoich sekcjach krytycznych Dowodzenie własności bezpieczeństwa jest trudne – przeważnie próbuje się wskazać ciąg akcji, które doprowadzają do stanu niepożądanego.

Przykład rozpatrujemy ruchliwe skrzyżowanie w środku dużego miasta procesy to samochody usiłujące przez to skrzyżowanie przejechać (na wprost) własność bezpieczeństwa wyraża fakt, że nie dojdzie do kolizji można ją wyrazić: nigdy na skrzyżowaniu nie będą jednocześnie samochody jadące w kierunku wschód-zachód i północ-południe.

Własność żywotności Program współbieżny jest żywotny, jeśli zapewnia, że każde pożądane zdarzenie w końcu zajdzie. Własność żywotności jest uogólnieniem własności stopu na programy współbieżne. Gwarantuje, że zdarzenie zawsze w końcu zajdzie, ale nie określa kiedy to się stanie. W przypadku problemu wzajemnego wykluczania oznacza, że jeśli jakiś proces czeka na wejście do swojej sekcji krytycznej, to w końcu do niej wejdzie. Dowodzenie własności żywotności jest łatwiejsze – wystarczy pokazać skończony ciąg akcji procesów, które przy każdym scenariuszu synchronizacji między nimi doprowadza w końcu do pożądanej sytuacji.

Przykład W przykładzie skrzyżowania oznacza to, że każdy samochód, który chce przez skrzyżowanie przejechać, w końcu przez to skrzyżowanie przejedzie

Uczciwość (sprawiedliwość) Własność uczciwości – określa jak ma być rozwiązany problem współzawodnictwa procesów. Gdy procesy nie są identyczne, sprawiedliwość jest cechą, którą trudno zdefiniować, a jeszcze trudniej zmierzyć. Np. rozwiązanie problemu wzajemnego wykluczania dwóch identycznie zachowujących się procesów, które pozwala jednemu z nich wchodzić do swej sekcji krytycznej co sekundę, a drugiemu co godzinę, ma własność żywotności, ale intuicyjnie trudno się z nim pogodzić – oczekuje się aby było uczciwe (sprawiedliwe)

Uczciwość (sprawiedliwość) Specyfikacje uczciwości: uczciwość słaba – jeśli proces nieprzerwanie zgłasza żądanie to kiedyś będzie ono obsłużone uczciwość mocna – jeśli proces zgłasza żądanie nieskończenie wiele razy, to kiedyś będzie ono obsłużone

Uczciwość (sprawiedliwość) oczekiwanie liniowe jest bardziej praktycznym pojęciem, ponieważ jeżeli proces zgłosi żądanie może być wprawdzie wyprzedzony przez każdy z pozostałych procesów, ale tylko jeden raz FIFO jest najsilniejszą specyfikacją uczciwości i łatwo ją zaimplementować

Uczciwość mocna i słaba Proces zgłasza żądanie przez ustawienie bitu na 1. Proces P2 okresowo zgłasza i wycofuje żądanie P1 zgłasza żądanie i podtrzymuje je nieskończenie długo, dopóki nie zostanie zrealizowane Proces obsługujący żądania okresowo sprawdza stan bitu w chwilach t1, t2, t3... System ten jest słabo uczciwy, ponieważ obsłuży żądanie procesu P1, ale nie jest mocno uczciwy, bo nie obsłuży żądania procesu P2. 1 P2 1 Rys. przedstawia różnicę miedzy uczciwością mocną i słabą. Proces zgłasza żądanie przez ustawienie bitu na 1. Proces P2 (niebieski) okresowo zgłasza i wycofuje żądanie P1(czerwony) – zgłasza żądanie i podtrzymuje je nieskończenie długo, dopóki nie zostanie zrealizowane Proces obsługujący żądania okresowo sprawdza stan bitu w chwilach t1, t2, t3... System ten jest słabo uczciwy, ponieważ obsłuży żądanie procesu P1, ale nie jest mocno uczciwy, bo nie obsłuży żądania procesu P2. Pomimo, że proces P2 zgłasza swoje żądanie nieskończenie wiele razy, system obsługujący sprawdza, czy są niezrealizowane żądania dokładnie wtedy, gdy P2 nic nie zgłasza. Silnie uczciwy system obsłużyłby proces P2. P1 t1 t2 t3

Obliczenia równoległe Idea obliczeń równoległych polega na podzieleniu obliczeń na części – wątki, z których każda jest wykonywana na oddzielnym procesorze. Po wykonaniu każdego z wątków następuje faza synchronizacji. Działanie 1 Działanie 2

Wątek jest podstawową jednostką wykorzystującą procesor Wątki Wątek jest podstawową jednostką wykorzystującą procesor Różnica między procesem a wątkiem polega przede wszystkim na sposobie wykorzystania dostępnych zasobów.

Wątki każdy proces ma przydzielony odrębny obszar pamięci operacyjnej grupa równorzędnych wątków współdzieli tą samą przestrzeń adresową, kod i zasoby systemu operacyjnego

Wielowątkowość w Java wątki działają praktycznie równolegle równoległość działań w ramach procesu osiągamy przez uruchamianie kilku różnych wątków

Wielowątkowość w Java zmiany wątków mogą dokonywać się według następujących mechanizmów: współpracy - wątek sam decyduje kiedy oddać czas procesora innym wątkom wywłaszczania – o dostępie wątków do procesora decyduje systemowy zarządca wątków ( przydział z przeplotem)

Wielowątkowość w Java każdy proces posiada co najmniej jeden wątek nazywany wątkiem głównym zaleta: wspólny dostęp wszystkich wątków danego procesu do zmiennych globalnych wada: brak ochrony danych programu przed równoległymi zmianami dokonywanymi przez różne wątki (możliwość niespójnych danych)

Wielowątkowość w Java uruchamianiem wątków i zarządzaniem nimi zajmuje się klasa Thread aby uruchomić wątek należy stworzyć obiekt klasy Thread i użyć metody start() wobec tego obiektu metoda run() określa co ma robić wątek

Metody klasy Thread activeCount() – zwraca liczbę aktywnych wątków należących do danej grupy checkAccess() – sprawdza za pomocą bieżącego obiektu SecurityManager, czy bieżacy wątek jest upoważniony do modyfikowania danego wątku countStackFrames() – zwraca głębokość stosu mierzoną liczbą stron currentThread() – zwraca odwołanie do aktualnie wykonywanego wątku destroy() – powoduje natychmiastowe zakończenie działania wątku bez możliwościwykonania operacji końcowych

Metody klasy Thread dumpStack() – wyświetla zawartość stosu aktualnie wykonywanego wątku enumerate() – przygotowuje tablicę wątków, zawierającą kopie wszystkich aktywnych wątków danej grupy getname() – zwraca nazwę wątku getPrioryty() – zwraca priorytet wątku getThreadgroup() – zwraca odwołanie do danej grupy wątków (ThreadGroup) interrupt() – przerywa określony wątek interrupted() – sprawdza, czy bieżący wątek został przerwany (metoda statyczna)

Metody klasy Thread isAlive() – zwraca true, jeśli określony wątek jest nadal czynny, wątek staje się czynny po wywołaniu jego metody start() isDaemon() – zwraca true, jeśli określony wątek jest demonem (demon działa w tle, niezależnie od interfejsu użytkownika), jeśli nie działa już żaden wątek interfejsu użytkownika i jedynymi wątkami są demony, to JVM kończy działanie isInterrupted() – zwraca true, jeśli dany wątek został przerwany join() – scala dwa wątki w oczekiwaniu na moment, kiedy inny wątek przestanie być czynny

Metody klasy Thread run() – rozpoczyna wykonywanie docelowego obiektu wątku setDaemon() – oznacza wątek jako demon lub jako wątek użytkownika, w zależności od wartości parametru setName() – zmienia nazwę wątku setPriority() – sprawdza, czy wątek jest upoważniony do zmiany swojego priorytetu, jeśli tak, to zmienia go zgodnie z wartością parametru, metoda ta nigdy nie ustawia priorytetu na poziomie wyższym niż dla danej grupy, priorytet ustala się za pomocą następujących stałych: MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY

Metody klasy Thread sleep() – powoduje, że bieżący wątek zwalnia procesor i wstrzymuje jego działanie na określony czas w milisek start() – rozpoczyna działanie danego wątku, powoduje wywołanie przez maszynę JVM jego metody run() toString() – zwraca reprezentacje łańcuchową (String) wątku, obejmującą jego nazwę, priorytet i grupę yield() – powoduje, że bieżący wątek zwalnia procesor, dzięki czemu procedura szeregująca może go udostępnić innym wątkom

Pierwszy sposób tworzenia i uruchomienia wątku zdefiniować własną klasę dziedziczącą Thread przedefiniować odziedziczoną metodę run() podając w niej działania, które ma wykonywać wątek stworzyć obiekt własnej klasy wysłać mu komunikat start()

Wielowątkowość w Java - przykład public class Timer extends Thread{ public void run(){ … while(true){ try{ this.sleep(1000); }catch (InterruptedException exc){ …}}} kod wątku jest opisany w metodzie run() w pętli while usypiamy wątek wykonujący metodę run() na 1 sek w trakcie uśpienia wątek jest odsuwany od procesora ……. Timer tm= new Timer(); tm.start …. utworzenie i uruchomienie wątku w programie

Drugi sposób tworzenia i uruchamiania wątku zdefiniować klasę implementującą interfejs Runnable (np. class C implements Runnable) dostarczyć w niej definicji metody run() (co ma robić watek) utworzyć obiekt tej klasy (np. C c=new C();) utworzyć obiekt klasy Thread przekazując w konstruktorze referencje do obiektu utworzonego (np.Thread th=new Thread(c);) wywołać na rzecz nowoutworzonego obiektu klasy Thread metodę start() (th.start();)

Wielowątkowość w Java -przykład class Timer implements Runnable { public void run(){int time=0; while(true) { try {Thread.sleep(1000); } catch(InterruptedException exc) { System.out.println(” watek zostal przerwany”); return;} time++; }}}

Wielowątkowość w Java -przykład utworzenie i uruchomienie tak zdefiniowanego wątku zliczającego czas (w innej klasie) ma następującą postać: Timer czas=new Timer(); Thread watek=new Thread(czas); watek.start();

import java.awt.*; import java.awt.event.*; import java.awt.event.MouseEvent; import java.applet.*; public class watki1 extends Applet implements Runnable, MouseMotionListener { int x1=50; int y1=50; Thread stoper=null; int licznik=0; public void init() {addMouseMotionListener(this);} public void start() if (stoper==null) {stoper=new Thread(this); stoper.start(); }} public void destroy() {removeMouseMotionListener(this);}

public void run() { while (stoper != null) {try {Thread.sleep(1000); } catch(InterruptedException e){} licznik++; repaint(); }} public void mouseDragged(MouseEvent e) x1=e.getX(); y1=e.getY(); public void mouseMoved(MouseEvent e){} public void paint(Graphics g) g.drawString("wynik:"+licznik,10,20); g.drawString("pociagnij",x1,y1);

Koniec pracy wątku Wątek kończy pracę, wtedy gdy zakończy się jego metoda run() programowo zakończyć jego pracę – należy sprawdzić w metodzie run() warunki zakończenia gdy są spełnione spowodować wyjście z run() (np. return) w klasie Thread znajduje się metoda stop()

Wątek zablokowany Wątek może znajdować się w stanie zablokowania z następujących powodów: uśpienie wątku metodą sleep(ilość milisekund); wywołanie metody suspend() (niezalecane); zawieszenie wątku metodą wait() a obudzenie go po wywołaniu metody notify() lub notifyAll(); wątek oczekuje na zakończenie operacji wejścia-wyjścia; wątek próbuje wywołać metodę synchronizowaną na innym obiekcie, który jest właśnie blokowany

Blokada Zbiór procesów znajduje się w stanie blokady (zastoju, martwego punktu), jeśli każdy z tych procesów jest wstrzymywany w oczekiwaniu na zdarzenie, które może być spowodowane tylko przez inny proces z tego zbioru. Zajmujemy się takimi procesami współbieżnymi, które są ze sobą powiązane ze sobą przez to, że wymagają wzajemnej synchronizacji lub komunikacji Zjawisko blokady może wystąpić tylko w niepoprawnym programie

Zagłodzenie Zagłodzenie (zakleszczenie) występuje wówczas, gdy proces nie zostaje wznowiony, mimo, że zdarzenie na które czeka, występuje dowolną ilość razy, ale za każdym razem jest wybierany jakiś inny czekający proces. Jeśli komunikat lub sygnał synchronizacyjny może być odebrany tylko przez jeden z czekających nań procesów, powstaje problem, który z procesów wybrać.

Zagłodzenie Zagłodzenie zależy od strategii wznawiania procesów i jest przejawem braku żywotności programu. Jeśli procesy będą wznawiane: zawsze w kolejności, w jakiej zostały wstrzymane (kolejka prosta), to zjawisko zagłodzenia nie wystąpi, zgodnie z priorytetami (kolejka priorytetowa), możliwe, że procesy o niższym priorytecie zostaną zagłodzone

Niskopoziomowe mechanizmy synchronizacji Mechanizm przerwań umożliwia przełączenie procesora na wykonywanie innego procesu. Przerwanie może być spowodowane: jakimś zdarzeniem zewnętrznym błędem wykonywania programu wykonaniem specjalnej instrukcji powodującej przerwanie Potrzebny jest mechanizm umożliwiający wzajemne wykluczanie procesów - każdy współczesny procesor jest wyposażony w mechanizm przerwań a każda pamięć w arbiter pamięci.

Niskopoziomowe mechanizmy synchronizacji Obsługa przerwań - procedura wykonywana automatycznie jako następstwo przerwania. Maskowanie przerwań - mechanizm umożliwiający zablokowanie kolejnych przerwań, gdy jest jeszcze realizowana procedura obsługi poprzedniego Do realizacji wzajemnego wykluczania można stosować przerwania powodowane wykonaniem specjalnej instrukcji i mechanizm ich maskowania.

Wady mechanizmu przerwań Programowanie przerwań wiąże się z ingerencją w obszar systemu operacyjnego W systemie wieloprocesorowym mechanizm ten nie gwarantuje wzajemnego wykluczania przy dostępie do pamięci, gdyż dwa różne procesory mogą w tym samym czasie realizować dwa różne przerwania

Arbiter pamięci Arbiter pamięci zapewnia wzajemne wykluczanie przy zapisie lub odczycie pojedynczej komórki pamięci Gdy dwa procesory podejmą próbę dostępu w tej samej chwili do komórki pamięci, uzyskają do niej dostęp w losowej kolejności. Jeśli jeden procesor chce odczytać wartość komórki, a drugi ja zmienić, to procesor czytający odczyta albo starą wartość albo nową, zmieniona przez drugi procesor, ale nigdy nie będzie to np. połowa komórki stara, a druga połowa nowa.

Wielowątkowość w JAVA Metody stop() suspend() resume() ze starszych wersji JAVA należą nadal do API, ale nie zaleca się ich stosowania specjaliści z Sun doszli do wniosku, że zwiększają prawdopodobieństwo zajścia blokady

Wielowątkowość w JAVA Działanie sekcji krytycznej: -"przejęcie" pewnych fragmentów kodu bądź określonych zasobów do wyłącznego użytku jednego wątku -każdy watek, który chce uzyskać wyłączny dostęp do fragmentu chronionego kodu musi najpierw wejść do tej sekcji krytycznej - operacja wejścia może się udać gdy żaden inny wątek nie przebywa w tej sekcji

Mechanizmy wysokopoziomowe Mechanizmy synchronizacji: semafory - zadaniem jest przepuszczanie i zatrzymywanie procesów monitory - jego głównym przeznaczeniem jest zarządzanie wybranym zasobem komputera

Mechanizmy wysokopoziomowe Mechanizmy komunikacji i synchronizacji: spotkania - mogą być symetryczne (dwoje ludzi) i asymetryczne (wizyta klienta w zakładzie naprawczym) przestrzeń krotek - nie trzeba znać ani dostawców ani odbiorców informacji potoki komunikaty i kanały

Semafor binarny Semafor binarny jest zmienną logiczna (pojedynczym bitem), zatem może przyjmować wartości 0 lub 1. podniesienie semafora S: S:=1 opuszczenie semafora S: czekaj aż S=1; S:=0;

Semafor ogólny jest zmienną całkowitą z dwoma wyróżnionymi operacjami. podniesienie semafora S: S:=S+1; opuszczenie semafora S: czekaj, aż S>0; S:=S-1; (operacja jest niepodzielna tylko wtedy, gdy S>0 jest spełniony)

Monitor Monitor to zebrane w jednej konstrukcji programowej pewne wyróżnione zmienne oraz procedury i funkcje działające na tych zmiennych. Część tych procedur i funkcji jest udostępniana na zewnątrz monitora – tylko ich wywołanie umożliwia procesom dostęp do zmiennych ukrytych wewnątrz monitora.

Monitor Wyróżnia je fakt, że wykonanie procedury monitora jest sekcją krytyczną wykonującego ją procesu. Istnieje możliwość wstrzymywania i wznawiania procesów wewnątrz procedury monitorowej.

Sekcja krytyczna Fragment procesu, w którym korzysta on z obiektu dzielonego nazywa się sekcją krytyczną tego procesu. Ponieważ w danej chwili z obiektu dzielonego może korzystać tylko jeden proces wykonując swoją sekcję krytyczną uniemożliwia on wykonanie sekcji krytycznych innym procesom. sekcje krytyczne: mycie się, telefonowanie, zakupy)

Sekcja krytyczna Procesor dzieli swój czas pomiędzy system operacyjny i wszystkie wykonujące się procesy (algorytm programu współbieżnego powinien zapewnić wykonywanie sekcji krytycznych procesów przez system operacyjny ponieważ ma on najwyższy priorytet) Na podstawie tych dwóch mechanizmów można już rozwiązać problem wzajemnego wykluczania w systemie jednoprocesorowym w następujący sposób:

Sekcja krytyczna Procesy współbieżne chcące wejść do własnej sekcji krytycznej wykonują instrukcję powodującą takie przerwanie, przy którym procesor zajmie się wykonywaniem systemu operacyjnego

Sekcja krytyczna żaden inny proces nie będzie mógł przeszkodzić w wykonywaniu sekcji krytycznej dzięki maskowaniu po zakończeniu obsługi tego przerwania procesor wróci do wykonywania procesów użytkowych lub obsłuży następne przerwanie Programowanie przerwań wiąże się z ingerencją w obszar systemu operacyjnego.

Wymagania czasowe żaden proces nie może wykonywać swojej sekcji krytycznej nieskończenie długo uniemożliwiając innym procesom wejście do sekcji krytycznej (tzn. rozpoczęcie jej wykonywania) w sekcji krytycznej proces powinien przebywać jak najkrócej Problem wzajemnego wykluczania można rozwiązać czyniąc pewne założenia:... a zwłaszcza nie może się on wewnątrz niej zapętlić lub zakończyć w wyniku jakiegoś błędu – np. nikt nie zasłabnie w łazience, czy przy telefonie ani nie wyniesie koszyka ze sklepu

Wymagania czasowe zachowanie się procesów poza sekcja krytyczną nie powinno być w żaden sposób ograniczone, poza sekcja krytyczną proces może się zatem zapętlić lub skończyć procesy mogą się wykonywać z różnymi dowolnie wybranymi prędkościami

Fazy równoległości Możliwa jest również wymiana wyników pomiędzy wątkami i kontynuacja pracy wielowątkowej. Konieczność synchronizacji wątków sprawia, że jest bardzo pożądane , by wszystkie z nich wymagały takiego samego obliczeń. Duże zróżnicowanie długości poszczególnych wątków powodowałyby dla wielu procesorów znaczną stratę czasu w oczekiwaniu na proces synchronizacji wątków. Potrzeba wymiany informacji między procesorami powodują,że obliczenia na N procesorach nie wykonują się zwykle N razy szybciej.

Techniki dekompozycji W celu zrównoleglenia algorytmu, należy dokonać dekompozycji problemu. W zależności od rozpatrywanego zadania należy wybrać najkorzystniejszą z metod dekompozycji

Dekompozycja geometryczna Jest zalecana wówczas, gdy obliczenia w każdym punkcie struktury danych zależą tylko i wyłącznie od położenia punktów w stosunku do punktu środkowego. Im odległość od punktu środkowego jest większa, tym więcej danych musi być doprowadzonych do obliczeń.

Dekompozycja iteracyjna Wykorzystuje fakt, że większość programów sekwencyjnych zawiera pętle. Wyniki zbioru kilku iteracji mogą być przesłanką do określenia osobnego zadania. Dekompozycja ta jest preferowana na komputerach z pamięcią rozproszoną. Metoda Monte Carlo - zrównoleglenie

Dekompozycja rekurencyjna Zaczyna się od podzielenia oryginalnego problemu na dwa lub więcej podproblemów, a następnie współbieżnego ich rozwiązywania. W tej metodzie każdy proces działa jako źródło nowego zadania i równocześnie jest odbiorcą rezultatów wygenerowanych w poprzednim zadaniu.

Dekompozycja spekulatywna Działania tej dekompozycji sprowadzają się zasadniczo do próby N technik rozwiązań jakiegoś problemu równocześnie. Wybierany jest proces, który pierwszy obliczy prawidłowe rozwiązanie w możliwie najkrótszym czasie. Pozostałe N-1 procesów jest odrzucanych.

Dekompozycja rozproszona W dekompozycji rozproszonej rozwiązywany problem jest dzielony na fragmenty. Liczba fragmentów musi być większa niż liczba procesorów. Każdemu procesorowi przydziela się pewną liczbę tych fragmentów w taki sposób, aby za obliczenia każdej z tych grup był odpowiedzialny tylko jeden powierzony tej grupie procesor.

Dekompozycja funkcjonalna Sprowadza się do przyporządkowania każdej procedurze wykonującej jedno zadanie oddzielnego, wyspecjalizowanego procesora, który będzie wykonywał pracę najskuteczniej i w sposób równoległy.

Przykład Program sekwencyjny jest wykonywany jako ciąg instrukcji jedna po drugiej. Przykład:Obliczenie wartości wyrażenia: A*B-(C+D)/(E-F) x1:=C+D; x2:=E-F; x3:=A*B; Faza synchronizacji polega na łączeniu w rezultat końcowy wyników pracy poszczególnych wątków. x4:=x1/x2; x5:=x3-x4;

Są to akcje potencjalnie równoległe. Przykład (c.d.) Przykład Obliczanie wartości x1 i x2 może być wykonane: jednocześnie, o ile umożliwia to sprzęt sekwencyjnie w przeplocie, o ile umożliwia to oprogramowanie Są to akcje potencjalnie równoległe.

Przykład(c.d.) Algorytm obliczenia wartości wyrażenia: A*B-(C+D)/(E-F) z elementami równoległymi x1:=C+D x4:=x1/x2 x2:=E-F x5:=x3-x4 x3:=A*B

Przykład 4 Jeśli algorytm wymaga sekwencji instrukcji: x:=3; y:=4; wtedy można zaoszczędzić czas wykonując je równolegle. Natomiast, gdyby instrukcje miały postać: x:=3; y:=x; po zrównolegleniu nową wartością y byłaby stara wartość x.

Przykład 6 Wiele problemów można rozwiązać dużo sprawniej dzięki przetwarzaniu równoległemu. Zadanie obliczania sumy wyrazów ciągu o n wyrazach Algorytm sekwencyjny wymaga n-1 dodawań, czyli ma koszt O(N) Algorytm równoległy będzie się wykonywał w czasie O(log2N) Notacja O(N) oznacza,że czas wykonania rośnie liniowo z N

Sumowanie w czasie logarytmicznym Pierwszy krok (n/2 procesorów) Drugi krok (n/4 procesorów) Krok log2N (1 procesor) a1 a1+ a2 a2 a1+ a2 +a3+ a4 a3 Suma ciągu a3+ a4 .... .... a4 1000 liczb można zsumować w czasie , jaki zajmuje wykonanie dziesięciu dodawań (500 procesorów), a milion w czasie 20 dodawań, ale potrzeba ... ... a n-3+ a n-2+an-1+an an-1 a1+ a2 an

Szybkość i efektywność komputerów równoległych Miarą korzyści, jaka wypływa ze zrównoleglenia procesów jest przyspieszenie aplikacji. Przyspieszenie programu wynosi: gdzie T(P) – czas potrzebny do przebiegu programu na P procesorach Jest to stosunek czasu przebiegu programu na 1 procesorze do czasu przebiegu tego samego programu na P procesorach Podana formuła przedstawia prostą miarę prędkości programu nie daje jednak charakterystyki efektywności wykorzystania procesorów.

Szybkość i efektywność komputerów równoległych Efektywność programu na P procesorach określona jest przez wzór: Jest to stosunek osiągniętego przyspieszenia do liczby procesorów wykonujących dane obliczenia Jest to stosunek osiągniętego przyspieszenia do liczby procesorów wykonujących dane obliczenia.

Szybkość i efektywność komputerów równoległych Prawo Amdahla Każdy program zawiera dwa rodzaje obliczeń: obliczenia, które muszą być wykonane szeregowo obliczenia, które mogą być zrównoleglone Dynamika wzrostu prędkości programu zaczyna gwałtownie spadać, gdy wewnętrzne szeregowe części programu zaczynają dominować nad częścią równoległą programu.

Dzielenie zasobów Zasób – zbiór rzeczy, które mogą być z pożytkiem dzielone (wspólnie wykorzystywane) w systemie rozproszonym. Zbiór ten obejmuje składowe sprzętowe (dyski, drukarki) i rozciąga się na jednostki definiowane przez oprogramowanie (pliki, okna, bazy danych i inne jednostki danych)

Dzielenie zasobów Zarządca zasobów (ang. resource manager)- moduł oprogramowania zarządzającego zbiorem zasobów konkretnego typu. Każdy zasób, który ma być w sposób efektywny wspólnie wykorzystywany musi być zarządzany przez program tworzący interfejs komunikacyjny umożliwiający dostęp do zasobu, działanie na nim oraz jego aktualizacje w sposób niezawodny i spójny.

Problem wzajemnego wykluczania Rozwiązanie tego problemu polega na wprowadzeniu do treści każdego procesu dodatkowych instrukcji: poprzedzających sekcję krytyczną – protokół wstępny następujące bezpośrednio po sekcji krytycznej – protokół końcowy Protokół końcowy Sekcja krytyczna Protokół wstępny

Problem wzajemnego wykluczania Definiuje się go następująco: Należy zsynchronizować N procesów, z których każdy w nieskończonej pętli na przemian zajmuje się własnym algorytmem i wykonuje sekcję krytyczną. Zsynchronizować należy w taki sposób, aby wykonanie sekcji krytycznych jakichkolwiek dwóch lub więcej procesów nie pokrywało się w czasie.

Rozwiązanie problemu wzajemnego wykluczania - własności N procesów wykonuje nieskończone pętle zawierające ciąg instrukcji, który można podzielić na: sekcje krytyczną i sekcje lokalną – instrukcje z sekcji krytycznych dwu lub więcej procesów nie mogą być przeplatane

Rozwiązanie problemu wzajemnego wykluczania - własności Rozwiązanie zapisane przez wstawienie do pętli dodatkowych instrukcji wykonywanych przez proces, który chce wejść lub opuścić sekcję krytyczną : protokół wstępny i końcowy

Rozwiązanie problem wzajemnego wykluczania - własności Proces może zatrzymać się w swojej sekcji lokalnej – nie może zatrzymać się ani zapętlić podczas wykonywania swoich protokołów ani sekcji krytycznej.

Rozwiązanie problem wzajemnego wykluczania - własności W programie nie może wystąpić blokada – jeśli kilka procesów próbuje wejść do swoich sekcji krytycznych, to jednemu musi się to w końcu udać.

Rozwiązanie problem wzajemnego wykluczania - własności Żaden z procesów nie może zostać zagłodzony – jeśli proces zgłasza zamiar wejścia do sekcji krytycznej przez rozpoczęcie wykonania protokołu wstępnego, to w końcu musi osiągnąć cel. Jest to bardzo silna własność, gdyż wymaga, żeby żaden możliwy ciąg wykonań instrukcji programu, nawet najmniej prawdopodobny nie może doprowadzić do zagłodzenia.

Rozwiązanie problem wzajemnego wykluczania - własności Przy braku rywalizacji o sekcję krytyczną pojedynczy proces, który chce wejść do swojej sekcji krytycznej wejdzie do niej natychmiast.

Semafory były pierwszym mechanizmem synchronizacyjnym stosowanym w językach wysokiego poziomu oprócz określenia jego stanu początkowego można na nim wykonywać tylko dwie operacje : podniesienie semafora (wait) i opuszczenie semafora (signal) rodzaje semaforów: ogólny i binarny

Zasada działania semafora opuszczenie semafora S, to wykonanie instrukcji: jeśli S>0, to S:=S-1 w przeciwnym razie wstrzymaj działanie procesu wykonującego tą operację podniesienie semafora s, to wykonanie instrukcji: jeśli są procesy wstrzymane w wyniku wykonania operacji opuszczania semafora s, to wznów jeden z nich, w przeciwnym razie S:=S+1

Schemat synchronizacji przy pomocy semafora Proces A Proces B signal(S) wait(S) S=0 ktoś czeka S:=S-1 S:=S+1

Semafory Ponieważ operacje podniesienia i opuszczenia semafora są niepodzielne, w danej chwili tylko jeden proces może badać stan semafora S i ewentualnie zmniejszyć lub zwiększyć jego wartość

Ograniczenia nie można wykonywać na nim działań arytmetycznych brak informacji o tym ile procesów zostało wstrzymanych na danym semaforze często trzeba oprócz semafora wprowadzać zmienne pomocnicze (całkowite) programista musi sam zadbać, aby zmienne te były odpowiednio modyfikowane wszelkie operacje na tych zmiennych muszą być sekcja krytyczną

Semafory Problemy, które można poprawnie rozwiązać za pomocą semaforów: wzajemne wykluczanie dwóch procesów producenci i konsumenci czytelnicy i pisarze pięciu filozofów przejazd przez wąski most gra w „łapki”

Monitory koncepcja monitora powstała w wyniku poszukiwań strukturalnego mechanizmu do synchronizacji procesów monitor to zebrane w jednej konstrukcji programowej pewne wyróżnione zmienne oraz procedury i funkcje działające na tych zmiennych część tych procedur i funkcji jest udostępniana na zewnątrz monitora

Monitory tylko wywołanie udostępnionych funkcji i procedur monitora umożliwia procesom dostęp do zmiennych ukrytych wewnątrz monitora wykonanie procedury monitora jest sekcją krytyczna wykonującego ją procesu istnieje możliwość wstrzymywania i wznawiania procesów wewnątrz procedury monitorowej służą do tego specjalne zmienne

Przejście procesu przez monitor Monitor M Proces A procedure P(x:real); begin …. wait(C); …… signal(C); end; M.P(y) procesy oczekujące na wejście procesy oczekujące na C procesy wstrzymane po signal

Monitory Problemy, które mogą być poprawnie rozwiązane przy pomocy monitorów: producenci i konsumenci z losową wielkością pobieranych i wstawianych porcji prom jednokierunkowy trzy drukarki stolik dwuosobowy

Spotkania symetryczne komunikacja synchroniczna za pomocą instrukcji wejscia-wyjścia proces A chce wysłać (instrukcja wyjścia) do procesu B ciąg wartości X, aby to było możliwe w procesie B musi się znajdować dualna instrukcja wejścia z parametrem tego samego typu, co X

Spotkania symetryczne instrukcja wejścia-wyjścia jest wykonywana wtedy, gdy sterowanie w procesie A osiągnie instrukcję wyjścia, a w procesie B odpowiadającą jej instrukcję wejścia wówczas odbywa się spotkanie, które polega na przekazaniu ciągu wartości X

Spotkania symetryczne parę instrukcji wejścia-wyjścia można uważać za dwie części tej samej instrukcji ciąg wyrażeń w instrukcji może być pusty – taka para instrukcji nazywa się sygnałem i jest to mechanizm służący tylko do synchronizacji procesów

Spotkania symetryczne Proces A Proces B WY(5) WE(y)

CSP język do zapisywania procesów współbieżnych realizujący spotkania symetryczne oprócz zwykłej instrukcji przypisania jest możliwe przypisanie jednoczesne, wykonanie takiej instrukcji polega na równoległym obliczeniu wartości wyrażeń podanych z prawej strony , a następnie jednoczesnym przypisaniu ich odpowiadającym zmiennym z lewej strony instrukcji

Spotkania symetryczne Przykłady problemów, które można prosto rozwiązać przy użyciu spotkań symetrycznych: algorytm Ricarta i Agrawali (proces, który chce wejść do swojej sekcji krytycznej prosi o pozwolenie wszystkie pozostałe) korygowanie logicznych zegarów głosowanie centrala telefoniczna

Asymetryczne spotkania podczas spotkania mogą być wykonywane dodatkowo pewne obliczenia, przy czym mogą być one wykonywane tylko przez jeden z komunikujących się procesów, zwanym obsługującym (serwer) proces obsługujący udostępnia procesowi obsługiwanemu (klient) różne miejsca spotkań miejsca spotkań są widoczne w postaci wejść do programu obsługującego

Asymetryczne spotkania proces obsługiwany musi znać nazwę procesu obsługującego i wejście, przez które chce się z nim spotkać proces obsługujący nie zna nazwy procesu obsługiwanego spotkanie jest asymetryczne ze względu na jednostronną identyfikację partnerów oraz jednostronną aktywność podczas spotkania

Asymetryczne spotkania ten sam proces może być jednocześnie procesem obsługującym (udostępnia swoje wejścia) jak i obsługiwanym (korzysta z wejść innych procesów)

ADA powstał jako język przeznaczony głównie do programowania systemów czasu rzeczywistego opis języka: I.C.Pyle „Ada”, WNT jest językiem rozbudowanym o dość złożonej składni

Przestrzeń krotek krotka to ciąg danych, z których każda ma określony typ ciąg typów poszczególnym elementów krotki tworzy jej sygnaturę Przykład krotka (5,3.14,TRUE,’c’,20) ma sygnaturę (integer, real, boolean,char,integer)

Przestrzeń krotek typami elementów krotek mogą być także typy złożone (tablice, rekordy itp.) wszystkie procesy realizują się w środowisku zwanym przestrzenią krotek z przestrzeni tej proces pobiera dane w postaci krotek i wysyła wyniki także w formie krotek każdy proces komunikuje się tylko z otaczającą go przestrzenią nie musi wiedzieć o istnieniu innych procesów

Operacje w przestrzeni krotek operacja INPUT – realizuje pobieranie krotek z przestrzeni, pobierana jest krotka o sygnaturze zgodnej z sygnaturą ciągu parametrów tej operacji operacja OUTPUT – powoduje umieszczenie krotki w przestrzeni krotek operacja READ – ma taki sam efekt jak INPUT z tą różnicą, że przeczytana krotka nie jest usuwana z przestrzeni

Przestrzeń krotek Przykład Do pobrania krotki (5, 3.14, TRUE,’c,20) można użyć następującej operacji: INPUT (i:integer, r:real, b:boolean, c:char, j:integer) Po jej wykonaniu zmienne występujące jako parametry operacji INPUT będą miały następujące wartości: i=5, r=3.14, b=TRUE, c=‘c’, j=20

Przestrzeń krotek Przestrzeń krotek Proces A Proces B (6, 1.3) (‘A’) OUTPUT(‘A’) INPUT(5,x:real) (5,’c’) (5,2.71)

LINDA opis:D.Gelertner „Generative communication in LINDA”, ACM Trans.Program. Lang. and Syst., tom7, str 80-112 nie jest konkretnym językiem programowania, tylko pewną ideą, której realizację można włączać do dowolnego języka programowania współbieżnego mechanizm komunikacji między procesami komunikacja w Lindzie nie narzuca żadnych powiązań między procesami ani w czasie ani w przestrzeni

Przestrzeń krotek Problemy do rozwiązania przy użyciu przestrzeni krotek: obliczanie całki oznaczonej problem ośmiu hetmanów mnożenie macierzy centrala telefoniczna

Potoki wyniki jednego programu są danymi do drugiego system operacyjny DOS zawiera mechanizm przetwarzania potokowego: p1|p2|p3|...|pn zapis ten oznacza, że standardowe wyjście programu p1 będzie potraktowane jako standardowe wejście programu p2 itd..

Potoki System MS DOS nie daje możliwości współbieżnego przetwarzania, jednak: jest to mechanizm zewnętrznie bardzo podobny do potoków w UNIX sposób programowania jest taki sam, jak dla wykonania współbieżnego

Potoki Przykłady zadań, które można rozwiązać stosując potoki: producent i konsument obliczanie współczynników rozwinięcia dwumianu Newtona porównywanie ze wzorcem problem ośmiu hetmanów

Komunikacja przez potok Proces A Proces B otop tsej ot write(‘k’) read(z)

Pascal_C powstał w Instytucie Informatyki Uniwersytetu Warszawskiego (S.Kurpiewski „Język Pascal_C”,praca magisterska) jest podzbiorem języka Pascal rozszerzonym o instrukcje programowania współbieżnego: cobegin, coend, oraz o możliwość deklarowania monitorów i procesów w taki sam sposób, jak funkcje i procedury w monitorze deklaracje udostępnianych procedur poprzedza się słowem export

Concurrent Pascal jest jedną z pierwszych prób rozszerzenia Pascala o mechanizmy umożliwiające programowanie współbieżne zaproponowany przez Brinch Hansena (Brinch Hansen „The programming language – Concurrent Pascal”, IEEE trans of Software Eng., tom 2,str 199-207) istnieje mozliwośc zdefiniowania specjalnego typu monitorowego i specjalnego typu procesowego

Concurrent Pascal nazwy udostępnianych procedur poprzedza się słowem entry typowi condition odpowiada typ queue kolejki procesów mogą być co najwyżej jednoelementowe, jeśli trzeba wstrzymać w monitorze więcej procesów należy użyć tablicy zadeklarowanej jako typ queue

Pascal Plus opis języka: J.Welsh i in. „Pascal Plus: another langugage for modular multiprogramming”, Software Practice and Experience, tom 9, str 947-958 oraz D.Bustard i in. „Currenr program structures”, Englewood Clifs, NJ,Prentise-Hall,1988 podstawowym pojęciem jest ‘koperta’, czyli zbiór deklaracji zmiennych oraz procedur i funkcji zebranych w jednej konstrukcji programowej

Pascal Plus koperty są obiektami biernymi koperta ma takie same własności, jak monitor, z tą różnicą, że udostępniane przez nią procedury mogą być wykonywane jednocześnie przez kilka współbieżnych procesów typ condition jest standardowym monitorem o nazwie Condition możliwe jest wstrzymywanie procesów z prirytetem

Synchronizowanie metod W niektórych sytuacjach odrębne wątki współdzielą dane i muszą uwzględniać stan innych wątków Java obsługuje synchronizację metod z wykorzystaniem monitorów Monitor jest związany z konkretnym elementem danych i funkcjonuje jak blokada nałożona na te dane

Synchronizowanie metod kluczem synchronizacji w Javie jest koncepcja monitora który kontroluje dostęp do obiektów monitor działa poprzez implementację koncepcji zamykania gdy obiekt jest zamknięty przez wątek, żaden inny wątek nie ma do niego dostępu

Synchronizowanie metod gdy wątek wyjdzie z obiektu, jest on otwierany i dostępny dla innych wątków wszystkie obiekty w Javie posiadają monitor właściwość ta jest wbudowana w język Java wszystkie obiekty mogą być synchronizowane

Synchronizacja metod Kiedy wątek monitoruje element danych, nakłada na niego blokadę, która uniemożliwia innym wątkom modyfikowanie danych Użycie monitorów nie zapobiega dostępowi do obiektu przez kod, który pomija monitor

Synchronizacja Synchronizowane mogą być: Metody Synchronized void metoda(){…} Sekcje kodu – ryglowanie obiektu Synchronized(lock) {….} gdzie lock – referencja do zablokowanego obiektu

Synchronizacja metod dostęp do metod synchronizuje się poprzez słowo kluczowe synchronized synchronizowana metoda jest tworzona dzięki poprzedzeniu jej deklaracji tym słowem kluczowym

Synchronizowanie metod gdy taka metoda zostanie wywołana, wątek wywołujący wchodzi do monitora obiektu, który zamyka ten obiekt wszystkie wątki próbujące wywołać synchronizowaną metodę będącą w użyciu wejdą w stan oczekiwania dopóki obiekt nie zostanie otwarty gdy wątek opuszcza synchronizowana metodę, obiekt jest otwierany

Synchronizowanie bloku ogólna forma bloku synchronizowanego jest następująca: synchronized(obiekt){ //instrukcje synchronizowane} gdzie obiekt jest referencją do obiektu, który będzie synchronizowany

bloki synchronizowane są ogólniejsze od metod synchronizowanych, bowiem zapis każdej synchronizowanej metody: synchronized void metoda(){ //kod..} jest równoważny zapisowi: void metoda(){ synchronized(this){ //kod..}}

gdy synchronizujemy pojedyncza instrukcję, nawiasy nie są potrzebne blok synchronizowany zapewnia, że wywołanie metody będącej składnikiem obiekt zajdzie tylko wtedy, gdy wątek wywołujący wejdzie do monitora tego obiektu

Przykład synchronizacja metod synchronized int sumArray(int nums[]) { for(int i=0; i<nums.length; i++) sum+=nums[i]; System.out.println("wynik dla" + Thread.currentThread().getName()+"jest"+sum); try{Thread.sleep(10);} catch(InterruptedException exc) System.out.println("Glowny watek przerwany"); } return sum;}

synchronizacja wywołania public void run() { int sum; System.out.println(thrd.getName() + "rusza"); synchronized(sa);{ answer=sa.sumArray(a);} System.out.println("Suma dla"+ thrd.getName() + "wynosi" + answer); System.out.println(thrd.getName() + "konczy"); }

Sekcja krytyczna zestaw instrukcji w programie, który ma wyłączny dostęp do jakiegoś kodu nazywamy sekcją krytyczną w Javie sekcje krytyczne wprowadza się jako bloki lub metody synchronizowane użycie sekcji krytycznych pozwala na prawidłowe współdzielenie zasobów przez wątki

Komunikacja między wątkami Java obsługuje komunikacje miedzy wątkami przy użyciu metod wait(), notify() oraz notifyAll(); metody wait(), notify() oraz notifyAll() są częścią wszystkich obiektów (są zaimplementowane przez klasę Object)

Koordynacja metody te mogą być wywoływane tylko z wnętrza synchronizowanej metody gdy wątek jest czasowo zablokowany, wtedy wywołuje metodę wait() powoduje to uśpienie wątku i zwolnienie monitora danego obiektu, dzięki czemu z obiektu może korzystać inny wątek

Koordynacja w późniejszym czasie uśpiony wątek zostaje obudzony, gdy jakiś inny wątek wejdzie do tego samego monitora i wywoła notify() lub notifyAll() wywołanie notify() wznowi jeden wątek wywołanie notifyAll() wznowi wszystkie watki, spośród których dostęp do obiektu uzyska te o najwyższym priorytecie

Koordynacja działań wątków Koordynacja działań wątków sprowadza się do następujących kroków: wątek wywołuje metodę wait() na rzecz danego obiektu, gdy oczekuje, że się ma coś z obiektem zdarzyć (zmiana stanu obiektu przez inny wątek)

wywołanie wait() blokuje wątek (jest on odsuwany od procesora) a jednocześnie powoduje otwarcie rygla (odblokowanie) zajętego przez niego obiektu, umożliwiając dostęp do obiektu z sekcji krytycznych innych wątków

wait() może być wywoływane tylko z sekcji krytycznej, bowiem chodzi tu o współdziałanie wątków na tym samym ryglowanym obiekcie inny wątek może teraz zmienić stan obiektu i powiadomić o tym wątek czekający (za pomocą metody notify() lub notifyAll() )

odblokowanie (przywrócenie gotowości działania i ewentualne wznowienie działania wątku ) następuje, gdy inny wątek wywoła metodę notify() lub notifyAll() na rzecz tego samego obiektu, na którym dany wątek czeka (na rzecz którego wywołał metodę wait() )

metoda notifyAll() odblokowuje wszystkie czekajace na danym obiekcie wątki wywołanie notify() lub notifyAll() musi być także zawarte w sekcji krytycznej

działanie metod wait(), notify(), notifyAll() zawsze są związane z konkretnymi obiektami jednocześnie działanie tych metod dotyczy wątków (czyli zazwyczaj innych obiektów) które na tych konkretnych obiektach operują

Formy metody wait() zdefiniowanej w klasie Object final void wait() throws InterruptedException ta forma czeka do powiadomienia final void wait(long milisekundy) throws InterruptedException czeka na powiadomienie przez określony czas w milisekundach

Formy metody wait() zdefiniowanej w klasie Object final void wait(long milisekundy,long nanosekundy) throws InterruptedException dodatkowo pozwala na podanie czasu w nanosekundach ogólne formy final void notify(); final void notifyAll();

Stany wątków Wątek może znajdować się w czterech stanach: New Thread Runnable NotRunnable Dead

Stany wątków stan New Thread powstaje w momencie stworzenia obiektu-wątku do stanu Runnable wątek przechodzi po wywołaniu metody start(), która z kolei wywołuje metodę run()

stan Runnable niekoniecznie oznacza, że wątek jest aktualnie wykonywany jest to raczej potencjalna gotowość do działania, czy system operacyjny akurat przydzieli temu wątkowi czas procesora zależy od wielu czynników (jaki jest schemat zarządzania wątkami, jakie są ich priorytety itp.)

NotRunnable do stanu NotRunnable wątek przechodzi na skutek: wywołania metody sleep(usypiającej wątek) – powrót do stanu Runnable po upływie podanego czasu wywołania metody wait() (watek czeka na powiadomienie o jakimś zdarzeniu), powrót do stanu Runnable po tym, jak jakiś inny obiekt powiadamia wątek o wystąpieniu zdarzenia za pomocą metody notify() lub notifyAll()

NotRunnable blokowania na operacjach wejścia – wyjścia, powrót do stanu Runnable po zakończeniu operacji blokowanie na obiekcie z zamkniętym ryglem – oczekiwanie na zakończenie działania innego wątku

wątek kończy działanie na skutek zakończenia metody run() i przechodzi do stanu Dead mimo, iż nadal może istnieć obiekt oznaczający wątek, ponowne użycie wobec niego metody start() jest niedozwolone (w Javie wątki nie są „restartowalne” ) aby ponownie uruchomić wątek należy stworzyć nowy obiekt i zastosować metodę start()

Koniec pracy wątku klasa Thread dostarcza dwóch metod: wywołana na rzecz wątku metoda final boolean isAlive() zwraca true, jeżeli wątek wciąż działa, w przeciwnym razie false metoda final void join() throws InterruptedException czeka, aż wątek na którego rzecz została wywołana, zakończy się

Priorytet wątków każdy wątek posiada swój priorytet wątki o dużym priorytecie posiadają potencjalnie większy dostęp do procesora gdy uruchamiany jest wątek potomny, jego priorytet jest taki sam jak priorytet rodzica

priorytet wątku można zmienić wywołując metodę Priorytet wątków priorytet wątku można zmienić wywołując metodę final void setPriority (int poziom) gdzie poziom określa nowy poziom priorytetu dla wątku wywołującego aby ustawić wątek z powrotem na domyślny priorytet, należy podać NORM_PRIORITY

final int getPriority() Priorytet wątków poziom musi się znajdować w zakresie od MIN_PRIORITY do MAX_PRIORITY aktualnie, wartości te wynoszą odpowiednio 1 oraz 10 pobrać aktualny poziom priorytetu można za pomocą metody final int getPriority()

Architektury równoległe Jeden system operacyjny W architekturze SMP dzięki temu,że wszystkie procesory mają dostęp do całej pamięci, napisanie programu równoległego jest stosunkowo proste, nie ma bowiem problemu z dostępem do danych znajdujących się w pamięci wspólnej dla wszystkich procesorów.Jednak wspólna pamięć może powodować kłopoty – w sytuacji, gdy procesory będą próbowały zapisywać do tego samego adresu pamięci, lub gdy jeden zmieni wartość zmiennej mimo, że drugi będzie potrzebował starej wartości. Zaletą architektury o pamięci wspólnej jest to,że kompilatory mogą w sposób automatyczny dokonywać podziału na równoległe wątki. Systemy o pamięci rozproszonej składają się z komputerów (nazywanych węzłami obliczeniowymi) połączonych siecią o dużej przepustowości. W związku z tym, że każdy z węzłów obliczeniowych dysponuje własną pamięcią operacyjną, wymiana danych w fazie synchronizacji odbywa się przez sieć, którą węzły są połączone. Część obliczeniowa jest podzielona na zadania, ale każdy z komputerów ma w pamięci własne dane. W przeciwieństwie do komputerów o pamięci wspólnej, żadne dane nie są współdzielone pomiędzy węzłami, wymiana danych pomiędzy nimi musi być w sposób jawny zakodowana w programie Każdy węzeł ma własny system Przełącznik sieciowy

Architektury równoległe Komputery równoległe składają się z wielu rozłącznych elementów przetwarzających, które współpracują ze sobą działając współbieżnie. Istotne jest co robi każdy ze składników oraz komunikacja miedzy nimi kopanie rowów x:=1;y:=2;

Architektury równoległe SMP (Symmetric Multiprocesor) – maszyny, w których wszystkie procesory korzystają z tej samej pamięci operacyjnej DMP (Distributed Memory Processing) – systemy z pamięcią rozproszoną (w tej architekturze każdy z procesów – węzłów dysponuje własną pamięcią operacyjną, o tej architekturze są także systemy klastrowe) NUMA (Non-Uniform Memory Access) – jest maszyną DMP złożoną z węzłów SMP (w niej każdy obszar pamięci ma inny czas dostępu) COW (Cluster of Workstation) 2. w tej architekturze każdy z procesów – węzłów dysponuje własną pamięcią operacyjną, o tej architekturze są także systemy klastrowe Architektury SMP i DMP można ze sobą łączyć – w wyniku otrzymuje się komputer równoległy z pamięcią rozproszoną, w którym poszczególne węzły są komputerami SMP 3. w niej każdy obszar pamięci ma inny czas dostępu

Komputery równoległe Z uwagi na zastosowany sposób przetwarzania danych komputery równoległe można podzielić na trzy grupy charakteryzujące się: równoległością danych(oddzielne procesory wykonują ten sam program na różnych segmentach danych) równoległością sterowania (oddzielne procesory wykonują ten sam program, ale każdy ma przypisany inny ciąg obliczeń) równoległością zadań (każdy procesor ma przydzieloną sobie inną część tego samego programu do wykonania) występuje wtedy, gdy oddzielne procesory wykonują ten sam program na różnych segmentach danych oddzielne procesory wykonują ten sam program, lecz każdy ma inny przypisany sobie ciąg obliczeń oddzielne procesory wykonują ten sam program, lecz każdy procesor ma przydzieloną sobie inną część tego programu do wykonania

System rozproszony (ang. distributed system) jest zbiorem samodzielnych komputerów połączonych za pomocą sieci i wyposażonych w rozproszone oprogramowanie systemowe Oprogramowanie systemu rozproszonego umożliwia komputerom koordynowanie ich działań oraz dzielenie zasobów systemu: sprzętu, oprogramowania i danych.

Własności decydujące o użyteczności systemu rozproszonego dzielenie (wspólne użytkowanie) zasobów otwartość współbieżność skalowalność tolerowanie uszkodzeń przezroczystość

Dzielenie zasobów Modele systemów rozproszonych: model klient – serwer: wszystkie zasoby dzielone są utrzymywane i zarządzane przez procesy serwerów model oparty na obiektach: za obiekt uważa się każdy zasób dzielony, proces żądający dostępu do zasobu wysyła komunikat do odpowiedniego obiektu

Model klient - serwer proces klienta proces serwera S S S S K K K K K Kiedykolwiek procesy klientów potrzebują dostępu do któregoś z zasobów, zwracają się z zamówieniem do opiekującego się nim serwera, jeśli zamówienie jest poprawne, to serwer wykonuje żądaną czynność i wysyła odpowiedź do procesu klienta, Proces serwera może korzystać z usług innego serwera stając się klientem wobec tego drugiego. Ze względu na wydajność działania niektóre rodzaje zasobów muszą być utrzymywane lokalnie na każdym komputerze. Za minimalny zbiór takich zasobów uważa się na ogół pamięć o swobodnym dostępie, procesory centralne oraz lokalny interfejs sieciowy. Te kluczowe zasoby są zarządzane przez system operacyjny każdego komputera z osobna. K proces klienta S proces serwera

Model oparty na obiektach U U U U U O Z O Z O Z O Z schemat przedstawia czysty model obiektowy . Przypomina on tradycyjny model programowania obiektowego, w którym każda jednostka jest rozpatrywana jako obiekt wyposażony w interfejs komunikacyjny umożliwiający dostęp do jego funkcji. W opartym na obiektach modelu za obiekt uważa się każdy zasób dzielony (wspólnie wykorzystywany). Obiekty są jednoznacznie identyfikowane i mogą być dowolnie przemieszczane w obrębie sieci bez zmiany ich identyfikacji. Jeśli program posługujący się zasobem zażąda do niego dostępu to wysyła komunikat do odpowiedniego obiektu zawierający zamówienie. komunikat jest przekazywany odpowiedniemu procesowi, który wykonuje wymaganą operację i odsyła (jeśli to konieczne) komunikat z odpowiedzią do zamawiającego procesu. W modelu klient-serwer schemat nazewniczy stosowany do zasobów zmienia się w zależności od zarządzającego nim usługodawcy, natomiast w modelu obiektowym użytkownicy zasobów mogą odwoływać się do wszystkich zasobów w sposób jednolity. obiekt i zarządca U użytkownik obiektu

Otwartość systemu komputerowego charakteryzuje jego zdolność do rozszerzania różnymi sposobami. jest określona przede wszystkim przez możliwości dodawania nowych usług dzielenia zasobów bez naruszania lub podwajania usług już istniejących System może być otwarty lub zamknięty ze względu na rozszerzenia sprzętowe, np. dodawanie urządzeń zewnętrznych, pamięci lub interfejsów komunikacyjnych, czy też ze względu na rozszerzanie oprogramowania, czyli dodawanie nowych właściwości do systemu operacyjnego i usług dzielenia zasobów.

Otwartość systemu rozproszonego systemy otwarte charakteryzują się tym, że dane na temat ich kluczowych interfejsów są podawane do powszechnej wiadomości opierają się na mechanizmie jednolitej komunikacji międzyprocesorowej i upowszechnionych interfejsach dostępu do zasobów wspólnych Dostępność komunikacji międzyprocesorowej w systemach operacyjnych oraz standardowe protokoły komunikacyjne powiększyły możliwość uzyskiwania otwartości systemów Procesy usługowe działające na dowolnym komputerze i pod dowolnym systemem operacyjnym mogą oferować dostęp do ich zasobów innym procesom działającym na komputerach w tej samej sieci

Współbieżność W systemie rozproszonym opartym na modelu dzielenia zasobów istnieją dwie sytuacje, w których występują działania równoległe: wielu użytkowników jednocześnie wydaje polecenia lub współpracuje z programami użytkowymi wiele procesów serwerów działa współbieżnie, odpowiadając na zamówienia pochodzące od procesów różnych klientów zachodzi wtedy, gdy na zamówienie każdego z aktywnych użytkowników działa jeden lub więcej procesów aplikacji, w większości architektur systemów procesy aplikacji działają na stacjach roboczych użytkowników, gdy ona ma tylko jeden procesor, to procesy wykonywane są na przemian, jeśli kilka, to umożliwia równoległe przeprowadzanie kilku obliczeń ten przypadek wynika z istnienia jednego lub więcej procesów usługowych dla każdego typu zasobu

Współbieżność Współbieżność wykonywania w systemach rozproszonych jest wynikiem osobnych działań użytkowników, niezależności zasobów i rozmieszczenia procesów usługowych w oddzielnych komputerach. Odrębność tych działań umożliwia równoległe przetwarzanie w osobnych komputerach Współbieżny dostęp do wspólnie wykorzystywanych zasobów i ich aktualizacje muszą być synchronizowane.

Skalowalność Zakłada się, że żaden pojedynczy zasób nie występuje w formie ograniczonej Ze wzrostem zapotrzebowania powinno być możliwe rozszerzanie systemu tak, aby mógł je spełnić. np. można założyć, że częstotliwość kontaktu z plikami będzie rosnąć ze wzrostem liczby użytkowników i stacji roboczych w systemie rozproszonym.

Tolerowanie uszkodzeń Dwa podejścia, na których opierają się systemy komputerowe tolerujące uszkodzenia: redundancja sprzętowa – użycie nadmiarowych składowych odtwarzanie programowe – zaprojektowanie programów do usuwania skutków uszkodzeń skuteczniej realizowane w systemach rozproszonych niż w systemach o bardziej scentralizowanych architekturach w scentralizowanych stosuje się komputer dodatkowy jako maszynę rezerwową – podwojony koszt , w systemach rozproszonych zwielokrotnianie może dotyczyć poszczególnych serwerów, które mogą być tak oprogramowane, aby wykrywały uszkodzenia w innych serwerach. Gdy nastąpi wykrycie uszkodzenia klientów kieruje się do pozostałych serwerów wymaga zaprojektowania oprogramowania do odtwarzania (czy przywracania) stanu trwałych danych po wystąpieniu awarii

Przezroczystość Przezroczystość -ukrywanie przed użytkownikiem i programistą aplikacji oddzielności składowych Przezroczystość dostępu (umożliwia dostęp do lokalnych i odległych obiektów informacji za pomocą identycznych działań) Przezroczystość położenia (umożliwia dostęp do obiektów informacji bez znajomości ich lokalizacji) Nazywa się je wspólnie przezroczystością sieci (system jest postrzegany jako całość)

użycie adresu poczty elektronicznej, np. Flinstone@stoneit.co Przezroczystość Przykład 6: Występowanie przezroczystości sieci: użycie adresu poczty elektronicznej, np. Flinstone@stoneit.co wysyłanie poczty nie wymaga znajomości jego fizycznego lub sieciowego położenia – przezroczystość położenia procedura wysyłania komunikatu pocztowego nie zależy od położenia odbiorcy – przezroczystość dostępu adres składa się z nazwy użytkownika i nazwy domeny, domeny są definiowane i zaopatrywane w nazwy według struktury organizacyjnej, nazwy kont przydziela się użytkownikom w ramach domeny

Komunikacja między procesami Składowe systemu rozproszonego są rozłączne zarówno logicznie, jak i fizycznie i muszą się komunikować aby mogły współdziałać. Rozproszone systemy i aplikacje są tworzone z oddzielnych składowych oprogramowania, współpracujących przy wykonywaniu zadań. Wszystkie składowe, które w systemach rozproszonych wymagają dostępu do zasobów lub go umożliwiają, są realizowane w postaci procesów. W systemach klient-serwer proces klienta musi współdziałać z procesem serwera, ilekroć potrzebuje dostępu do zasobu, którym sam nie zarządza – sprzętowego, programowego lub danych.

Komunikacja miedzy procesami Mechanizm komunikacji może być: synchroniczny – inaczej „z blokowaniem”, czyli nadawca czeka po wysłaniu komunikatu do czasu, aż odbiorca wykona operację odbioru asynchroniczny – inaczej „bez blokowania”, co znaczy, że komunikat jest umieszczany w kolejce komunikatów oczekujących na przyjęcie przez odbiorcę, a proces nadawczy może kontynuować działanie natychmiast.

Schemat komunikacji synchronicznej proces, który chce wysłać komunikat czeka aż inny proces będzie chciał go odebrać proces, który chce odebrać komunikat czeka, aż inny proces będzie chciał go wysłać przekazanie komunikatu może się odbyć jedynie przy udziale zainteresowanych procesów ( bez pośrednika)

Schemat komunikacji asynchronicznej proces, który chce wysłać komunikat nie czeka, aż ktoś będzie chciał go odebrać, tylko umieszcza go w buforze proces, który chce odebrać komunikat czeka, aż będzie dla niego komunikat lub kończy odbiór komunikatu sygnalizując błąd

Cechy komunikacji asynchronicznej wysyłanie komunikatu nie wstrzymuje nadawcy (z pewnymi wyjątkami) wysłane i jeszcze nie odebrane komunikaty są przechowywane w buforze bufor może być nieograniczony lub ograniczony; próba wysłania komunikatu do pełnego bufora może kończyć się błędem lub wstrzymaniem procesu wysyłającego odbieranie komunikatów może zakończyć się wstrzymaniem nadawcy (wersja blokująca) lub błędem (wersja nieblokująca)

Komunikacja miedzy procesami systemy asynchroniczne używają przepływu danych w jedną stronę (nadawca może wysłać komunikat i kontynuować zadanie, odbiorca wysyła odrębny komunikat) systemy synchroniczne tworzą kanał komunikacyjny między dwoma procesami

Komunikacja między procesami Istotną różnicą między tymi dwoma schematami jest potrzeba buforowania komunikatów. komunikacja asynchroniczna: nadawca może wysłać wiele komunikatów, zanim odbiorca je odbierze z kanału komunikacyjnego, zatem musi być możliwość buforowania nieograniczonej liczby komunikatów ( jeśli liczba komunikatów w buforze jest ograniczona nadawca zostaje wstrzymany)

Komunikacja między procesami komunikacja synchroniczna: w dowolnym momencie w kanale jest co najwyżej jeden komunikat, zatem buforowanie jest zbędne

Różnica między systemem telefonicznym a pocztowym. Przykład 7 Różnica między systemem telefonicznym a pocztowym. rozmowa telefoniczna synchronizuje działania dzwoniącego i osoby odbierającej telefon, problemy związane z synchronizacja powodują np. sygnały zajętości, nieodbieranych telefonów itp. do skrzynki pocztowej można wrzucać dowolną ilość listów, odbiorca zaś może przejrzeć pocztę w dowolnym momencie – brak synchronizacji

Sposoby adresowania komunikatów identyfikacja symetryczna – komunikujące się procesy znają swoje nazwy identyfikacja asymetryczna – jedna ze stron nie wie z kim się komunikuje, charakterystyczna dla architektury klient – serwer komunikat może być wysłany po konkretnym kanale komunikacyjnym – wysyłający nie musi wiedzieć do kogo trafi komunikat

Komunikacja miedzy procesami Schematy komunikacji najczęściej stosowane w systemach rozproszonych: model komunikacji klient-serwer służący do komunikacji między parami procesów model komunikacji na zasadzie rozsyłania grupowego przydatny w łączności między grupami współpracujących procesów

Komunikacja klient - serwer (zablokowany) SERWER 2.przetwarzanie 1. zamówienie 3. odpowiedź Nastawiony jest na dostarczanie usług, można w nim wyróżnić następujące etapy: przesłanie zamówienia od procesu klienta do procesu serwera wykonanie zamówienia przez serwer przesłanie odpowiedzi do klienta Ten schemat komunikacji zawiera przesłanie dwu komunikatów oraz specyficzną formę synchronizacji klienta i serwera. Proces serwera musi spostrzec komunikat z zamówieniem w kroku 1 możliwie jak najszybciej po jego nadejściu, a działania powodujące w procesie klienta wydanie zamówienia należy zawiesić (zablokować), wskutek czego proces czeka po wykonaniu kroku1, aż otrzyma odpowiedź w kroku3. Zauważmy, że proces staje się klientem lub serwerem tylko ze względu na konkretną wymianę informacji lub ciąg takich wymian, i podobnie klient może być serwerem dla innych procesów.

Rozsyłanie grupowe P3 P2 P1 P4 odbierz odbierz odbierz odbierz W schemacie komunikacji rozsyłania grupowego procesy współdziałają, przekazując komunikaty. W tym przypadku adresatem komunikatu nie jest jeden proces, lecz grupa procesów. Jednej operacji grupowego wyślij odpowiada operacja odbierz, wykonana przez każdego członka grupy procesów. Wysyłanie do grupy

Rozsyłanie grupowe Komunikację w trybie rozsyłania grupowego można uzasadnić następującymi przykładami: Odnajdywanie obiektu Tolerowanie uszkodzeń Zwielokrotnione aktualizacje klient rozsyła komunikat z nazwą katalogu plików do grupy procesów serwerów plików. Na zamówienie odpowiada tylko ten, który przechowuje potrzebny katalog. klient rozsyła zmówienia do grupy procesów usługowych, z których każdy przetwarza je identycznie, po czym jeden lub więcej wysyła odpowiedź. Grupa dwu lub więcej serwerów może zapewnić ciągłą obsługę, nawet w wypadku awarii jednego lub większej ich liczby zdarzenie w rodzaju „jest godzina 18:01” można rozsyłać do grupy zainteresowanych procesów

Komunikacja grupowa Przykład 8: Prosty kantor kupiecki, który można stworzyć za pomocą dwóch różnych zadań: proces dostawcy informacji wciąż obiera nowe dane handlowe z pojedynczego źródła i przekazuje do wszystkich kupców, którzy zgłosili zainteresowanie danym towarem (dla każdego zewnętrznego źródła będzie działał osobny proces dostawcy informacji) Rozważmy prosty system kantoru kupieckiego, który ma za zadanie umożliwić kupcom używającym stacji roboczych orientowanie się w cenach rynkowych towarów, którymi obracają. Informacja do kantoru kupieckiego dociera z wielu różnych zewnętrznych źródeł i jest gromadzona przez procesy, które nazywamy dostawcami informacji. Kupcy są z reguły zainteresowani tylko swoimi specjalistycznymi towarami

Komunikacja grupowa proces kupiecki jest tworzony wtedy, gdy użytkownik zamówi informacje o jakimś towarze – proces kupiecki zgłasza zapotrzebowanie na wiadomości u dostawcy informacji i po dokonaniu tego odbiera wszystkie wysyłane do niego informacje i wyświetla użytkownikowi (dla każdego towaru potrzebnego użytkownikowi jest wymagany osobny proces kupiecki) Dostawca informacji musi wysyłać informacje do wszystkich procesów kupieckich, które zgłosiły zainteresowanie towarem. Aby zachować uczciwość wobec kupców zainteresowanych danym towarem wszyscy zainteresowani muszą otrzymać te same informacje i w tej samej kolejności.

Komunikacja grupowa stacja robocza źródło zewnętrzne stacja robocza K dostawca informacji 1 K stacja robocza stacja robocza K Jeśli założymy, że źródła zewnętrzne dotyczą różnych towarów, to wystarczy, aby komunikaty od dostawców informacji docierały do wszystkich kupców w porządku ich wysyłania – uporządkowanie FIFO. Gdy informacja dostawca informacji 2 K K K K źródło zewnętrzne źródło komunikatu

Programowanie rozproszone Wysyłanie komunikatu jest akcją wyższego poziomu, która może być łatwo zaimplementowana na fizycznie rozproszonych procesorach, stąd nazwa nadana tej dziedzinie: programowanie rozproszone lub przetwarzanie rozproszone.

Komunikacja miedzy procesami Sposoby organizowania komunikacji miedzy identyczne działającymi procesami: rozgłaszanie (broadcasting) bicie serca (heartbeating) przekazywanie żetonu (token passing) wspólny worek (common bag)

Komunikacja miedzy procesami Rozgłaszanie to rozsyłanie tego samego komunikatu do wszystkich procesów

Komunikacja miedzy procesami Bicie serca polega na wielokrotnym wykonaniu czynności: wysłanie informacji do procesów sąsiednich odebranie od nich odpowiedzi przetworzenie odpowiedzi ponowne rozesłanie informacji

Komunikacja miedzy procesami Przekazywanie żetonu jest techniką stosowaną głównie do synchronizacji procesów w systemach rozproszonych. Żeton jest pewnym wyróżnionym komunikatem kolejno przekazywanym miedzy procesami tworzącymi zamknięty pierścień

Komunikacja miedzy procesami Wspólny worek zawiera zbiór komunikatów z opisem i parametrami działań do wykonania. Każdy proces pobiera taki komunikat, wykonuje działanie i wynik wkłada z powrotem do worka. Wyróżniony proces wkłada do worka komunikaty inicjujące i pobiera z niego wyniki.

Problem pięciu filozofów Najbardziej znany przykład nieustającej współbieżności ilustrujący wiele zagadnień synchronizacji i współpracy. Problem jest wzorcem wielu sytuacji z zakresu programowania współbieżnego i rozproszonego, np. współzawodnictwo wielu procesorów o pewne zasoby dzielone w komputerowych systemach operacyjnych.

Problem pięciu filozofów Stół, wokół którego osadzono 5 filozofów.Pośrodku stoi talerz z nieograniczoną ilością spaghetti. W połowie odległości między każdymi dwoma filozofami leży jeden widelec – i tu jest problem, ponieważ nikt nie może jeść spaghetii jednym widelcem. Zakładany cykl życia filozofa składa się z: wykonywania czynności własnych (myślenia i zapisywania wyników w celu publikacji) zgłodnienia próba jedzenia jedzenie powrót do czynności własnych Używanie widelców, będących poza zasięgiem filozofa jest zabronione. Jedzenie można potraktować jako rodzaj sekcji krytycznej, gdyż dwóch siedzących obok filozofów nie może jeść jednocześnie. Widelce są zasobami krytycznymi, ponieważ nie mogą być użyte jednocześnie przez dwóch filozofów. Inna wersja: ryż i pałeczki. W 3 F 5 F 4 W 4

Problem pięciu filozofów Rozwiązanie z możliwością blokady Zgłodniały filozof czeka aż będzie wolny lewy jego widelec, podnosi go i następnie czeka, aż będzie wolny prawy widelec i także go podnosi. Po najedzeniu się odkłada oba widelce na stół.

Problem pięciu filozofów Blokada – gdy każdy chwyci w tym samym momencie swój lewy widelec i będzie czekał aż jego prawy sąsiad skończy jeść i odłoży widelec. Typowy przykład zjawiska blokady, w której uczestniczą wszystkie współdziałające procesy.

Problem pięciu filozofów Semafor binarny Widelec[i] reprezentuje widelec o numerze i Podniesienie widelca – opuszczenie semafora Odłożenie widelca – podniesienie semafora Wartości początkowe: For i:=1 to 5 do Widelec[i]:=1;

Problem pięciu filozofów Proces Filozof(i); begin j:=(i+1) mod 5; while true do myślenie; pobierz(Widelec[i]); pobierz(Widelec[j]); jedzenie; odłóż(Widelec[i]); odłóż(Widelec[j]); end; end;

Problem pięciu filozofów Rozwiązanie poprawne Sami filozofowie nie są w stanie rozwiązać problemu odżywiania, jeśli będą obstawać przy tym, aby żaden z nich nie był wyróżniony. Potrzebny jest zewnętrzny arbiter rozstrzygający, którzy filozofowie będą mieli pierwszeństwo w spornych przypadkach. Może być nim np. lokaj, który będzie dbał o to, aby w każdej chwili co najwyżej czterech filozofów konkurowało o widelce. Rozwiązanie wyklucza blokadę (przynajmniej jeden z nich będzie mógł podnieść oba widelce i jeść) oraz zagłodzenie ( lokaj powstrzyma jednego z nich do czasu, aż któryś z pozostałych czterech skończy jeść)

Problem pięciu filozofów Semafor Lokaj dopuszcza co najwyżej czterech filozofów do współzawodnictwa o widelce. Początkowe wartości: For i:=1 to 5 do Widelec[i]:=1; Lokaj:=4;

Problem pięciu filozofów Proces Filozof(i); begin j:=(i+1)mod 5; while true do begin myślenie; Podnieś(Lokaj); Pobierz(Widelec[i]);Pobierz(Widelec[j]); jedzenie; Odłóż(Widelec[i]);Odłóż(Widelec[j]); end;

Problem pięciu filozofów Rozwiązanie z możliwością zagłodzenia Filozof podnosi jednocześnie oba widelce, gdy tylko są wolne. Blokada nie wystąpi – jeśli podniesie widelce, to w skończonym czasie je odłoży. Zagłodzenie – jeśli zawsze któryś z sąsiadów będzie jadł.

Problem pięciu filozofów Dla każdego filozofa jest zapamiętane ile leżących przy nim widelców jest wolnych – tablica Wolne[i], i=0..4. Do wstrzymywania każdego procesu stosowana jest tablica Filozof[i], i=0..4

Problem pięciu filozofów Monitor: Proces, zgłaszając żądanie przydziału widelców, podaje swój numer – na jego podstawie można stwierdzić, czy oba widelce są wolne (tablica Wolne). Jeśli nie, to proces jest wstrzymywany (tablica Filozof) – dzięki temu po odłożeniu przez jednego widelców można próbować wznowić tylko jego sąsiadów

Problem pięciu filozofów Wartości początkowe: For i:=0 to 4 do begin Wolne[i]:=2; Filozof[i]:=0; end;

Problem pięciu filozofów Procedury monitora procedure Biorę(i: integer); begin while Wolne[i]<2 do czekaj(Filozof[i]) Wolne[(i+5)mod 5]:=Wolne[(i+5)mod 5]-1; Wolne[(i+1)mod 5]:=Wolne[(i+1)mod 5]-1; end;

Problem pięciu filozofów procedure Odkładam(i:integer); begin Wolne[(i+5)mod 5]:=Wolne[(i+5)mod 5]+1; Wolne[(i+1)mod 5]:=Wolne[(i+1)mod 5]+1; Próbuj(Filozof[(i+5)mod 5]); Próbuj(Filozof[(i+1)mod 5]); end;

Problem pięciu filozofów Bardziej efektywne Odkładam: procedure Odkładam(i:integer); Wolne[(i+5)mod 5]:=Wolne[(i+5)mod 5]+1; Wolne[(i+1)mod 5]:=Wolne[(i+1)mod 5]+1; if Wolne[(i+5)mod 5] =2 then Próbuj(Filozof[(i+5)mod 5]); if Wolne[(i+1)mod 5] =2 then Próbuj(Filozof[(i+1)mod 5]); end;

Mechanizmy wysokopoziomowe w językach programowania współbieżnego Mechanizmy komunikacji i synchronizacji: semafory monitory (Pascal_C, Concurrent Pascal, Pascal Plus i in.) spotkania - mogą być symetryczne (dwoje ludzi - CSP) i asymetryczne (wizyta klienta w zakładzie naprawczym - Ada) przestrzeń krotek - nie trzeba znać ani dostawców ani odbiorców informacji (Linda) potoki (DOS) komunikaty i kanały (Unix)

Semafory były pierwszym mechanizmem synchronizacyjnym stosowanym w językach wysokiego poziomu oprócz określenia jego stanu początkowego można na nim wykonywać tylko dwie operacje : podniesienie semafora (wait) i opuszczenie semafora (signal) rodzaje semaforów: ogólny i binarny

Zasada działania semafora opuszczenie semafora S, to wykonanie instrukcji: jeśli S>0, to S:=S-1 w przeciwnym razie wstrzymaj działanie procesu wykonującego tą operację podniesienie semafora s, to wykonanie instrukcji: jeśli są procesy wstrzymane w wyniku wykonania operacji opuszczania semafora s, to wznów jeden z nich, w przeciwnym razie S:=S+1

Schemat synchronizacji przy pomocy semafora Proces A Proces B signal(S) wait(S) S=0 ktoś czeka S:=S-1 S:=S+1

Semafory Ponieważ operacje podniesienia i opuszczenia semafora są niepodzielne, w danej chwili tylko jeden proces może badać stan semafora S i ewentualnie zmniejszyć lub zwiększyć jego wartość

Ograniczenia nie można wykonywać na nim działań arytmetycznych brak informacji o tym ile procesów zostało wstrzymanych na danym semaforze często trzeba oprócz semafora wprowadzać zmienne pomocnicze (całkowite) programista musi sam zadbać, aby zmienne te były odpowiednio modyfikowane wszelkie operacje na tych zmiennych muszą być sekcja krytyczną

Semafory Problemy, które można poprawnie rozwiązać za pomocą semaforów: wzajemne wykluczanie dwóch procesów producenci i konsumenci czytelnicy i pisarze pięciu filozofów przejazd przez wąski most gra w „łapki”

Monitory koncepcja monitora powstała w wyniku poszukiwań strukturalnego mechanizmu do synchronizacji procesów monitor to zebrane w jednej konstrukcji programowej pewne wyróżnione zmienne oraz procedury i funkcje działające na tych zmiennych część tych procedur i funkcji jest udostępniana na zewnątrz monitora

Monitory tylko wywołanie udostępnionych funkcji i procedur monitora umożliwia procesom dostęp do zmiennych ukrytych wewnątrz monitora wykonanie procedury monitora jest sekcją krytyczna wykonującego ją procesu istnieje możliwość wstrzymywania i wznawiania procesów wewnątrz procedury monitorowej służą do tego specjalne zmienne typu condition

Przejście procesu przez monitor Monitor M Proces A procedure P(x:real); begin …. wait(C); …… signal(C); end; M.P(y) procesy oczekujące na wejście procesy oczekujące na C procesy wstrzymane po signal

Monitory Problemy, które mogą być poprawnie rozwiązane przy pomocy monitorów: producenci i konsumenci z losową wielkością pobieranych i wstawianych porcji prom jednokierunkowy trzy drukarki stolik dwuosobowy

Pascal_C powstał w Instytucie Informatyki Uniwersytetu Warszawskiego (S.Kurpiewski „Język Pascal_C”,praca magisterska) jest podzbiorem języka Pascal rozszerzonym o instrukcje programowania współbieżnego: cobegin, coend, oraz o możliwość deklarowania monitorów i procesów w taki sam sposób, jak funkcje i procedury w monitorze deklaracje udostępnianych procedur poprzedza się słowem export

Concurrent Pascal jest jedną z pierwszych prób rozszerzenia Pascala o mechanizmy umożliwiające programowanie współbieżne zaproponowany przez Brinch Hansena (Brinch Hansen „The programming language – Concurrent Pascal”, IEEE trans of Software Eng., tom 2,str 199-207) istnieje mozliwośc zdefiniowania specjalnego typu monitorowego i specjalnego typu procesowego

Concurrent Pascal nazwy udostępnianych procedur poprzedza się słowem entry typowi condition odpowiada typ queue kolejki procesów mogą być co najwyżej jednoelementowe, jeśli trzeba wstrzymać w monitorze więcej procesów należy użyć tablicy zadeklarowanej jako typ queue

Tworzenie gniazd gniazdo spełniające rolę klienta stara się nawiązać połączenie ze zdalnym gniazdem serwera (musi znać IP, lub nazwę hosta, numer portu na którym serwer nasłuchuje) po zlokalizowaniu gniazda serwera klient wysyła żądanie nawiązania komunikacji gdy serwer zaakceptuje żądanie klienta, przesyła do niego specyfykację nowego gniazda (które zrealizuje połączenie po jego stronie) klient kończy fazę nawiązania połączenia (może się rozpocząć wymiana danych)

Tworzenie gniazd na karcie Internet są dostępne dwa komponenty TClientSocket oraz TSerwerSocket rola gniazda serwera polega na stałym oczekiwaniu i obsłudze żądań nawiązania komunikacji otrzymywanych od gniazd klienckich jeśli serwer akceptuje dane połączenie, wówczas tworzy specjalne gniazdo, które będzie odpowiedzialne za komunikację z klientem nasłuchujące gniazdo serwera nadal biernie oczekuje na nadchodzące żądania

Linie papilarne porównywanie całych odcisków palców nie jest skutecznym sposobem wyszukiwania podobnego wzorca w bazie danych, gdyż drobne przesunięcia lub inne prawie niewidoczne zmiany powodowałyby drastyczną zmianę wyniku porównania.

Linie papilarne na podstawie badań stwierdzono, że w celu usunięcia takiej sytuacji przy jednoczesnym zachowaniu wiarygodności otrzymywanych wyników wystarczy porównywać istnienie i położenie pewnych cech odcisków zwanych punktami charakterystycznymi

Linie papilarne punkty charakterystyczne odcisku są to miejsca zakończeń i rozwidleń linii papilarnych, na podstawie których można z dużym prawdopodobieństwem jednoznacznie określać tożsamość osoby o danym odcisku już około 16 punktów charakterystycznych wystarczy do jednoznacznego określenia przynależności badanego odcisku do konkretnej osoby

Linie papilarne dla uproszczenia założono, że grubość linii papilarnych wynosi 1 piksel

Linie papilarne założono, że odciski w bazie są dobrze zorientowane i użytkownik wprowadzając wzorzec również dokonuje wstępnej obróbki do odpowiedniego formatu dopuszcza się, że po takich zmianach odcisk nie będzie w stu procentach dobrze sformatowany i granica błędu mierzona w pikselach podawana jest jako parametr funkcji obliczającej zgodność punktów charakterystycznych

Linie papilarne Schemat działania dla jednego procesora: najpierw pobierz wzorzec, potem wyszukaj punkty charakterystyczne i zapamiętaj wynik należy już kolejno pobierać odciski z bazy, wyszukiwać w nich punkty charakterystyczne, a następnie porównywać z wzorcem.

Linie papilarne Wyszukiwanie punktów charakterystycznych przy przyjętych założeniach sprowadza się do: zbadania otoczenia punktu podejrzanego o bycie punktem charakterystycznym rozpatrzeniu kilkunastu możliwości przy założonej grubości linii równej 1 piksel, otoczeniem jest tablica o wymiarach 3*3, więc sprawdzenie wszystkich możliwości jest bardzo szybkie.

Linie papilarne Porównywanie polega na: badaniu, czy dla punktu charakterystycznego z wzorca A istnieje punkt charakterystyczny w odpowiadającym mu obszarze (co do dokładności podanej przez użytkownika) we wzorcu B na podstawie tych porównań tworzona jest charakterystyka zgodności odcisków, która za pomocą jednej z wielu możliwych interpretacji (minimum, maksimum, zgodność w dwie strony, itp) przekształcana jest na wartość procentową zgodności odcisków.

Linie papilarne potrzeba zrównoleglenia kryje się w rozmiarach bazy danych porównanie wzorca z względnie małą (10 - 1000 odcisków) bazą danych trwa bardzo krótko nawet dla jednego procesora gdy tych odcisków jest wiele setek tysięcy (bądź milionów), wtedy to sprawdzanie trwałoby kilka godzin,

Przykładowy wynik działania aplikacji: punkty niebieskie- rozwidlenia, zielone- punkty końcowe

Linie papilarne dwie metody kolejkowania: "dyktatura" - gdy jeden z procesorów zajmuje uprzywilejowaną pozycję i nie zajmuje się obliczeniami tylko kieruje pracami pozostałych, mankamentem modelu jest bardzo obciążony system komunikacji między procesorami

Linie papilarne "demokracja" - każdy procesor otrzymuje tyle samo pracy do wykonania, niedogodnością może być nierówna praca poszczególnych procesorów, a przez to wydłużenie czasu działania programu (program pracuje z szybkością najwolniejszego procesora).

Linie papilarne prezentowany jest czas przetwarzania w zależności od zastosowanego modelu kolejkowania oraz wykorzystywanej liczby procesorów w doświadczeniu jako wzorzec został wzięty nieznacznie przerobiony odcisk znajdujący się w bazie wszystkie próby zostały wykonane dla tego samego odcisku.

Uzyskane wyniki przedstawia następujący wykres

Linie papilarne dla demokracji minimalne czasy działania nie maleją wraz ze wzrostem liczby procesorów tylko są funkcją nieciągłą prawdopodobną przyczyną takiego stanu rzeczy jest to, że komputer jest wykorzystywany także do innych celów i ten projekt w niektórych momentach musiał ustąpić pola innym zadaniom

Linie papilarne  dla dyktatury możemy zauważyć zwiększenie wydajności programu wraz ze zwiększaniem liczby procesorów największy wzrost wydajności ma miejsce przy niskiej liczbie procesorów po przekroczeniu liczby czterech procesorów wzrost wydajności gwałtownie maleje i przy dalszym zwiększaniu utrzymuje się na prawie stałym poziomie

Linie papilarne powodem tego jest to, że dużą część działania algorytmu pochłaniają operacje wejścia/wyjścia (wczytywanie odcisków) prawdopodobnie system ma ograniczone możliwości zwielokrotniania operacji dostępów do dysków, gdyż jest nastawiony na wykonywanie obliczeń nie może zatem w efektywny sposób obsłużyć zwiększającej się liczby odwołań do dysku, co skutkuje ustaleniem wydajności na w miarę stałym poziomie.

Linie papilarne demokracja jest zdecydowanie lepsza dla mniejszej liczby procesorów, pozwala lepiej gospodarować mocą obliczeniową procesorów wraz ze zwiększaniem liczby procesorów przewaga maleje i dla większej liczby przewagę ma dyktatura w demokracji wszystkie procesory muszą bowiem czekać na najwolniejszego, powoduje to obniżenie wydajności tej strategii.

Izomorficzność grafu.   Implementacja na maszynie równoległej algorytmu równoległego sprawdzającego izomorficzność grafu Graf G jest izomorficzny z grafem H jeśli istnieje takie, różnowartościowe i „na”, przyporządkowanie wierzchołków grafu H wierzchołkom grafu G , że jeśli jakieś dwa wierzchołki są połączone krawędzią w jednym z grafów, to odpowiadające im wierzchołki w drugim grafie również łączy krawędź

Macierz przyległości macierz przyległości M przedstawia ilość ścieżek długości 1 pomiędzy każdymi dwoma wierzchołkami w G natomiast suma i-tego wiersza w macierzy M to stopień wierzchołka Vi.

Potęga macierzy przyległości macierz Mk (1≤k≤n) przedstawia ilość ścieżek długości k pomiędzy każdymi dwoma wierzchołkami natomiast suma i-tego wiersza w macierzy Mk to ilość ścieżek długości k (stopień k-ścieżek) rozpoczynających się w wierzchołku Vi.

Algorytm 1. Główny procesor przesyła macierze A i B do p procesorów 2. for k←1 to parallel-do for i←k to n step p do if (otrzymałem „exit”) then return false C←Ai, D←Bi if (test(C,D)=false) then wyślij „exit” do innych procesów return false if (i>n) then print „kończe działanie”

Algorytm 3. If (wszystkie procesory skończyły pomyślnie) then return true Funkcja test(C,D) zwraca: true - kiedy istnieje taka funkcja f:C→D false - w przeciwnym przypadku

Pomiar prędkości algorytmu dla grafów o 180 wierzchołkach

Algorytmy ALGORYTM CENTRALNEGO SERWERA stworzenie serwera koordynującego (udzielającego pozwoleń) wejście procesów do sekcji krytycznej jest jedną z podstawowych i najprostszych metod realizacji wzajemnego wykluczania w środowisku rozproszonym przy założeniu, że istnieje tylko jedna sekcja krytyczna, proces, który chce wejść do zasobu dzielonego wysyła do serwera komunikat z zamówieniem i oczekuje na odpowiedź, często porównywaną do otrzymania żetonu dającego prawo do wejścia

ALGORYTM CENTRALNEGO SERWERA w sytuacji gdy sekcja krytyczna jest pusta serwer natychmiast "wręcza" procesowi żeton, a proces może wejść do sekcji jeżeli żeton jest w posiadaniu innego procesu (żeton jest tylko jeden - spełnienie warunku, że w sekcji może w danej chwili znajdować się tylko jeden proces), wówczas proces zamawiający jest ustawiany w kolejce serwera

ALGORYTM CENTRALNEGO SERWERA wychodząc z sekcji krytycznej każdy z procesów zwraca żeton serwerowi, wysyłając jednocześnie komunikat o opuszczeniu sekcji w przypadku gdy serwer udostępnia wejście do sekcji procesom znajdującym się w kolejce (w danej chwili tylko pierwszemu z nich), wówczas kieruje się priorytetem najstarszego wpisu pozwolenie na wejście uzyskuje proces, który ustawi się w kolejce najwcześniej

ALGORYTM CENTRALNEGO SERWERA widać sytuację, w której w sekcji krytycznej znajduje się proces P3 (jest w posiadaniu żetonu), proces P4 wysłał już zamówienie żetonu do serwera wcześniej, natomiast proces P2 wysyła właśnie zamówienie na żeton

ALGORYTM CENTRALNEGO SERWERA Kolejny krok algorytmu pokazuje zachowanie się poszczególnych procesów oraz żetonu. Proces P2 ustawił się w kolejce lokalnej serwera, żeton został zwrócony i natychmiast zostanie przekazany procesowi zamawiającemu najwcześniej, tzn. procesowi P4

ALGORYTM CENTRALNEGO SERWERA proces P4 znajduje się w sekcji, na początku kolejki znalazł się proces P2, a kolejne procesy mogą wysyłać zamówienia

ALGORYTM CENTRALNEGO SERWERA algorytm ten spełnia warunki wymienione jako warunki wzajemnego wykluczania. jednak system z zastosowaniem pojedynczego serwera jest podatny na awarie bardzo brzemienne w skutkach ze względu na to, że przez serwer przechodzą wszystkie operacje, jego uszkodzenie może być bardzo niebezpieczne dla całego systemu z tego powodu opisany algorytm jest jedynie obrazem przedstawiającym podstawy realizacji wzajemnego wykluczania i nie jest stosowany w rozwiązaniach systemów rozproszonych

Algorytm Lamporta spełnia warunki bezpieczeństwa, ruchu i uporządkowania algorytm zakłada, że wszystkie procesy w systemie posiadają lokalną kolejkę przechowującą komunikaty żądania innych procesów oraz znacznik czasu wysyłając komunikat, każdy proces zaopatruje go w numer dający informację, z którego procesu wysłano komunikat oraz w znacznik czasu w celu właściwego ich odbioru i interpretacji przy udzielaniu pozwolenia wejścia do sekcji proces, który chce wejść do sekcji krytycznej, tworzy komunikat żądania, który oprócz tego, że jest wysyłany do innych procesów, jest także umieszczany w kolejce procesu wysyłającego żądanie

Algorytm Lamporta komunikat taki ma swój znacznik czasu proces odbierający żądanie natychmiast wysyła odpowiedź ze znacznikiem czasu, a przybyłe żądanie umieszcza w swojej kolejce proces wysyłający żądanie będzie mógł wejść do sekcji krytycznej jeżeli jego komunikat będzie znajdował się na początku kolejki procesu wysyłającego oraz gdy jego komunikat zostanie odebrany przez inne procesy, a otrzymana odpowiedź będzie miała większy znacznik czasu od znacznika czasu żądania po opuszczeniu sekcji krytycznej proces usuwa własny numer z kolejki i zawiadamia wszystkie inne procesy w systemie o zwolnieniu zasobu dzielonego wówczas procesy otrzymujące komunikat zwalniający "czyszczą" własną kolejkę z numerem procesu opuszczającego sekcję.

Algorytm Lamporta Najistotniejszymi założeniami algorytmu Lamporta są: utrzymanie lokalnej kolejki przez wszystkie procesy komunikacja między wszystkimi procesami Stosowanie tego rozwiązania jest jednak ograniczone ze względu na możliwość zbyt dużej liczby komunikatów w systemie (przy dużej liczbie procesów) i konieczność ich wymiany co powoduje powstawanie lokalnych kolejek o ogromnych rozmiarach. Algorytm Lamporta, przy założeniu, że w systemie jest N procesów, wymagawymiany 3(N-1) komunikatów. Tak więc przy 3 procesach konieczna jest wymiana 6 komunikatów

Algorytm Lamporta

Przykładowy schemat działania algorytmu Lamporta w przypadku istnienia w systemie trzech procesów zainteresowanych wejściem do zasobu dzielonego w sytuacji a) widać, że każdy z procesów wysyła zamówienie ze znacznikiem czasu do każdego z procesów w systemie, a swój znacznik ustawia w lokalnej kolejce następnie dokonywana jest klasyfikacja zamówień od wszystkich procesów i w lokalnej kolejce są ustawiane poszczególne zamówienia, a proces z najmniejszym znacznikiem uzyskuje dostęp do sekcji krytycznej po otrzymaniu odpowiedzi od innych procesów. odpowiedzi procesów są wysyłane natychmiast po otrzymaniu komunikatów zamówień i po stwierdzeniu przez proces P3, że mają one znaczniki czasu późniejsze oraz to, że jego identyfikator jest umieszczony na początku lokalnej kolejki wchodzi on do sekcji krytycznej.

ALGORYTM RICARTA I AGRAWALI algorytm oparty na rozproszonym uzgadnianiu zwany często jako algorytm z zastosowaniem zegarów logicznych każdy proces chcący wejść do sekcji krytycznej rozsyła komunikat do wszystkich procesów w systemie i może wejść do sekcji dopiero wówczas, gdy dostanie odpowiedź od pozostałych komunikatów.

ALGORYTM RICARTA I AGRAWALI Założenia tego algorytmu są następujące: - istnieje jedna sekcja krytyczna (dla ułatwienia), - wszystkie procesy znają wzajemnie swoje adresy, - wszystkie komunikaty zostaną w końcu dostarczone, - każdy proces utrzymuje zegar logiczny (znacznik czasu)

ALGORYTM RICARTA I AGRAWALI Proces, który otrzymał od innego procesu komunikat zamawiający wejście do sekcji działa następująco: jeżeli sam wcześniej nie wysłał prośby (nie czeka na dostęp), to odpowiada pozytywnie jeżeli sam wcześniej wysłał prośbę i jeszcze nie uzyskał wszystkich odpowiedzi, to o tym kto pierwszy wykona sekcje krytyczna decyduje czas wysłania próśb: jeżeli zapytywany proces wysłał swoja prośbę później, to także odpowiada pozytywnie jeżeli prośby zostały wysłane w tym samym momencie, to o kolejności decydują priorytety (np. jeżeli zapytany proces ma wyższy numer to, odpowiada pozytywnie) w każdym innym przypadku zapytywany proces wstrzymuje się z odpowiedzią, aż do chwili, gdy sam skończy wykonywać swoja sekcje krytyczna - wówczas odpowiada pozytywnie wszystkim, którym jeszcze nie odpowiedział.

ALGORYTM RICARTA I AGRAWALI Wejście do sekcji krytycznej może nastąpić tylko wówczas gdy proces wysyłający żądanie otrzyma od każdego innego procesu odpowiedź. Gdy proces wykonał swoje zadania w sekcji krytycznej może ją opuścić informując jednocześnie o swym kroku procesy których żądania przetrzymuje w lokalnej kolejce.

ALGORYTM RICARTA I AGRAWALI sytuacja, w której mamy do czynienia z trzema procesami, z których współbieżne zamówienie wejścia do sekcji wysyłają procesy P1 i P2 oba zamawiające procesy mają znaczniki czasu odpowiednio P1- 41, a P2 – 34 proces P3 w przypadku otrzymania zamówienia odpowie natychmiast (nie jest zainteresowany wejściem do zasobu dzielonego w danej chwili) inaczej sytuacja przedstawia się w przypadku procesów zainteresowanych wejściem do sekcji proces P2 odbierając komunikat zamówienie od procesu P1 stwierdzi, że jego własne zamówienie ma znacznik czasu mniejszy niż zamówienie procesu P1 i z tego powodu nie udzieli odpowiedzi. proces P1 otrzymując komunikat od procesu P2 z mniejszym znacznikiem czasu odpowie natychmiast umożliwiając wejście do sekcji procesowi P2

ALGORYTM RICARTA I AGRAWALI W momencie opuszczenia sekcji krytycznej przez proces P2 wysyła on odpowiedź do procesu P1 umożliwiając mu wejście do sekcji. Jest to algorytm rozproszony, jednak awaria dowolnego procesu uniemożliwi działanie algorytmu Kolejną wadą jest to, że wszystkie procesy przetwarzają wszystkie zamówienia co osłabia wydajność systemu.

ALGORYTM MAEKAWY Mając do dyspozycji N procesów w systemie Maekawa podzielił go na podzbiory z uwzględnieniem pewnych warunków: pierwszy warunek zwany "regułą równego wysiłku", mówi, że podział systemu na podzbiory odbywa się w ten sposób, że każdy podzbiór ma taki sam rozmiar "Reguła niepustego przejęcia" oznacza, że dla dowolnej pary podzbiorów istnieje element, który należy do każdego z nich "Reguła równej odpowiedzialności" oznacza, że każdy proces zawiera się dokładnie w takiej samej liczbie podzbiorów Ostatni warunek oznacza, że każdy proces zawiera się we własnym podzbiorze i zwany jest "zawieraniem się we własnym podzbiorze"

ALGORYTM MAEKAWY Sposób działania algorytmu: proces, który zamierza wejść do sekcji krytycznej wysyła komunikat żądanie do wszystkich procesów z własnego podzbioru komunikat ten jest zaopatrzony w numer kolejności (lub znacznik czasu) większy niż numery kolejności odebrane wcześniej przez ten proces lub wcześniej zauważone przez proces w systemie każdy z procesów w podzbiorze otrzymujących komunikat żądanie wysyła następnie do procesu chcącego wejść do sekcji krytycznej komunikat blokada, a wcześniej zaznacza siebie jako zablokowany

ALGORYTM MAEKAWY jeżeli dojdzie do sytuacji, że proces był już wcześniej zablokowany wówczas komunikat żądanie jest umieszczany w lokalnej kolejce, a do procesu chcącego korzystać z zasobu wysyłany jest komunikat niepowodzenie wW przypadku gdy komunikat żądania ma niższy numer niż komunikat już blokujący proces w podzbiorze wówczas wysyłany jest komunikat pytanie proces otrzymujący komunikat pytanie kasuje komunikat blokowanie (jeżeli w kolejce jest komunikat niepowodzenie) i zwraca komunikat opuszczenie po odebraniu komunikatu pytanie i opuszczeniu sekcji krytycznej proces wysyła odpowiedź

ALGORYTM MAEKAWY proces, który otrzymał komunikat opuszczenie blokuje się dla komunikatu żądania z najmniejszym numerem kolejności jeżeli zaistnieje sytuacja w której wszystkie procesy z podzbioru wysłały komunikat blokowanie to proces wysyłający żądanie może wejść do sekcji krytycznej

ALGORYTM MAEKAWY

Przykładowy schemat działania algorytmu Lamporta w przypadku istnienia w systemie trzech procesów zainteresowanych wejściem do zasobu dzielonego w momencie opuszczania przez proces zasobu dzielonego wysyła komunikaty zwalniające do pozostałych procesów w celu umożliwienia im wejścia do sekcji w powyższym przykładzie widać, że kolejnym procesem, który wejdzie do sekcji będzie proces, który znajduje się najwyżej w kolejkach lokalnych tj. proces P1.

Klastry Klaster to grupa niezależnych komputerów (często wieloprocesorowych) połączona zazwyczaj szybką siecią w celu przetworzenia wspólnie tego samego problemu lub udostępniania tej samej usługi/zasobu.

Magistrala zrealizowana w postaci grafu połączeń

Schemat klastra obliczeniowego

Klastry klaster (ang. cluster) to co najmniej dwa komputery, komunikujące się ze sobą za pomocą możliwie najszybszych łączy, tworzących w rezultacie jeden logiczny system obliczeniowy do komunikacji pomiędzy węzłami służą specjalnie do tego stworzone magistrale systemowe potrafiące przekazywać duże ilości informacji w krótkim czasie

Klastry klastry są doskonałą alternatywą dla drogich rozwiązań typu mainframe czy superkomputerów, oferując ich moc obliczeniową przy nieporównywalnie niższych kosztach uruchomienia i dużo lepszej skalowalności

Rodzaje klastrów Rozróżnić można klika głównych podgrup : klastry naukowe - przetwarzanie równoległe, programowanie równoległe, cały zespół komputerów pracuje nad tym samym problemem, dużo tańsza alternatywa dla superkomputerów

Rodzaje klastrów Klastry tego typu służą do masowego przetwarzania danych jednego rodzaju (np. danych naukowych lub procesów wizualizacji). Wymagają specjalnie przygotowanych programów tworzonych przy użyciu wyspecjalizowanych bibliotek programistycznych, takich jak: Message Passing Interface (MPI) lub Parallel Virtual Machine (PVM). Przykładem takiego klastra jest Beowulf.

Rodzaje klastrów klastry balansujące zasobami serwerów - zespół serwerów, który udostępnia tę samą usługę lub zasób, w celu rozłożenia obciążenia spowodowanego dużą ilością klientów połączonych w tym samym czasie, serwery odsyłają zapytania pomiędzy siebie aby na każdym z nich było jednakowe obciążenie, w ten sposób można przyjąć bardzo duże ilości odległych klientów

Rodzaje klastrów Klastry tego typu przeznaczone są do utrzymywania bardzo obciążonych usług sieciowych (np. serwerów WWW) lub prostych zadań obliczeniowych. Ich główne zadania polega na równoważnym dystrybuowaniu obciążenia między poszczególne serwery-węzły klastra. MOSIX należy do tej grupy.

Rodzaje klastrów Klastry HA (High Availability - duża dostępność) Klastry tego typu nie zwiększają wydajności serwisów, a mają jedynie eliminować tzw. SPOF (Single Point Of Failure) - pojedynczy punkt awarii - w razie uszkodzenia jednego z serwerów jego zadania są w sposób niewidoczny dla użytkowników przejmowane przez inny węzeł klastra.

Rodzaje klastrów Są to klastry wysokiej niezawodności - zespół serwerów, które przejmują zadania od siebie w przypadku awarii jednego z nich, po to aby serwis jaki udostępniają był dostępny bez przestojów Przykładem takiego klastra jest oprogramowanie Red Hat High Availability Server oraz oprogramowanie opracowywane w ramach projektu Linux HA (High Availability

Klastry każdy klaster musi posiadać co najmniej jeden serwer - węzeł (master - node), który zarządza/monitoruje całym klastrem i co najmniej jeden węzeł podległy (slave - node)

Klastry tylko serwer zarządzający musi posiadać takie urządzenia, jak: monitor, kartę wideo, klawiaturę, mysz, stacje dyskietek, CD-ROM itp. w skrajnych przypadkach slave - nodes mogą nie posiadać dysków twardych, system jest pobierany z innego serwera na którym udostępnia się przestrzeń dyskową

Klastry można również udostępnić tylko część systemu z serwera plików i oprogramowania, np. cały katalog /usr lub /usr/local co zostanie zainstalowane na serwerze plików, będzie bez rejestracji na wszystkich węzłach

Klastry można tutaj spotkać się z takim problemem jak przeciążenie sieci i serwera plików zbyt dużą liczbą klientów rozwiązaniem będzie wtedy zainstalowanie szybszej sieci (np. Gigabitowej) lub zwiększenie ilości serwerów plików

Klastry dzięki rozwojowi technologii sieciowych, coraz częstszym stało się wykorzystywanie łączy sieci komputerowych ethernet do przesyłania informacji pomiędzy węzłami

Klastry od strony programowej najistotniejszymi elementami są: mechanizm obsługi pamięci współdzielonej (w przypadku stosowania węzłów wieloprocesorowych) biblioteka, pozwalająca na wzajemną komunikację pomiędzy węzłami i udostępniająca użytkownikom mechanizmy, pomagające w zrównoleglaniu kodu

Oprogramowanie Główna strona projektu MOSIX www.mosix.org Projekt Beowulf www.beowulf.org PVM (Parallel Virtual Machine) - narzędzia do budowy komputerów równoległych, które mogą wykorzystywać różne systemy operacyjne, np. Linux i Windows NT www.epm.ornl.gov/pvm

Oprogramowanie Komercyjne oprogramowanie TurboLinux EnFuzion do łączenia zwykłych komputerów w sieci lokalnej w klaster www.turbolinux.com/products/enf Projekt Linux High Availability www.linux-ha.org Pakiet Message Passing Interface (MPI) www.erc.msstate.edu/ labs/hpcl/projects/mpi/

Oprogramowanie PVMPovRay - specjalna wersja popularnego renderera przystosowana do pracy w klastrach http://cersa.admu.edu.ph/ftp/ linux/beowulf/tools/PVMPovray-3.1-1.i386.rpm LUI - narzędzie do automatycznego "klonowania" całego systemu operacyjnego między węzłami klastra http://oss.software.ibm.com/ developerworks/projects/lui

System klastrowy widziany jest przez użytkowników jako całość.

Niezawodność jest cechą systemu informatycznego, która określa dopuszczalny czas przestoju i jego bezawaryjnej pracy w systemach o znaczeniu krytycznym dopuszcza się średni czas awarii w ciągu roku na poziomie pięciu minut (stanowi to tysięczną część procentu czasu pracy)

Niezawodność w systemach klastrowych podnosi ją konfiguracja węzłów, gdyż są one odizolowane od siebie, zatem uszkodzenie jednego z nich eliminuje ryzyko wystąpienia awarii w innym węźle

Przezroczystość niezależnie od tego jak zbudowany jest system klastrowy, użytkownik nie jest na ogół w stanie stwierdzić czy pracuje na klastrze czy na pojedynczym komputerze często złożoność operacji przeprowadzanych w systemie jest przed użytkownikiem ukryta.

Skalowalność system skalowalny to taki, który można w szybki i sprawny sposób rozbudować w celu sprostania zwiększającym się wymaganiom użytkowników rozbudowa ta powinna przebiegać bez konieczności zmian w budowie całego systemu a jedynie na wymianie części sprzętu na nowy lub dodanie kolejnych jego elementów takich jak nowy procesor czy zwiększenie ilości pamięci operacyjnej

Skalowalność najlepiej, aby rozbudowa taka nie powodowała przerwania pracy systemu i aby wzrost wydajności był liniowo proporcjonalny do przyrostu mocy obliczeniowej wynikającej z dodania nowego węzła w systemie klastrowym

Skalowalność

Węzły każdy komputer będący elementem składowym klastra nosi miano węzła (ang. node) to właśnie zbiór węzłów zbudowanych z samodzielnych maszyn tworzy klaster

Węzły węzły są zazwyczaj odłączane bądź dodawane do klastra bez potrzeby ponownej konfiguracji i restartowania całości systemu dzięki temu jest możliwość dokonywania prac serwisowych czy też konserwacyjnych w czasie pracy systemu, którego przerwa w działaniu jest niedopuszczalna

Modele implementacji klastrów Dwa podstawowe modele implementacji klastrów to Failover cluster Boewulf cluster

Failover cluster jest to klaster budowany z myślą o zapewnieniu jak najlepszych parametrów eksploatacyjnych, takich jak odporność na uszkodzenia (ang. failover )- możliwość dalszego działania w przypadku awarii jednego z elementów czy stabilność działania

Beowulf cluster zwany inaczej Computational Cluster, przeznaczony głównie do zastosowań w środowiskach naukowych i ośrodkach badawczych

Beowulf cluster w rozwiązaniach tych największy nacisk kładzie się na moc i wydajność klastra, kosztem jego odporności na awarie dzieje się tak dlatego, że w tego typu zastosowaniach czas przestoju nie ma krytycznego znaczenia i na ogół nie powoduje ogromnych strat finansowych klastry tego typu mają znacznie większą wydajność, zwłaszcza w obliczeniach zmiennoprzecinkowych

Beowulf cluster wszystkie węzły są kontrolowane przez jeden, zwany serwerem, węzłem głównym (ang. master node) lub front-endem

Beowulf cluster Jego główne zadania to dystrybucja informacji o użytkownikach i zasobach systemu udostępnianie wspólnej przestrzeni dyskowej, a zwłaszcza katalogów domowych (/home) i danych aplikacji (np. /usr/local)

Beowulf cluster kontrola pracy klastra komunikacja ze światem zewnętrznym (dla użytkowników to on stanowi "bramę", za pomocą której logują się do systemu i zarządzają swoimi zadaniami ) rola serwera zadań - odpowiedzialność za kontrolę obciążenia klastra i dystrybucję zadań użytkowników

Beowulf cluster Na ogół jedyną maszyną podłączoną do świata zewnętrznego za pomocą drugiej karty sieciowej jest węzeł-serwer Najczęściej korzysta się z systemu poprzez bezpośredni dostęp do konsoli serwera, lub poprzez telnet czy odległe logowanie na serwer z odległej stacji roboczej Na serwerze użytkownicy mogą edytować i kompilować swój kod, a także uruchamiać procesy na wszystkich węzłach w klastrze.

Różnice między COW a Beowulf cluster W większości przypadków systemy COW są używane do obliczeń równoległych w nocy i w weekendy, gdy użytkownicy nie korzystają ze swoich stacji roboczych do pracy, wykorzystując w ten sposób z niepotrzebne cykle procesora Z kolei maszyna Beowulf jest maszyną dedykowaną do przetwarzania równoległego, i zoptymalizowaną w tym celu Beowulf zapewnia także większy współczynnik ceny do wydajności, jako że jest zbudowany z ogólnie dostępnych komponentów i korzysta na ogół z darmowego oprogramowania Beowulf ma także więcej cech pojedynczego systemu, które pomagają użytkownikom dostrzegać klaster Beowulf jako pojedynczą obliczeniową stację roboczą

Klastry w Polsce Najszybszym superkomputerem w Polsce jest (styczeń, 2005) SuperDome 878 Telekomunikacji Polskiej osiągający teoretyczną moc obliczeniową rzędu 744 gigaflopsów Gdyby do superkomputerów zaliczano systemy rozproszone, to największym w Polsce byłby (styczeń, 2005) system komputerowy CLUSTERIX Największy klaster komputerowy to 'holk' w Centrum Informatycznym Trójmiejskiej Akademickiej Sieci Komputerowej

CLUSTERIX Krajowy Klaster Linuksowy (CLUSTERIX – ang.National CLUSTER of LInuX Systems) - system geograficznie rozproszony dzięki zastosowaniu 802 64-bitowych procesorów Intel Itanium 2, krajowej sieci optycznej nowej generacji PIONIER oraz systemu operacyjnego Linux, jest jednym najszybszych rozproszonych superkomputerów w Europie

CLUSTERIX Uroczystość uruchomienia klastra w Pałacu Prezydenckim Jeden z serwerów klastra Uruchomienie Clusteriksa nastąpiło 15 grudnia 2004 r. o godz. 13:30 w Pałacu Prezydenckim w Warszawie

CLUSTERIX Wydajność klastra mierzona w bilionach operacji zmiennoprzecinkowych na sekundę wynosi 4,4 tflops Clusterix wykorzystywany będzie m. in. do badań naukowych w zakresie: modelowania zjawisk, złożonych symulacji (np. przepływu krwi), wizualizacji, przewidywania struktur białek czy projektowania układów elektroniki molekularnej itd.

Klastry w Polsce (2006-01-12) Największy, został sklasyfikowany na 231 miejscu listy TOP500 (listopad 2003) : nazwa: Holk 288 x Itanium 2 1.3GHz / 1.4GHz Moc: 1510.4 Krótki opis: 288 x Itanium 2 1.3GHz / 1.4GHz Instytucja:Centrum Informatyczne TASK Miasto: Gdańsk Zastosowania: obliczenia metodami chemii kwantowej, dynamiki molekularnej, metodą elementów skończonych. Chemia, biochemia, fizyka ciała stałego, inżynieria,

HOLK Klaster zbudowany jest z modułów w architekturze SMP Każdy moduł zawiera po dwa procesory Itanium2, 2 GB pamięci operacyjnej, 36 GB dysk twardy SCSI, oraz dwa porty Gigabit Ethernet Aktualnie moduły są podłączone za pomocą pojedynczego łącza do switch gigabitowych firmy D-Link.

HOLK Moduły pracują po kontrolą systemu operacyjnego Debian GNU/Linux 3.0. Do komunikacji wykorzystywana są biblioteki MPICH i LAM W sierpniu 2004 pamięć operacyjna klastra została zwiększona poprzez dołożenie do połowy nodów 4 GB pamięci

HOLK Od listopda 2004 w skład klastra holk wchodzi podklaster clusterix złożony z 16 węzłów wyposażonych w 2 procesory Itanium2 1.4 GHz oraz sieć InfiniBand Teoretyczna moc obliczeniowa klastra wynosi 1510 GFlop/s

HOLK ilość węzłów: 64+64 ilość węzłów: 16 charakterystyka węzła data uruchomienia: 2003-10-20 charakterystyka węzła data uruchomienia: 2004-12-15 Płyta główna/serwer: Intel Tiger2 Procesor: 2 × Itanium2 1.3 GHz Procesor: 2 × Itanium2 1.4 GHz RAM: 2GB (6GB) RAM: 8GB dysk: 36 GB Sieć: Gigabit Ehternet Sieć: InfiniBand

Holk w kartonach

Montaż klastra

Dodawanie węzłów

Klaster ma też 256 kabli zasilających

HOLK

MOSIX uruchamianie klastrów wymagało dotąd zakupu specjalnego, kosztownego sprzętu i oprogramowania, ich budowa była zarezerwowana jedynie dla dużych ośrodków naukowych, firm i administracji państwowej dzięki Linuksowi i bezpłatnemu oprogramowaniu Open Source klastry trafiają "pod strzechy"

MOSIX oprogramowanie MOSIX http://www.mosix.org/ to bezpłatne rozszerzenie jądra Linuksa, które umożliwia budowę klastra obliczeniowego na podstawie tanich komputerów PC w ten sposób można łączyć wiele słabych maszyn, które samodzielnie nie byłyby już użyteczne w przypadku klastra MOSIX - pojęcie węzeł oznacza jeden komputer

MOSIX najpopularniejszym linuksowym oprogramowaniem do ich budowy jest MOSIX (Multi-computer Operating System for UNIX) dostępny nieodpłatnie, również w postaci kodu źródłowego oprogramowanie MOSIX powstało i jest rozwijane na Uniwersytecie Hebrajskim w Jerozolimie

MOSIX pierwotnie projekt był rozwijany w systemie BSD UNIX, ale obecnie jedyną platformą systemową jest Linux (jedynie platforma x86). idea twórców MOSIX : utworzyć oprogramowanie pozwalające zbudować klaster, który zarówno z punktu widzenia użytkowników, jak i uruchamianych programów będzie widoczny jako jedna maszyna

MOSIX Architektura MOSIX-a składa się z dwóch modułów wewnętrznych: - mechanizmu migracji (przenoszenia) procesów z wywłaszczaniem (PPM - Preemptive Process Migration), - algorytmu odpowiadającego za mechanizm adaptacyjny (czyli reagującego na panujące w danej chwili warunki) mechanizmu współdzielenia zasobów

MOSIX moduły współdziałają przy przenoszeniu procesów między węzłami klastra w taki sposób, aby zmniejszyć średnie obciążenie węzłów każdy węzeł jest właścicielem procesu (programu), który został na nim uruchomiony lokalnie, a serwerem dla procesów, które się przemieściły z innych węzłów klastra dodawanie i usuwanie węzłów z klastra nie wpływa na trwające procesy.

MOSIX MOSIX został zaimplementowany jako moduł jądra Linuksa, dzięki czemu jest "przezroczysty" dla działających programów uzupełnieniem modułu jądra jest program Mosrun, który zastępuje większość standardowych narzędzi sieciowych Linuksa moduł jądra działa jak zarządca zadań, decydując, jakie działanie powinno być przeniesione do innego węzła cały ten proces odbywa się automatycznie i w sposób niewidoczny dla samego programu

MOSIX : użytkownik nie wie, jak jego procesy (programy) są przenoszone między węzłami klastra użytkownik może uruchomić program na dowolnej maszynie w klastrze i program ten będzie już automatycznie przenoszony między węzłami każdy nowy proces jest przypisywany do najlepszego (tj. takiego, który jest najmniej obciążony w danej chwili) węzła

MOSIX nie wszystkie programy mogą korzystać z MOSIX-a - niektóre ze względów technicznych nie będą mogły być dystrybuowane do innych węzłów dotyczy to na przykład programów, które są uzależnione od współpracy ze sprzętem i wykonywaniem operacji wejścia-wyjścia. (aplikacje do wyświetlania grafiki 3D w czasie rzeczywistym, także gry).

MOSIX MOSIX idealnie nadaje się do programów wykonujących wiele zadań obliczeniowych jednocześnie - dotyczy to np. kompilacji dużych programów (całego pakietu KDE czy GNOME), kompresji do formatu MP3 i innych programów wykonujących wiele obliczeń (np. do renderingu grafiki) http://www.femto-st.fr/~daniau/ltsp-mosix/

MOSIX klastry MOSIX są łatwe w budowie i utrzymaniu wszystko, czego będziesz potrzebował, to sieć TCP/IP i co najmniej dwa komputery co do wymagań związanych z siecią to w warunkach domowych można nawet użyć dwóch komputerów z kartami sieciowymi kablem Ethernet ogromną zaletą MOSIX-a jest to, że do pracy w klastrze można przeznaczyć zwykłe, tanie komputery PC, wymogi to procesor Pentium, twardy dysk (rozsądne minimum to 300-500 MB - tyle jest wymagane przy minimalnych instalacjach Linuksa) pamięć RAM w odpowiedniej ilości (minimum 16 MB) i karta sieciowa.

MOSIX MOSIX jest znakomitym sposobem wykorzystania starych komputerów górna granica liczby komputerów połączonych w klaster MOSIX to 65535, jednak bardziej realnym ograniczeniem jest wydajność sieci rozbudowane klastry wykorzystują szybkie sieci Gigabit Ethernet lub sieci specjalne, np. Myrinet

MOSIX kolejną zaletą MOSIX-a jest to, że uruchamiane w klastrze programy nie wymagają żadnego specjalnego przygotowania do pracy inne klastry wymagają rekompilacji programów z wykorzystaniem specjalnych bibliotek do przetwarzania równoległego ceną za zalety jest to, że klastry MOSIX nie są tak wydajne jak te, które wymagają przygotowywania specjalnych programów klaster MOSIX może być również, oczywiście, budowany na silnych maszynach serwerowych lub maszynach wieloprocesorowych

Przykłady architektur klastrowych Trzy komputery działające równolegle: jeden monitoruje urządzenia do produkcji piwa, inny steruje dystrybucją towarów, a jeszcze inny jest używany do celów administracyjnych

BROWAR System stanowi klaster, gdyż w sytuacji awarii komputery są w stanie przejąć wzajemnie swoje funkcje Jeśli popsuje się komputer nadzorujący produkcję, to jego funkcję przejmie komputer obsługujący administrację Podobnie stanie się, gdy ulegnie awarii komputer sterujący dystrybucją towarów Nie ma przetwarzania równoległego, każde zadanie wykonuje się na pojedynczym komputerze. Odpowiednie części oprogramowania są w stanie wykryć awarię i zareagować na nią przerzuceniem wykonywanych zadań na inne maszyny.

Kancelaria