Instrukcja projektowa z synchronizacji w Windows
Transkrypt
Instrukcja projektowa z synchronizacji w Windows
Programowanie lokalnych aplikacji .NET 2016/17 Instrukcja projektowa cz.3a i 3b Synchronizacja i wielozadaniowość w Windows Prowadzący: Tomasz Goluch Wersja: 5.0 I. Zadania projektowe – 3a/3b. Cel: Opanowanie podstawowych metod zrównoleglania obliczeń i ich synchronizacji. Zadanie projektowe z synchronizacji i przetwarzania wielowątkowego polega na napisaniu programu służącego do symulowania sztucznego życia. Interfejs graficzny użytkownika GUI powinien wykorzystywać technologię WPF i pozwalać na wprowadzenie ustawień początkowych, uruchomienie obliczeń równoległych oraz na wyświetlanie na bieżąco stanu symulacji. Obliczenia równoległe powinny być wykonywane z wykorzystaniem puli zadań. Ogólnie rzecz biorąc zadanie polega na wyświetlaniu kolejnych faz automatu komórkowego 1 . Program powinien pozwalać przed uruchomieniem obliczeń na ustalenie liczby symulowanych komórek. Powinna ona wynosić od kilku do kilkuset a każda z nich powinna być obsługiwana poprzez osobne zadanie. Jednak aby liczba wątków/zadań nie była zbyt wysoka powinny być one obsługiwane w puli. Stan początkowy układu powinien być wczytywany z pliku, który można w łatwy i intuicyjny sposób edytować. Automaty komórkowe można podzielić na wiele rodzajów. Jedną z ich cech charakterystycznych jest wykorzystywany rodzaj sąsiedztwa. Istnieją dwa podstawowe: Von Neumann’a 2 i Moore’a 3 . Można je dodatkowo parametryzować wartością r. W przypadku Von Neumann’a jest to odległość podawana według metryki Manhattan 4 . Dla sąsiedztwa Moore’a jest to po porostu kwadrat o boku długości 2*r+1. Przykłady (od lewej: Neumann, Rozszerzony Neumann r=2, Moore, Rozszerzony Moore r=2,): 1 https://en.wikipedia.org/wiki/Cellular_automaton https://en.wikipedia.org/wiki/Von_Neumann_neighborhood 3 https://en.wikipedia.org/wiki/Moore_neighborhood 4 https://en.wikipedia.org/wiki/Taxicab_geometry 2 2 Nic nie stoi na przeszkodzie aby definiować sąsiedztwo w dowolny inny sposób. Przykłady (od lewej: Moore z uszami, Rozszerzony Moore r=2, Krzyż, Rozsiany, Gwiazda, Szachownica, Ogrodzenie): Projekt powinien pozwalać na wybór dwóch podstawowych (dla różnych wartości r) oraz dodatkowego wybranego rodzaju sąsiedztwa oczywiście można wykorzystać większa ich liczbę. Można też dodać kontrolką reprezentującą macierz, którą można edytować w czasie rzeczywistym. Parametrem mającym istotny wpływ na zachowanie się automatu jest liczba żywych komórek w wybranym sąsiedztwie która determinuje stan ewoluującej komórki. Powinien być on pobierany z interfejsu użytkownika. Dla klasycznego życia Conway’a5 są to wartości 2 i 3 który warunkują przeżycie komórki oraz 3 powodująca jej narodziny. Sąsiedztwem jest sąsiedztwo Moore dla r=1. W celu opisania danego aparatu stosuje się notację X1X2…/Y1Y2… gdzie: Xn – kolejne wartości warunkujące przeżycie, Yn – kolejne wartości warunkujące narodziny. Dla życia Conway’a będzie to: 23/3. Zachowanie automatu można porównać z istniejącymi programami dostępnymi w Internecie np.: http://automatzycia.labiryncik.cba.pl/. Zachowanie się komórki w przypadku kiedy osiągnie ona brzeg planszy (warunki brzegowe) może być periodyczna (przechodzenie na przeciwległą stronę planszy) bądź zamknięta (odbijająca albo pochłaniająca). W pierwszym przypadku można adresować komórki modulo wymiar ekranu a w drugim dodatkowa ramka (nie wyświetlana) o szerokości r jest na stałe wypełniona odpowiednimi wartościami. Wybór zależy od indywidualnych preferencji studenta. Automat może pracować synchronicznie bądź asynchronicznie (obydwa tryby powinny być dostępne w programie): 5 w przypadku pracy synchronicznej, musi istnieć zewnętrzny arbiter określający moment w którym następuje aktualizacja stanów komórek. w przypadku asynchronicznym każda komórka odlicza swój czas do aktualizacji. W momencie aktualizacji stanu komórki staje się on nieokreślony i musi zostać zablokowany do odczytu przez sąsiadów. Następnie stan komórki staje się określony i i powinien zostać zwolniony oraz zaktualizowany w GUI. Taka praca może prowadzić do zakleszczeń, szczególnie jeśli wszystkie wątki wystartują jednocześnie. W gestii https://en.wikipedia.org/wiki/Conway's_Game_of_Life 3 studenta jest rozwiązanie tego problemu. Można zastawać losowe interwały czasowe, priorytety itp… Wymagania techniczne odnośnie programów: Interfejs użytkownika powinien by napisany w technologii WPF i powinien zawierać następujące elementy wizualne: o przycisk uruchamiający symulację, o pole z liczbą uruchamianych zadań wykorzystywanych do zrównoleglenia obliczeń6, o pole czasu trwania skoku czasowego, o pola z liczbami warunkującymi przeżycie i narodzenie się komórki, o plansza symulacji, o przycisk pozwalający na zakończenie obliczeń (symulacji). Interfejs użytkownika nie powinien ulegać zamrożeniu (można korzystać ze słów kluczowych Async i Await). Po kliknięciu przez użytkownika przycisku kończącego obliczenia powinny zostać przerwane, a aktualny stan planszy powinien być nadal wyświetlany w GUI. Do zrównoleglenia rozpraszania należy wykorzystać Taski (należy wykorzystać TPL (Task Parallel Library)). Mile widziane są dodatkowe nietrywialne funkcjonalności, które mogą skutkować podwyższoną liczb punktów, np.: Edytor do definiowania matrycy sąsiedztwa z możliwością zapisu lub odczytu jej do/z pliku oraz możliwość jej zmiany w trakcie działania programu. Możliwość dynamicznego przełączania z trybu synchronicznego w asynchroniczny. Możliwość wykonywania symulacji krok po kroku. W trybie synchronicznym krok obejmuje aktualizację stanu wszystkich komórek, a w asynchronicznym np.: zmianę stanu wszystkich komórek która zajdzie w okresie zmiany stanu wybranej komórki. Możliwość dynamicznej zmiany warunków brzegowych planszy: periodyczna, zamknięta (odbijająca albo pochłaniająca) Implementacja innych zachowań automatu np.: W celu skupienia się studenta na temacie, czyli przetwarzaniu wielowątkowym i synchronizacji do projektu został dołączony prosty program, który można wykorzystać jako szkielet do rozbudowy. Wykorzystanie kodu tej aplikacji jest nieobowiązkowe, można napisać własny program od „zera” albo wykorzystać jedynie pewne jego aspekty. Jednakże zawiera on wszystkie wymagania odnośnie części synchronicznej. a jego architektura jest przygotowana do zrównoleglenia. W szczególności pozwala na wczytanie i zapisanie z/do pliku stanu symulacji. Ponadto GUI pozwala na zmianę liczby symulowanych komórek oraz na wygenerowanie początkowego stanu z zadanym prawdopodobieństwem utworzenia żywej komórki. Symulację można przeprowadzać krok po kroku, albo płynnie z zadanym interwałem czasowym. Podczas symulacji prędkość obliczeń można zmieniać w czasie rzeczywistym jest również wyświetlana liczba informująca o aktualnym kroku obliczeń. Na rysunku poniżej przedstawiono działającą aplikację. 6 Najbardziej optymalnym wykorzystaniem systemu jest uruchomienie 2n wątków, gdzie n – liczba rzeczywistych procesorów dostępnych w systemie. 4 Kod został podzielony na trzy klasy: Cell – reprezentuje pojedynczą komórkę zawierającą informację o tym jaki reprezentuje kwadrat na canvas’ie oraz jej indeks (współrzędną pozioma i pionową) pozwalający na łatwą identyfikację sąsiadów. Udostępnia metody pozwalające na wyliczanie jej stanu (umrze czy przeżyje) w następnym pokoleniu oraz na sprawdzenie liczby sąsiadów w zależności od aktywnego typu sąsiedztwa. Funkcje Create i Die ustalają stan komórek podczas wczytywanie albo generowania planszy, Każda komórka zawiera aktualny i przyszły stan, po wyliczeniu przyszłego stanu komórki stan aktualny jest informacją podczas wyliczania stanu przyszłego jej sąsiadów, CellsLifeEngine – reprezentuje silnik symulacji, zawiera struktury grupujące komórki w planszę oraz pozwalające na wyświetlanie ich na ekranie. Udostępnia funkcje synchronizujące stany oraz wyświetlające na canvas’ie wszystkie komórki na raz, MainWindow – główne okno aplikacji dostarcza implementacji zdarzeń kliknięcia przycisków (uruchamianie/zatrzymywanie symulacji, wczytywanie/zapis stanu symulacji, generowanie losowego stanu symulacji), zmiany wartości sliderów (zmiana parametrów symulowanej aplikacji takich jak jej tępo lub rozmiar planszy), zmiany stanu checkbox’ów i combobox’ów (dynamiczna zmiana typu sąsiedztwa). Uruchomienie symulacji wykonywane jest asynchronicznie, można dynamicznie zmieniać typ oraz parametry sąsiedztwa. Brzegi planszy mają charakter zamknięty i pochłaniający – 5 komórki które wypadły za planszą znikają. W celu szczegółowej analizy można dokonywać symulacji krok po kroku. Zmiana rozmiaru planszy spowoduje wygenerowanie nowej planszy o zadanym współczynniku wypełnienia i jest to możliwe tylko przy zatrzymanej symulacji. Do GUI dodane jest nieoprogramowane pole checkbox, które można wykorzystać do dynamicznego przełączania pomiędzy synchronicznym i asynchronicznym trybem pracy aplikacji. Projekty proszę przesyłać na adres: [email protected] Przed wysłaniem proszę wykonać na każdym projekcie operację Clean i usunąć wszystkie niepotrzebne pliki. Proszę przesyłać jedynie pliki: kodu: *.cs, *.xaml, konfiguracyjne: *.xml, *.xaml, zasobów: *.bmp, *.ico, *.png, itp… projektu: *.vcproj, *.vcxproj oraz *.filters solution: *.sln Proszę nie przesyłać dołączanych bibliotek oraz plików bazy danych !!! Proszę koniecznie zatytułować pocztę w następujący sposób: PALGZINDEKS gdzie: G – numer grupy, przykładowo: 1 - grupa nr. 1, Z – numer części zadania, przykładowo: 3 - zadanie trzecie – synchronizacja i wielozadaniowość. INDEKS - sześcioliterowy numer indeksu, przykładowo: 103057. 6