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