Lista 1. — Programowanie współbieżne, Laboratorium

by Jerry Sky

2021-04-11

Zadanie

Zaimplementować program współbieżny symulujący system, w którym nadawca wysyła do odbiorcy autonomiczne pakiety podróżujące po acyklicznym grafie skierowanym GG z jednym źródłem i z jednym ujściem.

Wierzchołki grafu G są indeksowane liczbami naturalnymi od 00 do n1n-1. Wierzchołek 00 jest źródłem, a wierzchołek n1n-1 jest ujściem.

Dla każdego i,0in2i, 0 \le i \le n - 2, istnieje w grafie krawędź skierowana (i,i+1)(i, i+1), co zapewnia, że z każdego wierzchołka jest jakaś ścieżka skierowana do ujścia.

Ponadto w grafie istnieje pewna liczba dd dodatkowych krawędzi postaci (j,k)(j,k), gdzie 0j<kn10 \le j < k \le n-1 (tzw. skrótów).

Dla wierzchołka ii, zbiorem następników ii, N(i)N(i), nazywamy zbiór takich jj, że istnieje krawędź (i,j)(i,j).

Program ma działać następująco:

  1. Generowany jest graf GG dla podanych parametrów nn i dd, gdzie dd skrótów generowane jest w sposób losowy.
  2. Graf GG drukowany jest na terminalu tak, aby przedstawić istniejące połączenia. (Zastanowić się nad tym, jaki sposób prezentacji będzie najbardziej czytelny.)
  3. Uruchamiana jest symulacja systemu przesyłania pakietów po grafie GG.

System przesyłania pakietów działa według następujących zasad:

Gdy odbiorca odbierze ostatni (tj. kk-ty) pakiet, system kończy działanie i rozpoczyna się drukowanie raportów końcowych.

W raportach końcowych pojawią się dwa wykazy:

Zaimplementuj system tak, aby nadawca, odbiorca oraz każdy wierzchołek grafu były osobnymi wątkami współbieżnymi, które przekazują sobie pakiety przez narzędzia komunikacji między wątkami.

Zwróć uwagę, że komunikaty drukowane przez współbieżne wątki na terminalu mogą się przeplatać. Dlatego dodaj nowy wątek (serwer drukowania), który przyjmuje zlecenia drukowania komunikatów od wątków i niezwłocznie, ale sekwencyjnie, drukuje je na ekranie w osobnych liniach.

Przetestuj działanie swojego programu przy różnych wartościach parametrów n,d,kn, d, k i różnych ograniczeniach na losowe opóźnienia w działaniach wątków. Do prezentacji w asciinema wybierz takie parametry, aby jak najlepiej to wyglądało.

Wskazówki:

Go

Pliki Źródłowe znajdują się w katalogu go.

Żeby uruchomić program, należy wykonać polecenie

go run . ‹n› ‹d› ‹k› ‹maxSleep›

z uzupełnionymi parametrami.

Parametr maxSleep określa liczbę, przez jaką należy podzielić domyślny czas oczekiwania wątków (jedna sekunda). Przykładowo, jeśli maxSleep = 100 oznacza to, że maksymalny czas oczekiwania wynosi 1/100 sekundy, czyli 10 milisekund.

Nagranie asciinema znajduje się w pliku go.cast.


Ada

Pliki źródłowe znajdują się w katalogu ada.

Przed uruchomieniem programu należy go skompilować poleceniem

make

Teraz można uruchomić program poleceniem

./main.bin ‹n› ‹d› ‹k› ‹maxSleep›

z uzupełnionymi parametrami.

Parametr maxSleep określa liczbę, przez jaką należy podzielić domyślny czas oczekiwania wątków (jedna sekunda). Przykładowo, jeśli maxSleep = 100 oznacza to, że maksymalny czas oczekiwania wynosi 1/100 sekundy, czyli 10 milisekund.

Nagranie asciinema znajduje się w pliku ada.cast.