L’iniziatore manda una richiesta a tutti i suoi vicini dicendo: vuoi essere mio vicino nel ST?
Dopo di che l’iniziatore aspetta le risposte praticamente.
Come risposte potrebbe avere Si e No.
Come faccio adesso a scrivere l’idea in maniera più precisa e protocollare? Che possibili stati potrei andare a considerare?
Come finisce il protocollo per un nodo? Se dico no sti cazzi, se dico “sì” devo aspettare tutte le risposte dai miei vicini (tranne da chi mi ha mandato la domanda). Ho quindi un altro stato chiamato active da quando hanno iniziato il protocollo prima di aver finito (che è quando aspetto le risposte).
state = {initiator, idle, active, done}
signal init = {initiator, idle} → possible internal states
signal term = {done} → termination state
INITIATOR
spontaneously
root = true
Tree-neighbours (x) = {}
send Q to N(x)
counter = 0
become(ACTIVE)
IDLE
receving(Q)
root = false
parent = sender
Tree-neighbours(x) = {sender}
send YES to parent
counter = 1
if counter = |N(x)|
then
become(DONE)
else
send Q to N(x)-{sender}
become(ACTIVE)
ACTIVE
receiving(Q)
send NO to sender
receiving(YES)
Tree-neighbours(x) = Tree-neighbours(x) u {sender}
counter = counter + 1
if counter = |N(x)|
then
become(DONE)
receiving(NO)
counter = counter + 1
if counter = |N(x)|
then
become(DONE)
Potrebbe arrivarmi un’altra Q in una situazione di triangolo, in cui il vertici superiore manda a quelli inferiori dei messaggi e questi poi si mandano delle questions a vicende perché giustamente non sono father tra di loro.
Ogni nodo risponde yes una volta sola, se il padre rispondo yes allora c’era qualcun altro. Ogni nodo ha un padre solo e non posso andare a formare dei cicli. Costruisco lo spanning tree. Termina ovviamente quando diventiamo tutti quanti DONE.
C’è una terminazione solamente locale, sa quando finisce lui e basta.
Quanto mi costa tutto ciò? Se ci pensiamo le Q viaggiano come i messaggi del broadcast della volta scorsa. Mi aspetto almeno il numero di messaggi di broadcast, però mi aspetto anche delle risposte di ritorno. Quindi alla fine posso immaginare un doppio costo.
Facciamo un conto, ci proviamo: posso andare a cercare di capire quali sono i possibili messaggi che passano in entrambe le direzioni e cerchiamo di capire che combinazioni ci sono e quelle che non capiteranno mai.