Dostęp do
Priorytet procesów jest ustalany na podstawie zegarów Lamporta, jeśli wartości zegarów są równe, większy priorytet ma proces o niższym numerze id.
-
$rank$ - identyfikator procesu -
$lamport$ - wartość zegara lamporta -
$ackQueueCounter$ - liczba akceptacji dołączenia do kolejki oczekiwania na grupę -
$groupQueue$ - wektor par$(id, lamport)$ procesów oczekujących na grupę -
$groupMembers$ - lista$id$ procesów w grupie -
$ackResCounter$ - liczba akceptacji dołączenia do kolejki oczekiwania na zasób -
$resQueue$ - wektor par$(id, lamport)$ liderów oczekujących na zasób -
$BREAKTIME$ - czas trania dostępu do zasobu -
$BREAKPROB$ - prawdopodobieństwo wymuszenia przerwy od ubiegania się o zasób -
$BREAKTIME$ - czas przerwy w sekundach
-
$REQGROUP$ - prośba o dołączenie do kolejki procesów oczekujących na grupę -
$ACKGROUP$ - udzielonie zgody na dołączenie do kolejki procesów oczekujących na grupę -
$GROUPFORMED$ - wiadomość od lidera grupy zawierająca listę$groupMembers$ procesów w grupie -
$REQRES$ - prośba o dołącznie do kolejki leaderów oczekujących na zasób -
$ACKRES$ - udzielonie zgody na dołącznie do kolejki leaderów oczekujących na zasób -
$START$ - rozpoczęcie korzystania z zasobu, zawiera czas trawia dostępu do zasobu -
$END$ - zakończenie korzystania z zasobu
Początkowo procesy znają wartości
- Początkowo każdy proces ubiegający się o zasób wysyła komunikat
$REQGROUP$ - Proces zlicza otrzymane
$ACKGROUP$ w$ackQueueCounter$ . Gdy$ackQueueCounter = SIZE-1$ proces dodaje się do słownika$groupQueue$ - Proces reaguje na
$REQGROUP$ odsyłając$ACKGROUP$ oraz dodając nadawcę do słownika$groupQueue$ - Proces sprawdza czy w
$groupQueue$ znajduje się$GROUPSIZE$ procesów. Jeżeli tak to proces o najmniejszym zegarze lamporta zostaje liderem - Jeżeli proces jest liderem to:
- Wypełnia listę
$groupMembers$ kolejnymi$GROUPSIZE$ procesami z najmniejszymi zegarami lamporta - Wysyła do wszystkich procesów komunikat
$GROUPFORMED$ wraz z listą$groupMembers$ - Poces usuwa ze słownika
$groupQueue$ procesy z listy$groupMembers$
- Wypełnia listę
- Jeżeli proces nie jest liderem to:
- Oczekuje na komunikat
$GROUPFORMED$ - Jeżeli id procesu znajduje się w liście
$groupMembers$ przesłanej w komunikacie$GROUPFORMED$ wypełnia swoją listę$groupMembers$ procesami z komunikatu - Poces usuwa ze słownika
$groupQueue$ procesy z listy$groupMembers$
- Oczekuje na komunikat
- Jeżeli proces dostał komunikat
$GROUPFORMED$ , ale nie znajduje się w liście$groupMembers$ przesłanej w komunikacie to sprawdza czy nie zostaje liderem pozostałych procesów
- Jeżeli proces jest liderem to:
- Wysyła do wszystkich procesów komunikat
$REQRES$ - Proces zlicza otrzymane
$ACKRES$ w$ackResCounter$ . Gdy$ackResCounter = SIZE-1$ proces dodaje się do słownika$resQueue$ - Jeżeli proces mieści się w grupie P procesów o najmniejszych wartościach zegara lamporta to wysyła komunikat
$START$ do procesów z listy$groupMembers$
- Wysyła do wszystkich procesów komunikat
- Procesy reagujż na
$REQRES$ dodając nadawcę do słownika$resQueue$ oraz odsyłając$ACKRES$ - Jeżeli proces nie jest liderem to oczekuje na komunikat
$START$ , po którym rozpoczyna korzystanie z zasobu
- Jeżeli proces jest liderem to:
- Wysyła komunikat
$END$ do wszystkich procesów - Procesy reagują na komunikat
$END$ usuwając$id$ nadawcy z listy$resQueue$
- Wysyła komunikat
- Proces zeruje swoją listę
$groupMembers$ oraz licznik$ackQueueCounter$ i$ackResCounter$ - Proces losuje z prawdopodobieństwem
$breakProb$ to czy zostanie na niego nałożona przerwa. Jeżeli tak, to musi odczekać$breakTime$ ms. - Proces ponownie rozpoczyna porces dobierania się w grupy
make run
- uruchomienie z printowaniem stanów i akcji
make runDebug
- uruchomienie z dodatkowym printowaniem komunikacji i zawartości kolejek