<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Prova_teorica_2014.06.16</id>
	<title>Prova teorica 2014.06.16 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Prova_teorica_2014.06.16"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2014.06.16&amp;action=history"/>
	<updated>2026-05-16T14:15:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2014.06.16&amp;diff=1688&amp;oldid=prev</id>
		<title>S.G: Esercizio monitor e message passing</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2014.06.16&amp;diff=1688&amp;oldid=prev"/>
		<updated>2016-12-05T15:11:32Z</updated>

		<summary type="html">&lt;p&gt;Esercizio monitor e message passing&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Testo: [http://www.cs.unibo.it/~renzo/so/compiti/2014.06.16.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
== Esercizio c.1 ==&lt;br /&gt;
'''Testo esercizio'''&lt;br /&gt;
&lt;br /&gt;
Scrivere il monitor rendezvous che consente ai processi di sincronizzarsi e scambiare dati.&lt;br /&gt;
Ogni processo chiama la procedure entry rendezvous.sync specificando due parametri: il numero dei processi con i quali il processo&lt;br /&gt;
corrente vuole sincronizzarsi e un vettore di ugual numero di interi. Il primo elemento e' inizializzato con il valore conferito dal&lt;br /&gt;
processo chiamante.&lt;br /&gt;
I processi devono coordinarsi con altri che abbiano chiesto di sincronizzarsi con un ugual numero di processi. Quindi, se e quando N&lt;br /&gt;
processi hanno chiamato la rendezvous.sync chiedendo la sincronizzazione con N processi, tutti N vengono riattivati. Il vettore&lt;br /&gt;
passato come secondo parametro deve contenere i valori conferiti dagli N processi, uno in ogni elemento del vettore, seguendo&lt;br /&gt;
l'ordine di chiamata della rendezvous.sync.&lt;br /&gt;
&lt;br /&gt;
es. P1: int v1[]={42,0,0}; rendezvous.sync(3,v1) …. P1 si blocca....&lt;br /&gt;
&lt;br /&gt;
P2: int v[]={314,0,0}; rendezvous.sync(3,v) …. P2 si blocca....&lt;br /&gt;
&lt;br /&gt;
P3: int vv[]={1,0}; rendezvous.sync(2,vv) …. P3 si blocca....&lt;br /&gt;
&lt;br /&gt;
P4: int q[]={13,0,0}; rendezvous.sync(3,q) … P4 sblocca anche P1 e P2. Il secondo paramentro per tutti e tre avra' valore [42,314,13]&lt;br /&gt;
….P3 si sblocchera' se e quando un altro processo chiamera' rendezvous.sync con primo parametro 2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SIZE N&lt;br /&gt;
&lt;br /&gt;
monitor rendezvous {&lt;br /&gt;
	generic_type count[];&lt;br /&gt;
	condition w[];&lt;br /&gt;
	&lt;br /&gt;
	void rendezvous (void){&lt;br /&gt;
		int i;&lt;br /&gt;
		count = new generic_type[SIZE];&lt;br /&gt;
		w = new condition[SIZE];&lt;br /&gt;
		for(i=0; i&amp;lt;SIZE; i++)&lt;br /&gt;
			count[i] = new List[];&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry sync(int np, int vp[]){&lt;br /&gt;
		int i, n;&lt;br /&gt;
		count[np].append(vp[0]);&lt;br /&gt;
		n = len(count[np]);&lt;br /&gt;
		if(n == np){&lt;br /&gt;
			// Sblocca tutti i processi con richiesta np&lt;br /&gt;
			for(i=0; i &amp;lt; n; i++){&lt;br /&gt;
				count[np].remove();&lt;br /&gt;
				w[np].signal();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if(n &amp;lt; np){&lt;br /&gt;
			// Blocca processo&lt;br /&gt;
			w[np].wait();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 16:11, 5 December 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Esercizio c.2 == &lt;br /&gt;
'''Testo esercizio'''&lt;br /&gt;
&lt;br /&gt;
Usando semafori implementare un emulatore di un servizio di message passing asincrono.&lt;br /&gt;
Occorre quindi implementare le primitive:&lt;br /&gt;
&lt;br /&gt;
void asend(msg m, pid_t dst)&lt;br /&gt;
&lt;br /&gt;
msg arecv(pid_t sender)&lt;br /&gt;
&lt;br /&gt;
facendo uso di semafori (generali, fifo).&lt;br /&gt;
(e' presente una chiamata getpid() che fornisce il pid del chiamante). La asend riceve da un mittente specificato (non e' richiesta la&lt;br /&gt;
gestione della ricezione da qualunque processo).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Assumendo che non ci sia limite di grandezza, definisco la seguente&lt;br /&gt;
 * struttura buffer tridimensionale, in cui le righe rappresentano i pid&lt;br /&gt;
 * dei processi mittenti e le colonne i pid dei processi destinatari.&lt;br /&gt;
 * Ad esempio buffer[X][Y] indica il buffer utilizzato dal processo X&lt;br /&gt;
 * (il cui pid è X) come mittente e dal processo Y come destinatario.&lt;br /&gt;
 * La terza dimensione, verrà utilizzata per la scrittura e lettura di determinati&lt;br /&gt;
 * messaggi nel buffer. &lt;br /&gt;
 * &lt;br /&gt;
 * La struttura front e rear vengo utilizzate come nel problema dei produttori/consumatori&lt;br /&gt;
 * per saper in quale punto poter scrivere e leggere nel buffer.&lt;br /&gt;
 * &lt;br /&gt;
 * La struttura len[X][Y] indica la lunghezza del buffer utilizzata dal processo X (mittente)&lt;br /&gt;
 * e Y (destinatario).&lt;br /&gt;
 */&lt;br /&gt;
msg buffer[][][] = new msg[][][];	&lt;br /&gt;
int front[][];	// Assumendo che ogni elemento sia inizilizzato a 0&lt;br /&gt;
int rear[][];	// Assumendo che ogni elemento sia inizializzato a 0&lt;br /&gt;
Semaphore len[][] = new Semaphore[][];	// Assumendo che ogni elemento sia inizializzato a 0&lt;br /&gt;
&lt;br /&gt;
void asend(msg m, pid_t dst){&lt;br /&gt;
	pid_t sen = getpid();&lt;br /&gt;
	int f = front[sen][dst]++;&lt;br /&gt;
	buffer[sen][dst][f] = m;&lt;br /&gt;
	len[sen][dst].V();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
msg arecv(pid_t sender){&lt;br /&gt;
	pid_t dst = getpid();&lt;br /&gt;
	len[sender][dst].P();&lt;br /&gt;
	int r = rear[sender][dst]++;&lt;br /&gt;
	return buffer[sender][dst][r];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Si potrebbe anche gestire il caso un processo invia un messaggio a più processi e la ricezione da qualunque processo. [[User:S.G|S.G]] ([[User talk:S.G|talk]]) 16:11, 5 December 2016 (CET)&lt;/div&gt;</summary>
		<author><name>S.G</name></author>
	</entry>
</feed>