co omówimy w zar01 ?
W modelu synch mamy rundy, w każdej rundzie każdy wierzchołek:
W modelu asynch nie ma rund, wysłane przez kraw komunikaty po jakimś czasie są dostarczane
Co jest celem alg rozproszonego? Odp: obliczenie „czegoś” w grafie kom, np. nakrótszej ścieżki między 1 a 5
Warianty modelu message-passing:
Co to znaczy, że dany algorytm asynch „A” działa ?
Odp: działa (oblicza to co trzeba) dla dowolnej dopuszczalnej egzekucji
Egzekucja jest dopuszczalna gdy:
Co to znaczy, że dany algorytm synch „A” działa ?
Odp: działa dla każdej egz, która można podzielić na rundy...
Uwaga: alg asynch jest snych !!!
synch: liczba rund (=czas działania), liczba komunikatów
asynch: liczba komunikatów, czas (trudniejsze do zdef...)
## przykład użycia symulatora synch w jupyterze...
# + ten kod nalyży wykonać JEDEN raz !!!
# + jeśli chcemy zmodyfikować coś w kodzie, to należy "restartować kernel"
# + rundy uruchamiamia się przy pomocy następnej komórki
#
# ladowanie tkinter pod python3...
import tkinter; t=tkinter.Tcl()
t.eval("""
source symul_lib.tcl
# tworzymy graf komunikacyjny (w tym wypadku cykl)
set liczbaWierz 5
set sasiedzi(0) {4 1}
set sasiedzi(1) {0 2}
set sasiedzi(2) {1 3}
set sasiedzi(3) {2 4}
set sasiedzi(4) {3 0}
# ^ numery połączeń zależą od kolejności id na liście sąsiadów
fiber create $liczbaWierz run
fiber_iterate { # kod wykona się we wszystkich fiberach
proc run {} {
global id run kom; # zmienne globalne dostępne we wszystkich fiberach
if {$id==0} {wyslij 1 0}
fiber yield; # oznacza koniec rundy
while {$run} { # zmienna run pozwala zakonczyc dzialanie symulacji!!
if {$kom(0)!=""} {
set x $kom(0)
incr x
wyslij 1 $x
}
fiber yield; # oznacza koniec rundy
}
}
}
Inicjalizacja; # koniecznie trzeba to wywolac!!!
proc _puts s {append ::_ "$s\n"}; # specjalnie dla jupyter-a...
set licz_rund 1
proc wizualizacja {} {
global licz_rund
_puts "--- $licz_rund ---"; incr licz_rund
#fiber_iterate {_puts "$id: kom0=$kom0, kom1=$kom1"}
#fiber_iterate {_puts "$id: kom(0)=$kom(0), kom(1)=$kom(1)"}
fiber_iterate {_puts "$id, $id_los: $kom(0), $kom(1)"}
}
""")
# uruchomienie pojedynczej rundy...
print(t.eval("""
set _ ""; # można zakomentować...
fiber yield; runda; wizualizacja; set _
"""))
# wyswietla opisy błędów w fiberach (jeśli jakieś są)
print(t.eval('fiber error'))
## przykład użycia symulatora Asynch w jupyterze...
#
# ladowanie tkinter pod python3...
import tkinter; t=tkinter.Tcl()
t.eval("""
source symul_lib.tcl
# tworzymy graf komunikacyjny (w tym wypadku cykl)
set liczbaWierz 5
set sasiedzi(0) {4 1}
set sasiedzi(1) {0 2}
set sasiedzi(2) {1 3}
set sasiedzi(3) {2 4}
set sasiedzi(4) {3 0}
# ^ numery połączeń zależą od kolejności id na liście sąsiadów
fiber create $liczbaWierz run
fiber_iterate {
proc run {} {
global id id_los run kom
wyslij 1 $id_los
fiber switchto main; # oznacza koniec zdarzenia obliczeniowego
while {$run} {
if {$kom(0)!=""} {
wyslij 1 [czytaj 0]
}
fiber switchto main; # oznacza koniec zdarzenia obliczeniowego
}
}
}
InicjalizacjaAsynch; # koniecznie trzeba to wywolac!!!
proc _puts s {append ::_ "$s\n"}; # specjalnie dla jupyter-a...
""")
print(t.eval('set _ ""; pokazKom; set _'))
t.eval("""
fiber switchto 0; # generujemy zdarzenie obl, args: ID
""")
t.eval("""
dostarczKom 1 0; # generujemy zdarzenie dost kom, args: ID nr_połączenia
""")
Uwaga: zadania można robić bezp w jupyterze LUB zewn symulatorem (w konsoli2c)
ZADANIE 1
Zaimplementuj algorytm synchroniczny obliczający max i min ID w cyklu zorientowanym;
te liczby mają być znane na wsz wierz po zakończeniu działania;
założenie: jest znany (pojedynczy) lider w cyklu (może to być wierz z id = 0)
algorytm ma używać min. liczby komunikatów
oszacuj także liczbę rund (czyli czas działania alg)
jako ID uzywaj zm id_los
ZADANIE 2
Zaimplementuj algorytm synchroniczny obliczający max i min ID w cyklu zorientowanym;
te liczby mają być znane na wsz wierz po zakończeniu działania;
w przeciwieństwie do poprzedniego zadania lider nie jest znany;
algorytm ma używać min. liczby komunikatów
ZADANIE 3
Zaimplementuj algorytm synchroniczny obliczający 2-kolorowanie-wierzchołkowe cyklu zorientowanego
tj kolejne wierz powinny mieć kolory: czerwony, niebieski, czerwony, niebieski, ...
(cykl musi mieć parzystą długość)
założenie: jest znany (pojedynczy) lider w cyklu (może to być wierz z id = 0)
ZADANIE 4
Zaimplementuj algorytm synchroniczny obliczający 2-kolorowanie-wierzchołkowe cyklu zorientowanego
jak w poprzednim zadaniu, ale tym razem NIE mamy lidera...
prosty sposób na obliczenie lidera możesz wywnioskować z poniższego rysunku:
Wskazówka do zadania 4: jeśli łączymy dwa algorytmy, wybór lidera i 2-kolorowanie,
to trzeba się zastanowić, jak ograniczyć mieszanie się komunikatów tych alg!
można to zrobić w dziedzinie czasu lub dodać prefiks rozróżniający do komunikatów obu alg...
""