Prova teorica 2014.06.03
Testo: [1]
Esercizio c.2
Siano dati 4 processi:
prchar=”IATL”
Process i: i=range(4)
while True:
sync(i)
print(prchar[i])
Scrivere la funzione sync in modo che in un sistema di processi a memoria privata, usando message passing asincrono, l'unico output possibile sia la stringa di lunghezza infinita: “ITALIAITALIAITALIA....”
Descrizione soluzione
Solo il processo 2 (lettera T) permette di iniziare la sincronizzazione dei processi.
Oltre al processo 2 anche il processo 1 (lettera A) permette di riavviare la sequenza.
Nella descrizione di seguito chiameremo T il processo incaricato a stampare tale lettera, e cosi anche per gli altri.
def sync(i):
if i == 0: # Processo 0 (processo I)
mittente = recv(*) # Aspetto un messaggio da T, L o A
if mittente == 2 or mittente == 1: # Se il mittente è il processo T o A (avvio o riavvio sequenza)
send(2, 0) # Invio un messaggio al processo T
elif mittente == 3: # Se il mittente è il processo L
send(1, 0) # Invio un messaggio al processo A
elif i == 1: # Processo 1 (processo A)
mittente = recv(*) # Aspetto un messaggio dal processo T o I
if mittente == 0: # Se il mittente è il processo I
send(0, 1) # Invio un messaggio al processo I (riavvio la sequenza)
elif mittente == 2: # Se il mittente è il processo T
send(3, 1) # Invio un messaggio al processo L
elif i == 2: # Processo 2 (processo T)
send (0, 2) # Invio un messaggio al processo I (Avvia la sequenza)
mittente = recv(0) # Aspetto un messaggio dal processo I
if mittente == 0: # Se il mittente è il processo I
send(1, 2) # Invio un messaggio al processo A
elif i == 3: # Processo 3 (processo L)
mittente = recv(1) # Aspetto un messaggio dal processo A
if mittente == 1: # Se il mittente è il processo A
send(0, 3) # Invio un messaggio al processo I
Una volta avviato T invierà un messaggio a I e si bloccherà in attesa di I.
Il processo I in attesa riceverà un messaggio da T, allora sbloccherà T e stamperà I.
A questo punto il processo T invierà un messaggio ad A, e stamperà T.
A aspetterà messaggi da più mittenti, in questo caso riceverà un messaggio da T, invierà un messaggio ad L e stamperà A.
L aspetterà il messaggio da A che appena ricevuto invierà un messaggio ad I, e stamperà L.
Il processo I in attesa, riceverà un messaggio da L sbloccandosi invierà un messaggio ad A e stamperà I.
A ancora una volta in attesa, riceverà un messaggio da I, risponderà ad I e stamperà A.
I riceverà un messaggio da A, e riavvierà la sequenza. S.G (talk) 10:35, 4 December 2016 (CET)