Programowanie współbieżne i rozproszone/PWR Ćwiczenia Linda: Różnice pomiędzy wersjami
Linia 7: | Linia 7: | ||
=== Rozwiązanie pierwsze === | === Rozwiązanie pierwsze === | ||
Załóżmy, że początkowo w przestrzenie krotek znajduje się <math>M</math> egzemplarzy krotki postaci <tt>('A')</tt> i <math>N</math> egzemplarzy krotki <tt>('B')</tt>. | Załóżmy, że początkowo w przestrzenie krotek znajduje się <math>M</math> egzemplarzy krotki postaci <tt>('A')</tt> i <math>N</math> egzemplarzy krotki <tt>('B')</tt>. Procesy grupy pierwszej muszą dostać zasób <tt>A</tt>, zabierają więc z przestrzeni jeden egzemplarz krotki <tt>('A')</tt>. Po skorzystaniu z zasobu, krotka jest oddawana do przestrzeni. Proces pierwszej grupy można więc zapisać tak: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> Pokaż treść procesu | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''process''' grupa1; | '''process''' grupa1; | ||
'''begin''' | '''begin''' | ||
Linia 20: | Linia 20: | ||
'''end''' | '''end''' | ||
'''end'''; | '''end'''; | ||
</div> | |||
</div> | |||
Treść procesu drugiej grupy wygląda następująco: | Treść procesu drugiej grupy wygląda następująco: |
Wersja z 14:09, 17 paź 2006
Zasoby dwóch typów
Zadanie to pochodzi z książki Z.Weiss, T.Gruźlewski Programowanie współbieżne i rozproszone.
W systemie znajdują się dwa typy nierozróżnialnych zasobów A i B. Jest egzemplarzy zasobu A oraz N>0 egzemplarzy zasobu B. W takim systemie działają trzy grupy procesów. Procesy z grupy pierwszej cyklicznie wykonują własne sprawy, po czym żądają jednego egzemplarza zasobu A, w razie potrzeby czekając aż będzie on dostępny. Procesy z drugiej grupy żądają jednego egzemplarza zasobu A ale jeśli nie jest on dostępny czekają na zasób dowolny. Procesy z trzeciej grupy żądają jednego egzemplarza dowolnego zasobu, ale nie czekają, jeśli żaden nie jest dostępny. Zapisz treść poszczególnych procesów w Lindzie.
Rozwiązanie pierwsze
Załóżmy, że początkowo w przestrzenie krotek znajduje się egzemplarzy krotki postaci ('A') i egzemplarzy krotki ('B'). Procesy grupy pierwszej muszą dostać zasób A, zabierają więc z przestrzeni jeden egzemplarz krotki ('A'). Po skorzystaniu z zasobu, krotka jest oddawana do przestrzeni. Proces pierwszej grupy można więc zapisać tak:
Treść procesu drugiej grupy wygląda następująco:
process grupa2; var jaki: char; begin while true do begin wlasne_sprawy; if try_input('A') then jaki := 'A' else input(jaki: char); korzystaj(jaki); output(jaki) end end;
proces grupy trzeciej bardzo przypomina proces z grupy drugiej:
process grupa3; var jaki: zasob; begin while true do begin wlasne_sprawy; if try_input('B') then begin korzystaj('B'); output ('B') end else if try_input(jaki: char) then begin korzystaj(jaki); output(jaki) end else praca_bez_zasobu end end;
Rozwiązanie drugie
Rozwiązanie drugie polega na umieszczeniu w przestrzeni krotek jedynie dwóch krotek:
- ('A', wolnychA), gdzie wolnychA</tt< jest liczbą dostępnych zasobów typu A
- ('B', wolnychB), gdzie wolnychA</tt< jest liczbą dostępnych zasobów typu A
Spróbuj zapisać treści procesów przy takich założeniach. W razie potrzeby możesz rozbudować powyższe krotki o dodatkowe elementy.
Synchronizacja grupowa
Treść tego zadania przedstawimy w formie anegdoty. Z zespołu boisk korzysta drużyn. Każda drużyna składa się z zawodników, przy czym zawodnik jest na stałe przypisany do konkretnej drużyny. Każdy zawodnik cyklicznie (tj. w pętli nieskończonej):
- załatwia własne sprawy,
- udaje się na boisko,
- oczekuje aż zbierze się jego drużyna,
- oczekuje aż zbierze się jakaś inna drużyna,
- rozgrywa mecz.
Po przyjściu na boisko zawodnik oczekuje na przyjście wszystkich zawodników z jego drużyny oraz na skompletowanie się innej drużyny. Gdy tylko są dwie kompletne drużyny rozpoczyna się mecz. Każdy zawodnich z tych drużyn wywołuje wówczas predefiniowaną procedurę mecz (z_kim: 1..N), gdzie z_kim jest numerem drużyny przeciwnej. Zawodnik może w każdej chwili zejść z boiska (zakończyć wykonanie procedury mecz). Pozostali zawodnicy kontynuują wówczas grę, nawet jeśli na boisku pozostanie tylko jeden zawodnik. Zawodnik, który zakończył grę nie może jednak wrócić na boisko, tzn. aby ponownie rozpocząć mecz musi najpierw poczekać aż ponownie zbiorą się wszyscy gracze jego drużyny oraz pewna drużyna przeciwna. Zakładamy, że boisk jest co najmniej . Zapisz w Lindzie treść procesu Zawodnik (dr: 1..N)
Sortowanie
Zapisz w Lindzie algorytm sortowania liczb naturalnych. Załóż, że początkowo proces Inicjator umieszcza w przestrzeni ponumerowanych liczb naturalnych, korzystając z predefiniowanej funkcji losuj przekazującej w wyniku liczby naturalne z przedziału [1,n]. Sortowanie wykonywane jest przez procesów, z których każdy w kolejnym cyklu dokonuje jednego porównania i w razie potrzeby zamienia ich kolejność.