Prova teorica 2014.06.03

From Sistemi Operativi
Revision as of 10:35, 4 December 2016 by S.G (talk | contribs) (Esercizio message passing c.2)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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)