<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=GiuliaN</id>
	<title>Sistemi Operativi - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=GiuliaN"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/GiuliaN"/>
	<updated>2026-04-30T05:42:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=782</id>
		<title>ProvaTeoria 2012.01.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=782"/>
		<updated>2014-07-07T20:48:21Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]=&lt;br /&gt;
&lt;br /&gt;
==Esercizio 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct proc{&lt;br /&gt;
	int id;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
monitor seq{&lt;br /&gt;
	stack of struct proc inside; /*pila di proc*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(){&lt;br /&gt;
		this=malloc(sizeof(struct proc)); //or this=new(struct proc);&lt;br /&gt;
		this-&amp;gt;id = getpid();&lt;br /&gt;
		inside.push(this);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(){&lt;br /&gt;
		struct proc *mine = inside.search(getpid()); //cerca il mio elemento nella pila&lt;br /&gt;
		if(inside.first()!= mine) /*first restituisce il primo elemento in cima alla pila*/&lt;br /&gt;
			mine-&amp;gt;oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/&lt;br /&gt;
		inside.pop(); /*rimuovo l'elemento corrente dalla pila*/&lt;br /&gt;
		free(mine); //butto via il risultato perché è certamente == mine&lt;br /&gt;
		next=inside.first();&lt;br /&gt;
		inside.first()-&amp;gt;oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GiuliaN. (con le correzioni del professore)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/&lt;br /&gt;
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		procstack.push(this-&amp;gt;p_id);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		if (procstack.Top()!=this-&amp;gt;p_id){ /*cioè se il processo non è in cima allo stack*/&lt;br /&gt;
			List.insert(this-&amp;gt;p_id);&lt;br /&gt;
			(List.search(this-&amp;gt;p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/&lt;br /&gt;
			}&lt;br /&gt;
		List.remove(this-&amp;gt;p_id);&lt;br /&gt;
		procstack.Pop();&lt;br /&gt;
		List.search(procstack.Top()).signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.&lt;br /&gt;
Però non ho trovato un'altra soluzione&lt;br /&gt;
&lt;br /&gt;
==Esercizio 2==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
pid index[N] /*index contiene gli id dei vari server*/&lt;br /&gt;
&lt;br /&gt;
process server[0]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		tmp msg=arecv(*);&lt;br /&gt;
		for (i=1;i&amp;lt;N;i++)&lt;br /&gt;
			asend(index[i],tmp);&lt;br /&gt;
		print(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[1...N-1]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		msg tmp =arecv(*)&lt;br /&gt;
		if (tmp.sender==index[0])&lt;br /&gt;
			print(tmp);&lt;br /&gt;
		else&lt;br /&gt;
			asend(index[0],tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
process server[0]{ //il primo processo server, che gestisce tutti gli altri&lt;br /&gt;
	while(1){&lt;br /&gt;
		(sender, m) = areceive(*);&lt;br /&gt;
		//chiunque mi abbia spedito il msg io lo stampo&lt;br /&gt;
		printf(m);&lt;br /&gt;
		//lo mando a tutti gli altri server (me escluso) in modo che lo stampino&lt;br /&gt;
		for(i=1; i&amp;lt;N; i++)&lt;br /&gt;
			asend((server0, m), server[i]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[i]{ //per i che va da 1 a N, dove lo 0-esimo è il primo server&lt;br /&gt;
	while(1){&lt;br /&gt;
		(sender, m) = areceive(*);&lt;br /&gt;
		if(sender == server0)&lt;br /&gt;
			printf(m);&lt;br /&gt;
		else //messaggio dal client&lt;br /&gt;
			asend(m, server0); //lo mando al server0, senza prima stamparlo&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=781</id>
		<title>ProvaTeoria 2012.01.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=781"/>
		<updated>2014-07-06T09:39:15Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]=&lt;br /&gt;
&lt;br /&gt;
==Esercizio 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct proc{&lt;br /&gt;
	int id;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
monitor seq{&lt;br /&gt;
	stack of struct proc inside; /*pila di proc*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(){&lt;br /&gt;
		inside.push();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(){&lt;br /&gt;
		if(inside.first()!=inside) /*first restituisce il primo elemento in cima alla pila*/&lt;br /&gt;
			inside.oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/&lt;br /&gt;
		inside.pop(); /*rimuovo l'elemento corrente dalla pila*/&lt;br /&gt;
		inside.first().oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GiuliaN.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/&lt;br /&gt;
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		procstack.push(this-&amp;gt;p_id);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		if (procstack.Top()!=this-&amp;gt;p_id){ /*cioè se il processo non è in cima allo stack*/&lt;br /&gt;
			List.insert(this-&amp;gt;p_id);&lt;br /&gt;
			(List.search(this-&amp;gt;p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/&lt;br /&gt;
			}&lt;br /&gt;
		List.remove(this-&amp;gt;p_id);&lt;br /&gt;
		procstack.Pop();&lt;br /&gt;
		List.search(procstack.Top()).signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.&lt;br /&gt;
Però non ho trovato un'altra soluzione&lt;br /&gt;
&lt;br /&gt;
==Esercizio 2==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
pid index[N] /*index contiene gli id dei vari server*/&lt;br /&gt;
&lt;br /&gt;
process server[0]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		tmp msg=arecv(*);&lt;br /&gt;
		for (i=1;i&amp;lt;N;i++)&lt;br /&gt;
			asend(index[i],tmp);&lt;br /&gt;
		print(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[1...N-1]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		msg tmp =arecv(*)&lt;br /&gt;
		if (tmp.sender==index[0])&lt;br /&gt;
			print(tmp);&lt;br /&gt;
		else&lt;br /&gt;
			asend(index[0],tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
process server[0]{ //il primo processo server, che gestisce tutti gli altri&lt;br /&gt;
	while(1){&lt;br /&gt;
		(sender, m) = areceive(*);&lt;br /&gt;
		//chiunque mi abbia spedito il msg io lo stampo&lt;br /&gt;
		printf(m);&lt;br /&gt;
		//lo mando a tutti gli altri server (me escluso) in modo che lo stampino&lt;br /&gt;
		for(i=1; i&amp;lt;N; i++)&lt;br /&gt;
			asend((server0, m), server[i]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[i]{ //per i che va da 1 a N, dove lo 0-esimo è il primo server&lt;br /&gt;
	while(1){&lt;br /&gt;
		(sender, m) = areceive(*);&lt;br /&gt;
		if(sender == server0)&lt;br /&gt;
			printf(m);&lt;br /&gt;
		else //messaggio dal client&lt;br /&gt;
			asend(m, server0); //lo mando al server0, senza prima stamparlo&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=780</id>
		<title>ProvaTeoria 2012.01.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=780"/>
		<updated>2014-07-06T09:38:42Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]=&lt;br /&gt;
&lt;br /&gt;
==Esercizio 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct proc{&lt;br /&gt;
	int id;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
monitor seq{&lt;br /&gt;
	stack of struct proc inside; /*pila di proc*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(){&lt;br /&gt;
		inside.push();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(){&lt;br /&gt;
		if(inside.first()!=inside) /*first restituisce il primo elemento in cima alla pila*/&lt;br /&gt;
			inside.oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/&lt;br /&gt;
		inside.pop(); /*rimuovo l'elemento corrente dalla pila*/&lt;br /&gt;
		inside.first().oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GiuliaN.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/&lt;br /&gt;
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		procstack.push(this-&amp;gt;p_id);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		if (procstack.Top()!=this-&amp;gt;p_id){ /*cioè se il processo non è in cima allo stack*/&lt;br /&gt;
			List.insert(this-&amp;gt;p_id);&lt;br /&gt;
			(List.search(this-&amp;gt;p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/&lt;br /&gt;
			}&lt;br /&gt;
		List.remove(this-&amp;gt;p_id);&lt;br /&gt;
		procstack.Pop();&lt;br /&gt;
		List.search(procstack.Top()).signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.&lt;br /&gt;
Però non ho trovato un'altra soluzione&lt;br /&gt;
&lt;br /&gt;
==Esercizio 2==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
pid index[N] /*index contiene gli id dei vari server*/&lt;br /&gt;
&lt;br /&gt;
process server[0]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		tmp msg=arecv(*);&lt;br /&gt;
		for (i=1;i&amp;lt;N;i++)&lt;br /&gt;
			asend(index[i],tmp);&lt;br /&gt;
		print(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[1...N-1]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		msg tmp =arecv(*)&lt;br /&gt;
		if (tmp.sender==index[0])&lt;br /&gt;
			print(tmp);&lt;br /&gt;
		else&lt;br /&gt;
			asend(index[0],tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
process server0{ //il primo processo server, che gestisce tutti gli altri&lt;br /&gt;
	while(1){&lt;br /&gt;
		(sender, m) = areceive(*);&lt;br /&gt;
		//chiunque mi abbia spedito il msg io lo stampo&lt;br /&gt;
		printf(m);&lt;br /&gt;
		//lo mando a tutti gli altri server (me escluso) in modo che lo stampino&lt;br /&gt;
		for(i=1; i&amp;lt;N; i++)&lt;br /&gt;
			asend((server0, m), server[i]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[i]{ //per i che va da 1 a N, dove lo 0-esimo è il primo server&lt;br /&gt;
	while(1){&lt;br /&gt;
		(sender, m) = areceive(*);&lt;br /&gt;
		if(sender == server0)&lt;br /&gt;
			printf(m);&lt;br /&gt;
		else //messaggio dal client&lt;br /&gt;
			asend(m, server0); //lo mando al server0, senza prima stamparlo&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=779</id>
		<title>ProvaTeoria 2012.01.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=779"/>
		<updated>2014-07-03T21:41:44Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]=&lt;br /&gt;
&lt;br /&gt;
==Esercizio 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct proc{&lt;br /&gt;
	int id;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
monitor seq{&lt;br /&gt;
	stack of struct proc inside; /*pila di proc*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(){&lt;br /&gt;
		inside.push();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(){&lt;br /&gt;
		if(inside.first()!=inside) /*first restituisce il primo elemento in cima alla pila*/&lt;br /&gt;
			inside.oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/&lt;br /&gt;
		inside.pop(); /*rimuovo l'elemento corrente dalla pila*/&lt;br /&gt;
		inside.first().oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GiuliaN.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/&lt;br /&gt;
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		procstack.push(this-&amp;gt;p_id);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		if (procstack.Top()!=this-&amp;gt;p_id){ /*cioè se il processo non è in cima allo stack*/&lt;br /&gt;
			List.insert(this-&amp;gt;p_id);&lt;br /&gt;
			(List.search(this-&amp;gt;p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/&lt;br /&gt;
			}&lt;br /&gt;
		List.remove(this-&amp;gt;p_id);&lt;br /&gt;
		procstack.Pop();&lt;br /&gt;
		List.search(procstack.Top()).signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.&lt;br /&gt;
Però non ho trovato un'altra soluzione&lt;br /&gt;
&lt;br /&gt;
==Esercizio 2==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
pid index[N] /*index contiene gli id dei vari server*/&lt;br /&gt;
&lt;br /&gt;
process server[0]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		tmp msg=arecv(*);&lt;br /&gt;
		for (i=1;i&amp;lt;N;i++)&lt;br /&gt;
			asend(index[i],tmp);&lt;br /&gt;
		print(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[1...N-1]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		msg tmp =arecv(*)&lt;br /&gt;
		if (tmp.sender==index[0])&lt;br /&gt;
			print(tmp);&lt;br /&gt;
		else&lt;br /&gt;
			asend(index[0],tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=778</id>
		<title>ProvaTeoria 2012.01.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=778"/>
		<updated>2014-07-03T21:35:38Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]=&lt;br /&gt;
&lt;br /&gt;
==Esercizio 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct proc{&lt;br /&gt;
	int id;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
monitor seq{&lt;br /&gt;
	stack of struct proc inside; /*pila di proc*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(){&lt;br /&gt;
		inside.push();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(){&lt;br /&gt;
		if(inside.first()!=inside.id) /*first restituisce l'id del primo elemento in cima alla pila*/&lt;br /&gt;
			inside.oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/&lt;br /&gt;
		inside.pop(); /*rimuovo l'elemento corrente dalla pila*/&lt;br /&gt;
		inside.first().oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GiuliaN.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/&lt;br /&gt;
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		procstack.push(this-&amp;gt;p_id);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		if (procstack.Top()!=this-&amp;gt;p_id){ /*cioè se il processo non è in cima allo stack*/&lt;br /&gt;
			List.insert(this-&amp;gt;p_id);&lt;br /&gt;
			(List.search(this-&amp;gt;p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/&lt;br /&gt;
			}&lt;br /&gt;
		List.remove(this-&amp;gt;p_id);&lt;br /&gt;
		procstack.Pop();&lt;br /&gt;
		List.search(procstack.Top()).signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.&lt;br /&gt;
Però non ho trovato un'altra soluzione&lt;br /&gt;
&lt;br /&gt;
==Esercizio 2==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
pid index[N] /*index contiene gli id dei vari server*/&lt;br /&gt;
&lt;br /&gt;
process server[0]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		tmp msg=arecv(*);&lt;br /&gt;
		for (i=1;i&amp;lt;N;i++)&lt;br /&gt;
			asend(index[i],tmp);&lt;br /&gt;
		print(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[1...N-1]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		msg tmp =arecv(*)&lt;br /&gt;
		if (tmp.sender==index[0])&lt;br /&gt;
			print(tmp);&lt;br /&gt;
		else&lt;br /&gt;
			asend(index[0],tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=777</id>
		<title>ProvaTeoria 2012.01.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2012.01.12&amp;diff=777"/>
		<updated>2014-07-03T21:35:23Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]=&lt;br /&gt;
&lt;br /&gt;
==Esercizio 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct proc{&lt;br /&gt;
	int id;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
monitor seq{&lt;br /&gt;
	stack of struct proc inside; /*pila di proc*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(){&lt;br /&gt;
		inside.push();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(){&lt;br /&gt;
		if(inside.first()!=inside.id) /*first restituisce l'id del primo elemento in cima alla pila*/&lt;br /&gt;
			inside.oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/&lt;br /&gt;
		inside.pop(); /*rimuovo l'elemento corrente dalla pila*/&lt;br /&gt;
		inside.first().oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/&lt;br /&gt;
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		procstack.push(this-&amp;gt;p_id);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		if (procstack.Top()!=this-&amp;gt;p_id){ /*cioè se il processo non è in cima allo stack*/&lt;br /&gt;
			List.insert(this-&amp;gt;p_id);&lt;br /&gt;
			(List.search(this-&amp;gt;p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/&lt;br /&gt;
			}&lt;br /&gt;
		List.remove(this-&amp;gt;p_id);&lt;br /&gt;
		procstack.Pop();&lt;br /&gt;
		List.search(procstack.Top()).signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.&lt;br /&gt;
Però non ho trovato un'altra soluzione&lt;br /&gt;
&lt;br /&gt;
==Esercizio 2==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
pid index[N] /*index contiene gli id dei vari server*/&lt;br /&gt;
&lt;br /&gt;
process server[0]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		tmp msg=arecv(*);&lt;br /&gt;
		for (i=1;i&amp;lt;N;i++)&lt;br /&gt;
			asend(index[i],tmp);&lt;br /&gt;
		print(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process server[1...N-1]&lt;br /&gt;
{&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		msg tmp =arecv(*)&lt;br /&gt;
		if (tmp.sender==index[0])&lt;br /&gt;
			print(tmp);&lt;br /&gt;
		else&lt;br /&gt;
			asend(index[0],tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2011.01.17&amp;diff=771</id>
		<title>ProvaTeoria 2011.01.17</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeoria_2011.01.17&amp;diff=771"/>
		<updated>2014-06-06T15:53:30Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[http://www.cs.unibo.it/~renzo/so/compiti/2011-01-17.tot.pdf TESTO COMPITO]=&lt;br /&gt;
&lt;br /&gt;
==Esercizio 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*Scrivere un monitor reqq che gestisca una coda di richieste.&lt;br /&gt;
I richiedenti chiamano la funzione che ha la seguente signature:&lt;br /&gt;
answer_t reqq.query(request_t request);&lt;br /&gt;
Query deve fermare il processo richiedente fino a completamento della richiesta da parte di un gestore. Il valore di ritorno&lt;br /&gt;
e' la risposta del gestore.&lt;br /&gt;
Ci sono N gestori che si comportano come segue:&lt;br /&gt;
multiq_handler: process[i, i=0,..,N-1] {&lt;br /&gt;
	request_t req;&lt;br /&gt;
	int type;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		req=reqq.getquery(i);&lt;br /&gt;
		reqq.reply(i,handle(req));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
Le richieste vengono assegnate ai gestori disponibili o accodate se sono tutti impegnati. Quando un gestore termina la&lt;br /&gt;
gestione (funzione handle, che non implementare!) invia il risultato tramite la reply. Il valore passato alla reply deve&lt;br /&gt;
essere restituito al richiedente come valore di ritorno della funzione query. Se non vi sono richieste disponibili i gestori si&lt;br /&gt;
fermano attendendo nuove richieste.*/&lt;br /&gt;
&lt;br /&gt;
monitor reqq{&lt;br /&gt;
	condition oktogetquery;&lt;br /&gt;
	condition oktoask;&lt;br /&gt;
	condition oktogo;&lt;br /&gt;
	queue waiting;&lt;br /&gt;
	int gestori=0;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry answer_t query(request_t request){&lt;br /&gt;
		waiting.enqueue(request);&lt;br /&gt;
		if(gestori&amp;gt;=N)&lt;br /&gt;
			oktoask.wait();&lt;br /&gt;
		oktogetquery.signal();&lt;br /&gt;
		send(request);&lt;br /&gt;
		oktogo.wait();&lt;br /&gt;
		if(!waiting.isEmpty())&lt;br /&gt;
			oktoask.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry request_t getquery(int i){&lt;br /&gt;
		if(waiting.isEmpty())&lt;br /&gt;
			oktogetquery.wait();&lt;br /&gt;
		gestori++;&lt;br /&gt;
		waiting.dequeue();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry answer_t reply(int i, rips){&lt;br /&gt;
		gestori--;&lt;br /&gt;
		oktogo.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Giulia e Lisa&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Esercizio 1: Scrivere un monitor reqq che gestisca una coda di richieste.&lt;br /&gt;
I richiedenti chiamano la funzione che ha la seguente signature:&lt;br /&gt;
answer_t reqq.query(request_t request);&lt;br /&gt;
Query deve fermare il processo richiedente fino a completamento della richiesta da parte di un gestore. Il valore di ritorno &lt;br /&gt;
e' la risposta del gestore.&lt;br /&gt;
Ci sono N gestori che si comportano come segue:&lt;br /&gt;
multiq_handler: process[i, i=0,..,N-1] {&lt;br /&gt;
	request_t req;&lt;br /&gt;
	int type;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		 req=reqq.getquery(i);&lt;br /&gt;
		 reqq.reply(i,handle(req));&lt;br /&gt;
 	}&lt;br /&gt;
}&lt;br /&gt;
Le richieste vengono assegnate ai gestori disponibili o accodate se sono tutti impegnati. Quando un gestore termina la &lt;br /&gt;
gestione (funzione handle, che non implementare!) invia il risultato tramite la reply. Il valore passato alla reply deve &lt;br /&gt;
essere restituito al richiedente come valore di ritorno della funzione query. Se non vi sono richieste disponibili i gestori si &lt;br /&gt;
fermano attendendo nuove richieste.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*La mia soluzione si basa su una struttura reqEntry contenente un campo per la domanda, uno per la risposta, una condizione oktoexit e un intero per il gestore.&lt;br /&gt;
Quando arriva un richiedente inserisce una struttura con una domanda e con i campi risposta e gestore vuoti.&lt;br /&gt;
Quando un gestore si occupa di una domanda setta l'opportuno campo gestore al suo indice e, al termine della routine handle(), inserisce la sua risposta nell'opportuno&lt;br /&gt;
campo della struct risvegliando il richiedente*/&lt;br /&gt;
&lt;br /&gt;
struct reqEntry&lt;br /&gt;
{&lt;br /&gt;
	request_t req;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
	answer_t reply=NULL;&lt;br /&gt;
	int handler=VOID; //VOID è un valore speciale avente valore diverso dagli indici dei gestori&lt;br /&gt;
}&lt;br /&gt;
monitor reqq&lt;br /&gt;
{&lt;br /&gt;
	reqEntry* rq=Queue(); /*coda di reqEntry*/&lt;br /&gt;
	condition oktohandle; /*per i gestori*/&lt;br /&gt;
	answer_t procedure entry query(request_t request)&lt;br /&gt;
	{&lt;br /&gt;
		rq.insert(request); &lt;br /&gt;
		rp=rq.searchByReq(request);&lt;br /&gt;
		oktohandle.signal(); /*cerco se esiste un gestore in attesa per la mia richiesta*/&lt;br /&gt;
		rp-&amp;gt;oktoexit.wait();&lt;br /&gt;
		risp=rp-&amp;gt;reply; &lt;br /&gt;
		remove(rp); /*recupero la risposta e rimuovo la struct dalla coda*/&lt;br /&gt;
		return risp;	&lt;br /&gt;
	}&lt;br /&gt;
	request_t procedure entry  getquery(int index)&lt;br /&gt;
	{&lt;br /&gt;
		if isEmptyFree(rq) /*isEmptyFree ritorna 1 se non ci sono struct libere (cioè con handler VOID) nella coda di reqEntry*/&lt;br /&gt;
		{&lt;br /&gt;
			oktohandle.wait();&lt;br /&gt;
		}&lt;br /&gt;
		rp=rq.searchFree(); /*restituisce un elemento della coda di reqEntry avente handler VOID*/&lt;br /&gt;
		rp-&amp;gt;handler=index; &lt;br /&gt;
		return rp;&lt;br /&gt;
	}&lt;br /&gt;
	procedure entry reply(int index, answer_t rep)&lt;br /&gt;
	{&lt;br /&gt;
		rp=rq.searchByHandler(index); /*cerca nella lista la struct avente handler uguale al mio indice*/&lt;br /&gt;
		rp-&amp;gt;reply=rep;&lt;br /&gt;
		rp-&amp;gt;oktoexit.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct sendINFO&lt;br /&gt;
{&lt;br /&gt;
	pid_t receiver;&lt;br /&gt;
	int nmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendINFO* listINFO=List(); //ogni processo ha un database di strutture sendINFO per sapere quanti messaggi di ogni destinatario&lt;br /&gt;
						   //risultano ancora non recapitati&lt;br /&gt;
&lt;br /&gt;
T* database=List(); //ogni processo ha un database di messaggi &lt;br /&gt;
&lt;br /&gt;
int iasend(pid_t destination, T message)&lt;br /&gt;
{&lt;br /&gt;
	T tmpMSG;&lt;br /&gt;
	sendINFO tmpINFO;&lt;br /&gt;
	asend(destination,message);	&lt;br /&gt;
	if ((tmpINFO=listINFO.search(destination))==NULL) //se questo destinatario non ha ancora un'entry nella lista, lo inserisco&lt;br /&gt;
		{&lt;br /&gt;
			list.insert(destination,0);&lt;br /&gt;
			tmpINFO=listINFO.search(destination);&lt;br /&gt;
		}&lt;br /&gt;
	tmpINFO.nmsg++; &lt;br /&gt;
	&lt;br /&gt;
	/*SCORRIMENTO BUFFER DI MESSAGGI E AGGIORNAMENTO LISTA*/&lt;br /&gt;
	asend(getpid(),&amp;quot;BOT&amp;quot;); &lt;br /&gt;
	while((tmpMSG=arecv(*))!=&amp;quot;BOT&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		if (tmpMSG==&amp;quot;OK&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			tmpINFO=listINFO.search(tmpMSG.sender);&lt;br /&gt;
			tmpINFO.nmsg--;&lt;br /&gt;
			if (nmsg==0)&lt;br /&gt;
				listINFO.remove(tmpINFO);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
			db.add(tmpMSG);&lt;br /&gt;
	}&lt;br /&gt;
	tmpINFO=search(destination);&lt;br /&gt;
	if(tmpINFO!=NULL)&lt;br /&gt;
		return tmpINFO.nmsg;&lt;br /&gt;
	else&lt;br /&gt;
		return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T iareceive(pid_t sender)&lt;br /&gt;
{&lt;br /&gt;
	T ris;&lt;br /&gt;
	ris=db.search(sender);&lt;br /&gt;
	if (ris==NULL)&lt;br /&gt;
		ris=arecv(sender);&lt;br /&gt;
	asend(sender,&amp;quot;OK&amp;quot;);&lt;br /&gt;
	return ris;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.02.15&amp;diff=707</id>
		<title>ProvaTeorica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.02.15&amp;diff=707"/>
		<updated>2014-05-10T18:06:11Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.02.15.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esercizio 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Esercizio c.1: (a) Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza&lt;br /&gt;
BUFSIZE) che consenta a uno scrittore di scrivere contemporaneamente due elementi che andranno rispettivamente&lt;br /&gt;
nel primo e nel secondo buffer. Le letture :&lt;br /&gt;
 procedure entry void write(type1 e1, type2 e2);&lt;br /&gt;
 procedure entry type1 read1();&lt;br /&gt;
 procedure entry type2 read2();&lt;br /&gt;
La funzione write deve attendere che ci sia spazio in entrambi i buffer. &lt;br /&gt;
La funzione read attende che vi sia almeno un elemento nel buffer indicato&lt;br /&gt;
*/&lt;br /&gt;
monitor dualwriter&lt;br /&gt;
{&lt;br /&gt;
	type1* buffer1;&lt;br /&gt;
	type2* buffer2;&lt;br /&gt;
	condition oktowrite,oktoread1, oktoread2&lt;br /&gt;
	procedure entry void write (type1 e1, type2 e2)&lt;br /&gt;
	{&lt;br /&gt;
		if (sizeof(type1)&amp;gt;=BUFSIZE || sizeof(type2)&amp;gt;=BUFSIZE)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		buffer1.push(e1);&lt;br /&gt;
		buffer2.push(e2);&lt;br /&gt;
		oktoread1.signal();&lt;br /&gt;
		oktoread2.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry type1 read1()&lt;br /&gt;
	{&lt;br /&gt;
		if (sizeof(buffer1)==0)&lt;br /&gt;
			oktoread1.wait();&lt;br /&gt;
		buffer1.pop();&lt;br /&gt;
		if (sizeof(buffer2)&amp;lt;BUFSIZE)&lt;br /&gt;
			oktowrite.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry type2 read2()&lt;br /&gt;
	{&lt;br /&gt;
		if (sizeof(buffer2)==0)&lt;br /&gt;
			oktoread2.wait();&lt;br /&gt;
		buffer2.pop();&lt;br /&gt;
		if (sizeof(buffer1)&amp;lt;BUFSIZE)&lt;br /&gt;
			oktowrite.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor dualwriter{&lt;br /&gt;
	queue buffer1;&lt;br /&gt;
	queue buffer2;&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktoread1;&lt;br /&gt;
	condition oktoread2;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry void write(type1 e1, type2 e2){&lt;br /&gt;
		if((buffer1.len() == BUFSIZE) || (buffer2.len() == BUFSIZE)) /*se uno dei due buffer è pieno non puoi inserire*/&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		&lt;br /&gt;
		buffer1.enqueue(e1);&lt;br /&gt;
		buffer2.enqueue(e2);&lt;br /&gt;
		&lt;br /&gt;
		oktoread1.signal();&lt;br /&gt;
		oktoread2.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry type1 read1(){&lt;br /&gt;
		if(buffer1.len() == 0) /*buffer vuoto*/&lt;br /&gt;
			oktoread1.wait();&lt;br /&gt;
		&lt;br /&gt;
		buffer1.dequeue;&lt;br /&gt;
		oktowrite.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry type2 read2(){&lt;br /&gt;
		if(buffer2.len() == 0) /*buffer vuoto*/&lt;br /&gt;
			oktoread2.wait();&lt;br /&gt;
		&lt;br /&gt;
		buffer2.dequeue;&lt;br /&gt;
		oktowrite.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Giulia&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[File:RoundRobin2cpu.png]]&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=646</id>
		<title>ProvaTeorica 2013.01.24</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=646"/>
		<updated>2014-04-30T14:02:14Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;testo: http://www.cs.unibo.it/~renzo/so/compiti/2013-01-24.tot.pdf&lt;br /&gt;
&lt;br /&gt;
Esercizio C1:&lt;br /&gt;
(a) Scrivere un monitor nmbb che realizzi un buffer limitato (di ampiezza BUFSIZE) che consenta alle&lt;br /&gt;
chiamate write (inserimento nel buffer) e read (lettura da buffer) di operare su vettori di piu' elementi. In particolare&lt;br /&gt;
l'interfaccia delle procedure entry da implementare e' la seguente:&lt;br /&gt;
procedure entry write(int n, struct elem *v);&lt;br /&gt;
procedure entry read(int m, struct elem *w);&lt;br /&gt;
se n o m sono maggiori di BUFSIZE le funzioni non devono fare nulla (caso di errore).&lt;br /&gt;
La funzione write deve attendere che ci sia spazio nel buffer per inserire n elementi (il vettore v conterra' n elementi).&lt;br /&gt;
Solo quando e' possibile completare l'operazione vengono inseriti tutti gli elementi di v nel buffer.&lt;br /&gt;
La funzione read attende che vi siano almeno m elementi nel buffer quindi estrae dal buffer (in ordine FIFO) m elementi e li copia nel vettore w .&lt;br /&gt;
(b) sono possibili casi di deadlock? (motivare dettagliatamente la risposta)&lt;br /&gt;
&lt;br /&gt;
La mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
read(): legge dalla coda un elemento senza rimuoverlo&lt;br /&gt;
queue(elem v,int n): inserisce nella coda n elementi v;&lt;br /&gt;
dequeue(int n): legge n elementi dalla coda e li rimuove;&lt;br /&gt;
&lt;br /&gt;
monitor  mnbb{&lt;br /&gt;
	conditon oktowrite, oktoread;&lt;br /&gt;
	queue qwrite,qread;&lt;br /&gt;
&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		}&lt;br /&gt;
		if( n &amp;gt; (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.queue( n, 1 );&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		}&lt;br /&gt;
		buff.queue( v, n );&lt;br /&gt;
		if(qread.read() &amp;lt;= buff.lengh){&lt;br /&gt;
			qread.dequeue(1);&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		} &lt;br /&gt;
		if(m &amp;gt; buff.lengh){&lt;br /&gt;
			qread.queue( m, 1 );&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		}&lt;br /&gt;
		w = buff.dequeue(m);&lt;br /&gt;
		if(qwrite.read() &amp;lt;= (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.dequeue(1);&lt;br /&gt;
			oktowirte.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor nmbb{&lt;br /&gt;
	queue buffer;&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	&lt;br /&gt;
	/* assumiamo che essendo un buffer limitato ci sia un solo processo che vuole scrivere e un solo processo che vuole leggere */&lt;br /&gt;
	int N, M;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n&amp;gt;BUFSIZE) return;&lt;br /&gt;
		N=n;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; N)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;N; i++)&lt;br /&gt;
			buffer.enqueue(v[i]);&lt;br /&gt;
			&lt;br /&gt;
		if(buffer.len &amp;gt;= M)&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m&amp;gt;BUFSIZE) return;&lt;br /&gt;
		M=m;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; M)&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++)&lt;br /&gt;
			w[i] = buffer.dequeue;&lt;br /&gt;
		&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;gt;= N)&lt;br /&gt;
			oktowrite.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Si può verificare deadlock. Esempio: un lettore vuole leggere un tot di elementi, ma quelli presenti non sono sufficienti. Uno scrittore a sua volta non può più scrivere un certo numero di elementi in quanto il buffer è parzialmente occupato. Lo scrittore aspetterà che il lettore legga; il lettore aspetterà invece lo scrittore: deadlock.&lt;br /&gt;
&lt;br /&gt;
L'eventualità che si verifichi deadlock tuttavia è contemplata dalla traccia, come fa capire il punto b)&lt;br /&gt;
&lt;br /&gt;
Gabriele e Giulia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio g1 ==&lt;br /&gt;
                                                                                                               &lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|TEMPO&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|4&lt;br /&gt;
|5&lt;br /&gt;
|6&lt;br /&gt;
|7&lt;br /&gt;
|8&lt;br /&gt;
|9&lt;br /&gt;
|10&lt;br /&gt;
|11&lt;br /&gt;
|12&lt;br /&gt;
|13&lt;br /&gt;
|14&lt;br /&gt;
|15&lt;br /&gt;
|16&lt;br /&gt;
|17&lt;br /&gt;
|18&lt;br /&gt;
|19&lt;br /&gt;
|20&lt;br /&gt;
|21&lt;br /&gt;
|22&lt;br /&gt;
|23&lt;br /&gt;
|24&lt;br /&gt;
|-&lt;br /&gt;
|CPU 1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P3&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P4&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|-&lt;br /&gt;
|CPU 2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|-&lt;br /&gt;
|I/O&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P2&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P4&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=620</id>
		<title>ProvaTeorica 2013.01.24</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=620"/>
		<updated>2014-04-29T15:10:16Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio g1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio C1:&lt;br /&gt;
(a) Scrivere un monitor nmbb che realizzi un buffer limitato (di ampiezza BUFSIZE) che consenta alle&lt;br /&gt;
chiamate write (inserimento nel buffer) e read (lettura da buffer) di operare su vettori di piu' elementi. In particolare&lt;br /&gt;
l'interfaccia delle procedure entry da implementare e' la seguente:&lt;br /&gt;
procedure entry write(int n, struct elem *v);&lt;br /&gt;
procedure entry read(int m, struct elem *w);&lt;br /&gt;
se n o m sono maggiori di BUFSIZE le funzioni non devono fare nulla (caso di errore).&lt;br /&gt;
La funzione write deve attendere che ci sia spazio nel buffer per inserire n elementi (il vettore v conterra' n elementi).&lt;br /&gt;
Solo quando e' possibile completare l'operazione vengono inseriti tutti gli elementi di v nel buffer.&lt;br /&gt;
La funzione read attende che vi siano almeno m elementi nel buffer quindi estrae dal buffer (in ordine FIFO) m elementi e li copia nel vettore w .&lt;br /&gt;
(b) sono possibili casi di deadlock? (motivare dettagliatamente la risposta)&lt;br /&gt;
&lt;br /&gt;
La mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
read(): legge dalla coda un elemento senza rimuoverlo&lt;br /&gt;
queue(elem v,int n): inserisce nella coda n elementi v;&lt;br /&gt;
dequeue(int n): legge n elementi dalla coda e li rimuove;&lt;br /&gt;
&lt;br /&gt;
monitor  mnbb{&lt;br /&gt;
	conditon oktowrite, oktoread;&lt;br /&gt;
	queue qwrite,qread;&lt;br /&gt;
&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		}&lt;br /&gt;
		if( n &amp;gt; (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.queue( n, 1 );&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		}&lt;br /&gt;
		buff.queue( v, n );&lt;br /&gt;
		if(qread.read() &amp;lt;= buff.lengh){&lt;br /&gt;
			qread.dequeue(1);&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		} &lt;br /&gt;
		if(m &amp;gt; buff.lengh){&lt;br /&gt;
			qread.queue( m, 1 );&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		}&lt;br /&gt;
		w = buff.dequeue(m);&lt;br /&gt;
		if(qwrite.read() &amp;lt;= (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.dequeue(1);&lt;br /&gt;
			oktowirte.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor nmbb{&lt;br /&gt;
	queue buffer;&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	&lt;br /&gt;
	/* assumiamo che essendo un buffer limitato ci sia un solo processo che vuole scrivere e un solo processo che vuole leggere */&lt;br /&gt;
	int N, M;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n&amp;gt;BUFSIZE) return;&lt;br /&gt;
		N=n;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; N)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;N; i++)&lt;br /&gt;
			buffer.enqueue(v[i]);&lt;br /&gt;
			&lt;br /&gt;
		if(buffer.len &amp;gt;= M)&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m&amp;gt;BUFSIZE) return;&lt;br /&gt;
		M=m;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; M)&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++)&lt;br /&gt;
			w[i] = buffer.dequeue;&lt;br /&gt;
		&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;gt;= N)&lt;br /&gt;
			oktowrite.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Si può verificare deadlock. Esempio: un lettore vuole leggere un tot di elementi, ma quelli presenti non sono sufficienti. Uno scrittore a sua volta non può più scrivere un certo numero di elementi in quanto il buffer è parzialmente occupato. Lo scrittore aspetterà che il lettore legga; il lettore aspetterà invece lo scrittore: deadlock.&lt;br /&gt;
&lt;br /&gt;
L'eventualità che si verifichi deadlock tuttavia è contemplata dalla traccia, come fa capire il punto b)&lt;br /&gt;
&lt;br /&gt;
Gabriele e Giulia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio g1 ==&lt;br /&gt;
                                                                                                               &lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|TEMPO&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|4&lt;br /&gt;
|5&lt;br /&gt;
|6&lt;br /&gt;
|7&lt;br /&gt;
|8&lt;br /&gt;
|9&lt;br /&gt;
|10&lt;br /&gt;
|11&lt;br /&gt;
|12&lt;br /&gt;
|13&lt;br /&gt;
|14&lt;br /&gt;
|15&lt;br /&gt;
|16&lt;br /&gt;
|17&lt;br /&gt;
|18&lt;br /&gt;
|19&lt;br /&gt;
|20&lt;br /&gt;
|21&lt;br /&gt;
|22&lt;br /&gt;
|23&lt;br /&gt;
|24&lt;br /&gt;
|-&lt;br /&gt;
|CPU 1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P3&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P4&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|-&lt;br /&gt;
|CPU 2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|-&lt;br /&gt;
|I/O&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P2&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P4&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=619</id>
		<title>ProvaTeorica 2013.01.24</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=619"/>
		<updated>2014-04-29T15:09:45Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio C1:&lt;br /&gt;
(a) Scrivere un monitor nmbb che realizzi un buffer limitato (di ampiezza BUFSIZE) che consenta alle&lt;br /&gt;
chiamate write (inserimento nel buffer) e read (lettura da buffer) di operare su vettori di piu' elementi. In particolare&lt;br /&gt;
l'interfaccia delle procedure entry da implementare e' la seguente:&lt;br /&gt;
procedure entry write(int n, struct elem *v);&lt;br /&gt;
procedure entry read(int m, struct elem *w);&lt;br /&gt;
se n o m sono maggiori di BUFSIZE le funzioni non devono fare nulla (caso di errore).&lt;br /&gt;
La funzione write deve attendere che ci sia spazio nel buffer per inserire n elementi (il vettore v conterra' n elementi).&lt;br /&gt;
Solo quando e' possibile completare l'operazione vengono inseriti tutti gli elementi di v nel buffer.&lt;br /&gt;
La funzione read attende che vi siano almeno m elementi nel buffer quindi estrae dal buffer (in ordine FIFO) m elementi e li copia nel vettore w .&lt;br /&gt;
(b) sono possibili casi di deadlock? (motivare dettagliatamente la risposta)&lt;br /&gt;
&lt;br /&gt;
La mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
read(): legge dalla coda un elemento senza rimuoverlo&lt;br /&gt;
queue(elem v,int n): inserisce nella coda n elementi v;&lt;br /&gt;
dequeue(int n): legge n elementi dalla coda e li rimuove;&lt;br /&gt;
&lt;br /&gt;
monitor  mnbb{&lt;br /&gt;
	conditon oktowrite, oktoread;&lt;br /&gt;
	queue qwrite,qread;&lt;br /&gt;
&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		}&lt;br /&gt;
		if( n &amp;gt; (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.queue( n, 1 );&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		}&lt;br /&gt;
		buff.queue( v, n );&lt;br /&gt;
		if(qread.read() &amp;lt;= buff.lengh){&lt;br /&gt;
			qread.dequeue(1);&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		} &lt;br /&gt;
		if(m &amp;gt; buff.lengh){&lt;br /&gt;
			qread.queue( m, 1 );&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		}&lt;br /&gt;
		w = buff.dequeue(m);&lt;br /&gt;
		if(qwrite.read() &amp;lt;= (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.dequeue(1);&lt;br /&gt;
			oktowirte.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor nmbb{&lt;br /&gt;
	queue buffer;&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	&lt;br /&gt;
	/* assumiamo che essendo un buffer limitato ci sia un solo processo che vuole scrivere e un solo processo che vuole leggere */&lt;br /&gt;
	int N, M;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n&amp;gt;BUFSIZE) return;&lt;br /&gt;
		N=n;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; N)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;N; i++)&lt;br /&gt;
			buffer.enqueue(v[i]);&lt;br /&gt;
			&lt;br /&gt;
		if(buffer.len &amp;gt;= M)&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m&amp;gt;BUFSIZE) return;&lt;br /&gt;
		M=m;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; M)&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++)&lt;br /&gt;
			w[i] = buffer.dequeue;&lt;br /&gt;
		&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;gt;= N)&lt;br /&gt;
			oktowrite.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Si può verificare deadlock. Esempio: un lettore vuole leggere un tot di elementi, ma quelli presenti non sono sufficienti. Uno scrittore a sua volta non può più scrivere un certo numero di elementi in quanto il buffer è parzialmente occupato. Lo scrittore aspetterà che il lettore legga; il lettore aspetterà invece lo scrittore: deadlock.&lt;br /&gt;
&lt;br /&gt;
L'eventualità che si verifichi deadlock tuttavia è contemplata dalla traccia, come fa capire il punto b)&lt;br /&gt;
&lt;br /&gt;
Gabriele e Giulia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio g1 ==&lt;br /&gt;
                                                                                                               &lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|TEMPO&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|4&lt;br /&gt;
|5&lt;br /&gt;
|6&lt;br /&gt;
|7&lt;br /&gt;
|8&lt;br /&gt;
|9&lt;br /&gt;
|10&lt;br /&gt;
|11&lt;br /&gt;
|12&lt;br /&gt;
|13&lt;br /&gt;
|14&lt;br /&gt;
|15&lt;br /&gt;
|16&lt;br /&gt;
|17&lt;br /&gt;
|18&lt;br /&gt;
|19&lt;br /&gt;
|20&lt;br /&gt;
|21&lt;br /&gt;
|22&lt;br /&gt;
|23&lt;br /&gt;
|24&lt;br /&gt;
|-&lt;br /&gt;
|CPU 1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P3&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P4&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|-&lt;br /&gt;
|CPU 2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P4&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|-&lt;br /&gt;
|I/O&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|P2&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P2&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P1&lt;br /&gt;
|P3&lt;br /&gt;
|P3&lt;br /&gt;
|P4&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2011.09.12&amp;diff=618</id>
		<title>ProvaPratica 2011.09.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2011.09.12&amp;diff=618"/>
		<updated>2014-04-29T13:59:24Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2011-09-12.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int N_DIR1=0,N_DIR2=0;&lt;br /&gt;
&lt;br /&gt;
int source(char*s)&lt;br /&gt;
{&lt;br /&gt;
	int x=strlen(s);&lt;br /&gt;
	if (x&amp;gt;=3)&lt;br /&gt;
	{&lt;br /&gt;
		if ((s[x-1]=='c') || (s[x-1]=='h'))&lt;br /&gt;
		{&lt;br /&gt;
			if (s[x-2]=='.') return 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
void print_diff(char**dir1,char**dir2)&lt;br /&gt;
{&lt;br /&gt;
	int i,j,found=0;&lt;br /&gt;
	for (i=0;i&amp;lt;N_DIR1;i++){&lt;br /&gt;
		for(j=0;j&amp;lt;N_DIR2;j++){&lt;br /&gt;
			if (!strcmp(dir1[i],dir2[j]))&lt;br /&gt;
				found=1;&lt;br /&gt;
			 }&lt;br /&gt;
			if (found!=1) &lt;br /&gt;
				printf(&amp;quot;%s presente solo nella directory 1\n&amp;quot;,dir1[i]);&lt;br /&gt;
			found=0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	found=0;&lt;br /&gt;
	&lt;br /&gt;
	for (i=0;i&amp;lt;N_DIR2;i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(j=0;j&amp;lt;N_DIR1;j++){&lt;br /&gt;
			if (!strcmp(dir2[i],dir1[j]))&lt;br /&gt;
				found=1;&lt;br /&gt;
			}&lt;br /&gt;
			if (found!=1)&lt;br /&gt;
				printf(&amp;quot;%s presente solo nella directory 2\n&amp;quot;,dir2[i]);&lt;br /&gt;
			found=0;&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
int main (int argc,char*argv[])&lt;br /&gt;
{&lt;br /&gt;
	int ris,i=0;&lt;br /&gt;
	char c;&lt;br /&gt;
	char*tmp;&lt;br /&gt;
	struct stat prova;&lt;br /&gt;
	char**filedir1=NULL,**filedir2=NULL;&lt;br /&gt;
	DIR *dp,*dp2; &lt;br /&gt;
	struct dirent *ep;    &lt;br /&gt;
	if (argc!=3)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Usage: ./cmpsource.out DIR1 DIR2\n&amp;quot;);&lt;br /&gt;
		return(1);&lt;br /&gt;
	} &lt;br /&gt;
	/*APERTURA DIRECTORY 1*/&lt;br /&gt;
	dp = opendir (argv[1]);&lt;br /&gt;
	if (dp != NULL)&lt;br /&gt;
	{&lt;br /&gt;
		while ((ep = readdir (dp))) /*Leggo i file nella directory*/&lt;br /&gt;
    	{&lt;br /&gt;
    		ris=lstat(ep-&amp;gt;d_name,&amp;amp;prova); /*Recupero le informazioni sul file*/&lt;br /&gt;
    		if (S_ISREG(prova.st_mode)) /*file regolare*/&lt;br /&gt;
    		{ &lt;br /&gt;
    		/*IL FILE E' UN ESEGUIBILE REGOLARE*/&lt;br /&gt;
    			if (source(ep-&amp;gt;d_name)){ /*IL FILE E' UN SORGENTE (.c/.h)*/&lt;br /&gt;
    			N_DIR1++;&lt;br /&gt;
    			filedir1=(char**)realloc(filedir1,N_DIR1*sizeof(char*));&lt;br /&gt;
    			filedir1[N_DIR1-1]=ep-&amp;gt;d_name;&lt;br /&gt;
    			}&lt;br /&gt;
    		}&lt;br /&gt;
		}&lt;br /&gt;
		closedir (dp); /*ORA IN filedir1[] CI SONO TUTTI I FILE SORGENTE DELLA DIRECTORY 1*/&lt;br /&gt;
	}&lt;br /&gt;
	/*FINE LETTURA DIRECTORY 1*/&lt;br /&gt;
	/*APERTURA DIRECTORY 2*/&lt;br /&gt;
	dp2 = opendir (argv[2]);&lt;br /&gt;
	if (dp2 != NULL)&lt;br /&gt;
	{&lt;br /&gt;
		while ((ep = readdir (dp2))) /*Leggo i file nella directory*/&lt;br /&gt;
    	{&lt;br /&gt;
    		ris=lstat(ep-&amp;gt;d_name,&amp;amp;prova); /*Recupero le informazioni sul file*/&lt;br /&gt;
    		if (S_ISREG(prova.st_mode)) /*file regolare*/&lt;br /&gt;
    		{ &lt;br /&gt;
    		/*IL FILE E' UN ESEGUIBILE REGOLARE*/&lt;br /&gt;
    			if (source(ep-&amp;gt;d_name)){ /*IL FILE E' UN SORGENTE (.c/.h)*/&lt;br /&gt;
    			N_DIR2++;&lt;br /&gt;
    			filedir2=(char**)realloc(filedir2,N_DIR2*sizeof(char*));&lt;br /&gt;
    			filedir2[N_DIR2-1]=ep-&amp;gt;d_name;&lt;br /&gt;
    			}&lt;br /&gt;
    		}&lt;br /&gt;
		}&lt;br /&gt;
		closedir (dp); /*ORA IN filedir1[] CI SONO TUTTI I FILE SORGENTE DELLA DIRECTORY 1*/&lt;br /&gt;
	}&lt;br /&gt;
	/*FINE LETTURA DIRECTORY 2*/&lt;br /&gt;
	print_diff(filedir1,filedir2);&lt;br /&gt;
  	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int lastchar(char *name){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		while(name[i]!='\0')&lt;br /&gt;
			i++;&lt;br /&gt;
		return(i-1);&lt;br /&gt;
	}//restituisce l'indice dell'ultimo carattere della stringa&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	char dir1[1024];&lt;br /&gt;
	char dir2[1024];&lt;br /&gt;
	int n1, n2;&lt;br /&gt;
	struct dirent **namelist1;&lt;br /&gt;
	struct dirent **namelist2;&lt;br /&gt;
	struct stat buf1;&lt;br /&gt;
	struct stat buf2;&lt;br /&gt;
	int lc;&lt;br /&gt;
	&lt;br /&gt;
	if(argc==3){ /*se vengono passate in input due directory va bene*/&lt;br /&gt;
		strcpy(dir1,argv[1]);&lt;br /&gt;
		strcpy(dir2,argv[2]);&lt;br /&gt;
		n1 = scandir(dir1, &amp;amp;namelist1, NULL, 0);&lt;br /&gt;
		n2 = scandir(dir2, &amp;amp;namelist2, NULL, 0);&lt;br /&gt;
		if(n1&amp;lt;0 || n2&amp;lt;0)&lt;br /&gt;
			perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
		else {&lt;br /&gt;
			int index[n1];&lt;br /&gt;
			int i=0;&lt;br /&gt;
			int j=0; //delimitatore&lt;br /&gt;
			while(n1--){&lt;br /&gt;
				stat(namelist1[n1]-&amp;gt;d_name,&amp;amp;buf1);&lt;br /&gt;
				lc = lastchar(namelist1[n1]-&amp;gt;d_name);&lt;br /&gt;
				if((namelist1[n1]-&amp;gt;d_name[lc]=='c' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist1[n1]-&amp;gt;d_name[lc-1]=='.') ||&lt;br /&gt;
					(namelist1[n1]-&amp;gt;d_name[lc]=='h' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist1[n1]-&amp;gt;d_name[lc-1]=='.')){	&lt;br /&gt;
						index[i]=n1;&lt;br /&gt;
						i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			j=i;&lt;br /&gt;
			int bool=0;&lt;br /&gt;
			while(n2--){&lt;br /&gt;
				stat(namelist2[n2]-&amp;gt;d_name,&amp;amp;buf2);&lt;br /&gt;
				lc = lastchar(namelist2[n2]-&amp;gt;d_name);&lt;br /&gt;
				if((namelist2[n2]-&amp;gt;d_name[lc]=='c' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist2[n2]-&amp;gt;d_name[lc-1]=='.') ||&lt;br /&gt;
					(namelist2[n2]-&amp;gt;d_name[lc]=='h' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist2[n2]-&amp;gt;d_name[lc-1]=='.')){	&lt;br /&gt;
						for(i=0; i&amp;lt;j; i++){&lt;br /&gt;
							if(strcmp(namelist2[n2]-&amp;gt;d_name, namelist1[index[i]]-&amp;gt;d_name)==0){ //sono uguali&lt;br /&gt;
								bool=1;&lt;br /&gt;
								index[i]=-1;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
						if(bool==0)&lt;br /&gt;
							printf(&amp;quot;%s not in %s\n&amp;quot;,namelist2[n2]-&amp;gt;d_name,dir1);&lt;br /&gt;
				}&lt;br /&gt;
			bool=0;&lt;br /&gt;
			}&lt;br /&gt;
			printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
			for(i=0; i&amp;lt;j; i++){&lt;br /&gt;
				if(index[i]&amp;gt;=0)&lt;br /&gt;
					printf(&amp;quot;%s not in %s\n&amp;quot;,namelist1[index[i]]-&amp;gt;d_name,dir2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else /*altrimenti errore, vogliamo in input 2 directory*/&lt;br /&gt;
			printf(&amp;quot;errore\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2011.09.12&amp;diff=617</id>
		<title>ProvaPratica 2011.09.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2011.09.12&amp;diff=617"/>
		<updated>2014-04-29T13:58:25Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2011-09-12.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int N_DIR1=0,N_DIR2=0;&lt;br /&gt;
&lt;br /&gt;
int source(char*s)&lt;br /&gt;
{&lt;br /&gt;
	int x=strlen(s);&lt;br /&gt;
	if (x&amp;gt;=3)&lt;br /&gt;
	{&lt;br /&gt;
		if ((s[x-1]=='c') || (s[x-1]=='h'))&lt;br /&gt;
		{&lt;br /&gt;
			if (s[x-2]=='.') return 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
void print_diff(char**dir1,char**dir2)&lt;br /&gt;
{&lt;br /&gt;
	int i,j,found=0;&lt;br /&gt;
	for (i=0;i&amp;lt;N_DIR1;i++){&lt;br /&gt;
		for(j=0;j&amp;lt;N_DIR2;j++){&lt;br /&gt;
			if (!strcmp(dir1[i],dir2[j]))&lt;br /&gt;
				found=1;&lt;br /&gt;
			 }&lt;br /&gt;
			if (found!=1) &lt;br /&gt;
				printf(&amp;quot;%s presente solo nella directory 1\n&amp;quot;,dir1[i]);&lt;br /&gt;
			found=0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	found=0;&lt;br /&gt;
	&lt;br /&gt;
	for (i=0;i&amp;lt;N_DIR2;i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(j=0;j&amp;lt;N_DIR1;j++){&lt;br /&gt;
			if (!strcmp(dir2[i],dir1[j]))&lt;br /&gt;
				found=1;&lt;br /&gt;
			}&lt;br /&gt;
			if (found!=1)&lt;br /&gt;
				printf(&amp;quot;%s presente solo nella directory 2\n&amp;quot;,dir2[i]);&lt;br /&gt;
			found=0;&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
int main (int argc,char*argv[])&lt;br /&gt;
{&lt;br /&gt;
	int ris,i=0;&lt;br /&gt;
	char c;&lt;br /&gt;
	char*tmp;&lt;br /&gt;
	struct stat prova;&lt;br /&gt;
	char**filedir1=NULL,**filedir2=NULL;&lt;br /&gt;
	DIR *dp,*dp2; &lt;br /&gt;
	struct dirent *ep;    &lt;br /&gt;
	if (argc!=3)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Usage: ./cmpsource.out DIR1 DIR2\n&amp;quot;);&lt;br /&gt;
		return(1);&lt;br /&gt;
	} &lt;br /&gt;
	/*APERTURA DIRECTORY 1*/&lt;br /&gt;
	dp = opendir (argv[1]);&lt;br /&gt;
	if (dp != NULL)&lt;br /&gt;
	{&lt;br /&gt;
		while ((ep = readdir (dp))) /*Leggo i file nella directory*/&lt;br /&gt;
    	{&lt;br /&gt;
    		ris=lstat(ep-&amp;gt;d_name,&amp;amp;prova); /*Recupero le informazioni sul file*/&lt;br /&gt;
    		if (S_ISREG(prova.st_mode)) /*file regolare*/&lt;br /&gt;
    		{ &lt;br /&gt;
    		/*IL FILE E' UN ESEGUIBILE REGOLARE*/&lt;br /&gt;
    			if (source(ep-&amp;gt;d_name)){ /*IL FILE E' UN SORGENTE (.c/.h)*/&lt;br /&gt;
    			N_DIR1++;&lt;br /&gt;
    			filedir1=(char**)realloc(filedir1,N_DIR1*sizeof(char*));&lt;br /&gt;
    			filedir1[N_DIR1-1]=ep-&amp;gt;d_name;&lt;br /&gt;
    			}&lt;br /&gt;
    		}&lt;br /&gt;
		}&lt;br /&gt;
		closedir (dp); /*ORA IN filedir1[] CI SONO TUTTI I FILE SORGENTE DELLA DIRECTORY 1*/&lt;br /&gt;
	}&lt;br /&gt;
	/*FINE LETTURA DIRECTORY 1*/&lt;br /&gt;
	/*APERTURA DIRECTORY 2*/&lt;br /&gt;
	dp2 = opendir (argv[2]);&lt;br /&gt;
	if (dp2 != NULL)&lt;br /&gt;
	{&lt;br /&gt;
		while ((ep = readdir (dp2))) /*Leggo i file nella directory*/&lt;br /&gt;
    	{&lt;br /&gt;
    		ris=lstat(ep-&amp;gt;d_name,&amp;amp;prova); /*Recupero le informazioni sul file*/&lt;br /&gt;
    		if (S_ISREG(prova.st_mode)) /*file regolare*/&lt;br /&gt;
    		{ &lt;br /&gt;
    		/*IL FILE E' UN ESEGUIBILE REGOLARE*/&lt;br /&gt;
    			if (source(ep-&amp;gt;d_name)){ /*IL FILE E' UN SORGENTE (.c/.h)*/&lt;br /&gt;
    			N_DIR2++;&lt;br /&gt;
    			filedir2=(char**)realloc(filedir2,N_DIR2*sizeof(char*));&lt;br /&gt;
    			filedir2[N_DIR2-1]=ep-&amp;gt;d_name;&lt;br /&gt;
    			}&lt;br /&gt;
    		}&lt;br /&gt;
		}&lt;br /&gt;
		closedir (dp); /*ORA IN filedir1[] CI SONO TUTTI I FILE SORGENTE DELLA DIRECTORY 1*/&lt;br /&gt;
	}&lt;br /&gt;
	/*FINE LETTURA DIRECTORY 2*/&lt;br /&gt;
	print_diff(filedir1,filedir2);&lt;br /&gt;
  	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int lastchar(char *name){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		while(name[i]!='\0')&lt;br /&gt;
			i++;&lt;br /&gt;
		return(i-1);&lt;br /&gt;
	}//restituisce l'indice dell'ultimo carattere della stringa&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	char dir1[1024];&lt;br /&gt;
	char dir2[1024];&lt;br /&gt;
	int n1, n2;&lt;br /&gt;
	struct dirent **namelist1;&lt;br /&gt;
	struct dirent **namelist2;&lt;br /&gt;
	struct stat buf1;&lt;br /&gt;
	struct stat buf2;&lt;br /&gt;
	int lc;&lt;br /&gt;
	&lt;br /&gt;
	if(argc==3){ /*se vengono passate in input due directory va bene*/&lt;br /&gt;
		strcpy(dir1,argv[1]);&lt;br /&gt;
		strcpy(dir2,argv[2]);&lt;br /&gt;
		n1 = scandir(dir1, &amp;amp;namelist1, NULL, 0);&lt;br /&gt;
		n2 = scandir(dir2, &amp;amp;namelist2, NULL, 0);&lt;br /&gt;
		if(n1&amp;lt;0 || n2&amp;lt;0)&lt;br /&gt;
			perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
		else {&lt;br /&gt;
			int index[n1];&lt;br /&gt;
			int i=0;&lt;br /&gt;
			int j=0; //delimitatore&lt;br /&gt;
			while(n1--){&lt;br /&gt;
				stat(namelist1[n1]-&amp;gt;d_name,&amp;amp;buf1);&lt;br /&gt;
				lc = lastchar(namelist1[n1]-&amp;gt;d_name);&lt;br /&gt;
				if((namelist1[n1]-&amp;gt;d_name[lc]=='c' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist1[n1]-&amp;gt;d_name[lc-1]=='.') ||&lt;br /&gt;
					(namelist1[n1]-&amp;gt;d_name[lc]=='h' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist1[n1]-&amp;gt;d_name[lc-1]=='.')){	&lt;br /&gt;
						index[i]=n1;&lt;br /&gt;
						i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			j=i;&lt;br /&gt;
			int bool=0;&lt;br /&gt;
			while(n2--){&lt;br /&gt;
				stat(namelist2[n2]-&amp;gt;d_name,&amp;amp;buf2);&lt;br /&gt;
				lc = lastchar(namelist2[n2]-&amp;gt;d_name);&lt;br /&gt;
				if((namelist2[n2]-&amp;gt;d_name[lc]=='c' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist2[n2]-&amp;gt;d_name[lc-1]=='.') ||&lt;br /&gt;
					(namelist2[n2]-&amp;gt;d_name[lc]=='h' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist2[n2]-&amp;gt;d_name[lc-1]=='.')){	&lt;br /&gt;
						for(i=0; i&amp;lt;j; i++){&lt;br /&gt;
							if(strcmp(namelist2[n2]-&amp;gt;d_name, namelist1[index[i]]-&amp;gt;d_name)==0){ //sono uguali&lt;br /&gt;
								bool=1;&lt;br /&gt;
								index[i]=-1;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
						if(bool==0)&lt;br /&gt;
							printf(&amp;quot;%s not in %s\n&amp;quot;,namelist2[n2]-&amp;gt;d_name,dir1);&lt;br /&gt;
				}&lt;br /&gt;
			bool=0;&lt;br /&gt;
			}&lt;br /&gt;
			printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
			for(i=0; i&amp;lt;j; i++){&lt;br /&gt;
				if(index[i]&amp;gt;=0)&lt;br /&gt;
					printf(&amp;quot;%s not in %s\n&amp;quot;,namelist1[index[i]]-&amp;gt;d_name,dir2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else /*altrimenti errore, vogliamo in input 2 directory*/&lt;br /&gt;
			printf(&amp;quot;errore\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=565</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=565"/>
		<updated>2014-04-09T10:25:11Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;br /&gt;
&lt;br /&gt;
b2) con x = 7 e la sequenza: 2 - 1 si è in uno stato SAFE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Giulia N.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=564</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=564"/>
		<updated>2014-04-09T10:24:51Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;br /&gt;
&lt;br /&gt;
b2) con x = 7 e la sequenza: 2 - 1 si è in uno stato SAFE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Giulia N.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=563</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=563"/>
		<updated>2014-04-07T10:44:34Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;br /&gt;
&lt;br /&gt;
b2) con x = 7 e la sequenza: 2 - 1 si è in uno stato SAFE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Giulia N.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=562</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=562"/>
		<updated>2014-04-07T10:23:30Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Giulia N.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=561</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=561"/>
		<updated>2014-04-07T10:23:13Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Giulia&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=560</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=560"/>
		<updated>2014-04-07T10:21:55Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=559</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=559"/>
		<updated>2014-04-07T09:56:40Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=558</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=558"/>
		<updated>2014-04-07T09:56:29Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=557</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=557"/>
		<updated>2014-04-07T09:31:27Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=556</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=556"/>
		<updated>2014-04-07T09:31:17Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=555</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=555"/>
		<updated>2014-04-07T09:30:34Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
[[File:So1.png]]&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=File:So1.png&amp;diff=554</id>
		<title>File:So1.png</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=File:So1.png&amp;diff=554"/>
		<updated>2014-04-07T09:30:17Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Help:Editing&amp;diff=553</id>
		<title>Help:Editing</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Help:Editing&amp;diff=553"/>
		<updated>2014-04-07T09:29:54Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Help:Editing&amp;diff=552</id>
		<title>Help:Editing</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Help:Editing&amp;diff=552"/>
		<updated>2014-04-07T09:29:41Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: Created page with &amp;quot;heeeeeeeeeeeeeeeeeeeelp&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;heeeeeeeeeeeeeeeeeeeelp&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=551</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=551"/>
		<updated>2014-04-07T09:05:07Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=540</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=540"/>
		<updated>2014-04-01T15:40:10Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[9];&lt;br /&gt;
int waiting[9]=0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
int i;&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
	if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=0;&lt;br /&gt;
			}&lt;br /&gt;
		}		&lt;br /&gt;
	run[maxprio].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=532</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=532"/>
		<updated>2014-04-01T09:54:06Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Esercizi a caso del Prof.]]&lt;br /&gt;
&lt;br /&gt;
[[Decalogo di Programmazione Concorrente]]&lt;br /&gt;
&lt;br /&gt;
[[Python Programma tieni punteggio.]]&lt;br /&gt;
&lt;br /&gt;
[[Comandi visti alle lezioni.]]&lt;br /&gt;
&lt;br /&gt;
[[SYS CALL viste a lezione.]]&lt;br /&gt;
&lt;br /&gt;
[[Parametri con getopt().]]&lt;br /&gt;
&lt;br /&gt;
[[Funzione con numero variabile di parametri.]]&lt;br /&gt;
&lt;br /&gt;
[[stampf - implementazione ridotta della printf.]]&lt;br /&gt;
&lt;br /&gt;
[[Producer&amp;amp;Consumer MP.]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2014.01.23]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.09.13]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.07.18]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.06.21]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.05.29]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.02.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.01.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2005.02.10]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeoria_2011.07.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.02.09]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.05.24]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.06.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.09.18]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2013.02.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2011.02.11]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2013.07.19]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2013.01.24]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2014.01.22]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2012.07.16]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica_2010.07.12]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=524</id>
		<title>ProvaTeorica 2012.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=524"/>
		<updated>2014-03-29T12:38:34Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: /* Esercizio c.2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio C.1&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
//restituisce 1 se c'e piu del 75% blue o 75% di red&lt;br /&gt;
//restituisce 0 se non c'e una maggiornza&lt;br /&gt;
int media(color){&lt;br /&gt;
	int mediared;&lt;br /&gt;
	int localinto =  into;&lt;br /&gt;
	if (color != NULL){&lt;br /&gt;
		localinto[color]++;&lt;br /&gt;
	}&lt;br /&gt;
	mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));&lt;br /&gt;
	if(mediared &amp;gt;=75 || mediared &amp;lt; 25){&lt;br /&gt;
		return 1;//75% di rossi o di blue&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;// non c'e maggioranza		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
&lt;br /&gt;
	conditon oktoenter[2];&lt;br /&gt;
	int into[2];&lt;br /&gt;
&lt;br /&gt;
	enter(color){&lt;br /&gt;
		if(media(color) != 1){// attendo perche' non c'e una maggioranza&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		}&lt;br /&gt;
		into[color]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(color){&lt;br /&gt;
		into[color]--;&lt;br /&gt;
		if(media(1-color) == 1){&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
		}else if(media(color) == 1){&lt;br /&gt;
			oktoenter[color].signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ROSSO 0&lt;br /&gt;
#define BLU 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol {&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	condition oktoexit&lt;br /&gt;
	int running[2] // numero di processi rossi [0] e blu [1] in esecuzione&lt;br /&gt;
	queue waiting /* coda delle coppie (colore,azione) dei processi in attesa di entrare (azione==1)&lt;br /&gt;
			 o uscire (azione==-1) */&lt;br /&gt;
	&lt;br /&gt;
	/* restituisce true se aggiungendo o rimuovendo (in base a i) un processo del colore passato&lt;br /&gt;
	viene rispettato il 75% dei processi di un colore */&lt;br /&gt;
	bool morethan75p(colore, int i) { &lt;br /&gt;
		return (running[colore]+i&amp;gt;=running[1-colore]*3 || (running[colore]+i)*3&amp;lt;=running[1-colore])&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// risveglia un processo del colore passato se è possibile farlo&lt;br /&gt;
	void checkwakeup() {&lt;br /&gt;
		if (waiting.empty() == false) {&lt;br /&gt;
			colore,azione = waiting.head() // head resituisce l'elemento in testa senza rimuoverlo&lt;br /&gt;
			if (morethan75p(colore,azione)) {&lt;br /&gt;
				waiting.dequeue()&lt;br /&gt;
				if (azione == 1)&lt;br /&gt;
					oktoenter.signal()&lt;br /&gt;
				else&lt;br /&gt;
					oktoexit.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry enter(colore) {&lt;br /&gt;
		if (morethan75p(colore,1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,1)&lt;br /&gt;
			oktoenter.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]++&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry exit(colore) {&lt;br /&gt;
		if (morethan75p(colore,-1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,-1)&lt;br /&gt;
			oktoexit.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]--&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daniele Cortesi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLUE 1&lt;br /&gt;
int majorcolor = -1&lt;br /&gt;
int numproc[2] = 0,0&lt;br /&gt;
cond oktoenter[2]  //bastavano due condizioni.&lt;br /&gt;
cond oktoexit[2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
	procedure entry enter(COL){&lt;br /&gt;
		if(COL == majorcolor){&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			if((proc[majorcolor]*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;lt; 75)&lt;br /&gt;
				oktoenter[COL].wait()&lt;br /&gt;
			if(majorcolor == -1)&lt;br /&gt;
				majorcolor == COL&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			majorcolor = COL&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(COL){&lt;br /&gt;
		if(numproc[COL] + numproc[1-COL] == 1){&lt;br /&gt;
			majorcolor = -1&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == majorcolor){&lt;br /&gt;
			if(((proc[majorcolor] - 1)*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;lt; 75){&lt;br /&gt;
				oktoexit[COL].wait()&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoexit[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLU 1&lt;br /&gt;
&lt;br /&gt;
limcol{&lt;br /&gt;
	/*variable*/&lt;br /&gt;
	int array[2] = 0,0;&lt;br /&gt;
	color major = -1;&lt;br /&gt;
	/*condition*/&lt;br /&gt;
	condition oktoenter[2];&lt;br /&gt;
	condition oktoleave[2];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter( color ){&lt;br /&gt;
		if ( majorcolor == -1 ) &lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( majorcolor == (1-color) &amp;amp;&amp;amp; newmajorcolor%(color) &amp;lt; 75% )&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		array[color]++; &lt;br /&gt;
		if ( majorcolor == -1 )            //se un processo si risveglia nel monitor vuoto deve impostare majorcolor&lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( newmajorcolor%(1-color) &amp;gt;= 75% )         &lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit( color ){&lt;br /&gt;
		if ( majorcolor == color &amp;amp;&amp;amp; majorcolor_less1%(color) &amp;gt; 75% )&lt;br /&gt;
			oktoleave[color].wait();&lt;br /&gt;
		array[color]--;&lt;br /&gt;
		if ( !colorsempty() )&lt;br /&gt;
			if ( majorcolor_less1%(color) &amp;gt;= 75% )&lt;br /&gt;
				oktoleave[1-color].signal();&lt;br /&gt;
		else{&lt;br /&gt;
			majorcolor == -1;&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
				}&lt;br /&gt;
					}	 &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
newmajorcolor%(color) calcola la nuova % del colore maggiore aggiungendo color&lt;br /&gt;
majorcolor_less1%(color) calcola la nuova % del colore maggiore togliendo color&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pir@t@&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#DEFINE BLUE 0&lt;br /&gt;
#DEFINE RED 1&lt;br /&gt;
monitor limcol{&lt;br /&gt;
condition ok;&lt;br /&gt;
int numcolor[2];&lt;br /&gt;
Queue q;&lt;br /&gt;
int i=1;&lt;br /&gt;
procedure entry enter(color){&lt;br /&gt;
if((numcolor[color] + 1 &amp;lt; float((tot+1)*(75/100))  &amp;amp;&amp;amp;&lt;br /&gt;
   numcolor[color] + 1 &amp;gt;= float((tot+1)*(25/100))) ||&lt;br /&gt;
   !q.empty() ) &lt;br /&gt;
	{&lt;br /&gt;
	q.enqueue(color);&lt;br /&gt;
	ok.wait();&lt;br /&gt;
	i++;&lt;br /&gt;
	if(!q.empty()){&lt;br /&gt;
          if(numcolor[q.head()] + i &amp;gt;= float((tot+i)*(75/100)) ||&lt;br /&gt;
	   numcolor[q.head()] + i &amp;lt; float((tot+i)*(25/100)))  )&lt;br /&gt;
	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
	i=1;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
numcolor[color]++;&lt;br /&gt;
tot++;&lt;br /&gt;
}&lt;br /&gt;
procedure entry exit(color){&lt;br /&gt;
numcolor[color]--;&lt;br /&gt;
tot--;&lt;br /&gt;
if( numcolor[q.head()] + 1 &amp;gt;= float((tot+1)*(75/100))  ||&lt;br /&gt;
    numcolor[q.head()] + 1 &amp;lt; float((tot+1)*(25/100)) )&lt;br /&gt;
  	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.2==&lt;br /&gt;
Per quali indici n le funzioni foo possono essere utilizzate al posto della test&amp;amp;set?&lt;br /&gt;
&lt;br /&gt;
Risposta: per n = 5&lt;br /&gt;
&lt;br /&gt;
Nella Test&amp;amp;Set x prende il valore di y, quindi y deve essere = booln(x,y)&lt;br /&gt;
Andiamo a vedere per quali valori y è uguale a booln(x,y)&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! x || y || bool0 || bool1 || bool2 || bool3 || bool4 || bool5 || bool6 || bool7 || bool8 || bool9 || bool10 || bool11 || bool12 || bool13 || bool14 || bool15&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''0''' || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In bold sono indicati i valori per cui y = booln(x,y)&lt;br /&gt;
L'unico caso in cui i valori sono evidenziati in ogni riga è per bool5.&lt;br /&gt;
&lt;br /&gt;
Giulia (non sono molto sicura della soluzione, ma questo è il ragionamento che mi è sembrato più corretto)&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Reference String&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 4 || 5 || 6 || 3 || 2 || 1 || 3 || 2 || 1 || 6 || 5 || 4 || 6 || 5 || 4 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 1&lt;br /&gt;
| 1 || 1 || 1 || 4 || 4 || 4 ||   ||   ||   || 3 || 3 || 3 ||   ||   ||   || 6 || 6 || 6 ||   ||   ||   || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 2&lt;br /&gt;
|   || 2 || 2 || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2 ||   ||   ||   || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 3&lt;br /&gt;
|   ||   || 3 || 3 || 3 || 6 ||   ||   ||   || 6 || 6 || 1 ||   ||   ||   || 1 || 1 || 4 ||   ||   ||   || 4 || 4 || 3&lt;br /&gt;
|}&lt;br /&gt;
                        &lt;br /&gt;
The above Reference String is both FIFO, LRU and MIN compliant.&lt;br /&gt;
&lt;br /&gt;
-TomOgn&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=523</id>
		<title>ProvaTeorica 2012.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=523"/>
		<updated>2014-03-29T12:37:29Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio C.1&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
//restituisce 1 se c'e piu del 75% blue o 75% di red&lt;br /&gt;
//restituisce 0 se non c'e una maggiornza&lt;br /&gt;
int media(color){&lt;br /&gt;
	int mediared;&lt;br /&gt;
	int localinto =  into;&lt;br /&gt;
	if (color != NULL){&lt;br /&gt;
		localinto[color]++;&lt;br /&gt;
	}&lt;br /&gt;
	mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));&lt;br /&gt;
	if(mediared &amp;gt;=75 || mediared &amp;lt; 25){&lt;br /&gt;
		return 1;//75% di rossi o di blue&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;// non c'e maggioranza		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
&lt;br /&gt;
	conditon oktoenter[2];&lt;br /&gt;
	int into[2];&lt;br /&gt;
&lt;br /&gt;
	enter(color){&lt;br /&gt;
		if(media(color) != 1){// attendo perche' non c'e una maggioranza&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		}&lt;br /&gt;
		into[color]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(color){&lt;br /&gt;
		into[color]--;&lt;br /&gt;
		if(media(1-color) == 1){&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
		}else if(media(color) == 1){&lt;br /&gt;
			oktoenter[color].signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ROSSO 0&lt;br /&gt;
#define BLU 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol {&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	condition oktoexit&lt;br /&gt;
	int running[2] // numero di processi rossi [0] e blu [1] in esecuzione&lt;br /&gt;
	queue waiting /* coda delle coppie (colore,azione) dei processi in attesa di entrare (azione==1)&lt;br /&gt;
			 o uscire (azione==-1) */&lt;br /&gt;
	&lt;br /&gt;
	/* restituisce true se aggiungendo o rimuovendo (in base a i) un processo del colore passato&lt;br /&gt;
	viene rispettato il 75% dei processi di un colore */&lt;br /&gt;
	bool morethan75p(colore, int i) { &lt;br /&gt;
		return (running[colore]+i&amp;gt;=running[1-colore]*3 || (running[colore]+i)*3&amp;lt;=running[1-colore])&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// risveglia un processo del colore passato se è possibile farlo&lt;br /&gt;
	void checkwakeup() {&lt;br /&gt;
		if (waiting.empty() == false) {&lt;br /&gt;
			colore,azione = waiting.head() // head resituisce l'elemento in testa senza rimuoverlo&lt;br /&gt;
			if (morethan75p(colore,azione)) {&lt;br /&gt;
				waiting.dequeue()&lt;br /&gt;
				if (azione == 1)&lt;br /&gt;
					oktoenter.signal()&lt;br /&gt;
				else&lt;br /&gt;
					oktoexit.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry enter(colore) {&lt;br /&gt;
		if (morethan75p(colore,1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,1)&lt;br /&gt;
			oktoenter.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]++&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry exit(colore) {&lt;br /&gt;
		if (morethan75p(colore,-1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,-1)&lt;br /&gt;
			oktoexit.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]--&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daniele Cortesi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLUE 1&lt;br /&gt;
int majorcolor = -1&lt;br /&gt;
int numproc[2] = 0,0&lt;br /&gt;
cond oktoenter[2]  //bastavano due condizioni.&lt;br /&gt;
cond oktoexit[2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
	procedure entry enter(COL){&lt;br /&gt;
		if(COL == majorcolor){&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			if((proc[majorcolor]*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;lt; 75)&lt;br /&gt;
				oktoenter[COL].wait()&lt;br /&gt;
			if(majorcolor == -1)&lt;br /&gt;
				majorcolor == COL&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			majorcolor = COL&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(COL){&lt;br /&gt;
		if(numproc[COL] + numproc[1-COL] == 1){&lt;br /&gt;
			majorcolor = -1&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == majorcolor){&lt;br /&gt;
			if(((proc[majorcolor] - 1)*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;lt; 75){&lt;br /&gt;
				oktoexit[COL].wait()&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoexit[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLU 1&lt;br /&gt;
&lt;br /&gt;
limcol{&lt;br /&gt;
	/*variable*/&lt;br /&gt;
	int array[2] = 0,0;&lt;br /&gt;
	color major = -1;&lt;br /&gt;
	/*condition*/&lt;br /&gt;
	condition oktoenter[2];&lt;br /&gt;
	condition oktoleave[2];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter( color ){&lt;br /&gt;
		if ( majorcolor == -1 ) &lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( majorcolor == (1-color) &amp;amp;&amp;amp; newmajorcolor%(color) &amp;lt; 75% )&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		array[color]++; &lt;br /&gt;
		if ( majorcolor == -1 )            //se un processo si risveglia nel monitor vuoto deve impostare majorcolor&lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( newmajorcolor%(1-color) &amp;gt;= 75% )         &lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit( color ){&lt;br /&gt;
		if ( majorcolor == color &amp;amp;&amp;amp; majorcolor_less1%(color) &amp;gt; 75% )&lt;br /&gt;
			oktoleave[color].wait();&lt;br /&gt;
		array[color]--;&lt;br /&gt;
		if ( !colorsempty() )&lt;br /&gt;
			if ( majorcolor_less1%(color) &amp;gt;= 75% )&lt;br /&gt;
				oktoleave[1-color].signal();&lt;br /&gt;
		else{&lt;br /&gt;
			majorcolor == -1;&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
				}&lt;br /&gt;
					}	 &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
newmajorcolor%(color) calcola la nuova % del colore maggiore aggiungendo color&lt;br /&gt;
majorcolor_less1%(color) calcola la nuova % del colore maggiore togliendo color&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pir@t@&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#DEFINE BLUE 0&lt;br /&gt;
#DEFINE RED 1&lt;br /&gt;
monitor limcol{&lt;br /&gt;
condition ok;&lt;br /&gt;
int numcolor[2];&lt;br /&gt;
Queue q;&lt;br /&gt;
int i=1;&lt;br /&gt;
procedure entry enter(color){&lt;br /&gt;
if((numcolor[color] + 1 &amp;lt; float((tot+1)*(75/100))  &amp;amp;&amp;amp;&lt;br /&gt;
   numcolor[color] + 1 &amp;gt;= float((tot+1)*(25/100))) ||&lt;br /&gt;
   !q.empty() ) &lt;br /&gt;
	{&lt;br /&gt;
	q.enqueue(color);&lt;br /&gt;
	ok.wait();&lt;br /&gt;
	i++;&lt;br /&gt;
	if(!q.empty()){&lt;br /&gt;
          if(numcolor[q.head()] + i &amp;gt;= float((tot+i)*(75/100)) ||&lt;br /&gt;
	   numcolor[q.head()] + i &amp;lt; float((tot+i)*(25/100)))  )&lt;br /&gt;
	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
	i=1;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
numcolor[color]++;&lt;br /&gt;
tot++;&lt;br /&gt;
}&lt;br /&gt;
procedure entry exit(color){&lt;br /&gt;
numcolor[color]--;&lt;br /&gt;
tot--;&lt;br /&gt;
if( numcolor[q.head()] + 1 &amp;gt;= float((tot+1)*(75/100))  ||&lt;br /&gt;
    numcolor[q.head()] + 1 &amp;lt; float((tot+1)*(25/100)) )&lt;br /&gt;
  	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.2==&lt;br /&gt;
Per quali indici n le funzioni foo possono essere utilizzate al posto della test&amp;amp;set?&lt;br /&gt;
Risposta: per n = 5&lt;br /&gt;
x prende il fatto il valore di y, quindi y deve essere = booln(x,y)&lt;br /&gt;
Andiamo a vedere per quali valori y è uguale a booln(x,y)&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! x || y || bool0 || bool1 || bool2 || bool3 || bool4 || bool5 || bool6 || bool7 || bool8 || bool9 || bool10 || bool11 || bool12 || bool13 || bool14 || bool15&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''0''' || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In bold sono indicati i valori per cui y = booln(x,y)&lt;br /&gt;
L'unico caso in cui i valori sono evidenziati in ogni riga è per bool5.&lt;br /&gt;
&lt;br /&gt;
Giulia (non sono molto sicura della soluzione, ma questo è il ragionamento che mi è sembrato più corretto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Reference String&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 4 || 5 || 6 || 3 || 2 || 1 || 3 || 2 || 1 || 6 || 5 || 4 || 6 || 5 || 4 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 1&lt;br /&gt;
| 1 || 1 || 1 || 4 || 4 || 4 ||   ||   ||   || 3 || 3 || 3 ||   ||   ||   || 6 || 6 || 6 ||   ||   ||   || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 2&lt;br /&gt;
|   || 2 || 2 || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2 ||   ||   ||   || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 3&lt;br /&gt;
|   ||   || 3 || 3 || 3 || 6 ||   ||   ||   || 6 || 6 || 1 ||   ||   ||   || 1 || 1 || 4 ||   ||   ||   || 4 || 4 || 3&lt;br /&gt;
|}&lt;br /&gt;
                        &lt;br /&gt;
The above Reference String is both FIFO, LRU and MIN compliant.&lt;br /&gt;
&lt;br /&gt;
-TomOgn&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=522</id>
		<title>ProvaTeorica 2012.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=522"/>
		<updated>2014-03-29T12:36:25Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio C.1&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
//restituisce 1 se c'e piu del 75% blue o 75% di red&lt;br /&gt;
//restituisce 0 se non c'e una maggiornza&lt;br /&gt;
int media(color){&lt;br /&gt;
	int mediared;&lt;br /&gt;
	int localinto =  into;&lt;br /&gt;
	if (color != NULL){&lt;br /&gt;
		localinto[color]++;&lt;br /&gt;
	}&lt;br /&gt;
	mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));&lt;br /&gt;
	if(mediared &amp;gt;=75 || mediared &amp;lt; 25){&lt;br /&gt;
		return 1;//75% di rossi o di blue&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;// non c'e maggioranza		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
&lt;br /&gt;
	conditon oktoenter[2];&lt;br /&gt;
	int into[2];&lt;br /&gt;
&lt;br /&gt;
	enter(color){&lt;br /&gt;
		if(media(color) != 1){// attendo perche' non c'e una maggioranza&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		}&lt;br /&gt;
		into[color]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(color){&lt;br /&gt;
		into[color]--;&lt;br /&gt;
		if(media(1-color) == 1){&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
		}else if(media(color) == 1){&lt;br /&gt;
			oktoenter[color].signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ROSSO 0&lt;br /&gt;
#define BLU 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol {&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	condition oktoexit&lt;br /&gt;
	int running[2] // numero di processi rossi [0] e blu [1] in esecuzione&lt;br /&gt;
	queue waiting /* coda delle coppie (colore,azione) dei processi in attesa di entrare (azione==1)&lt;br /&gt;
			 o uscire (azione==-1) */&lt;br /&gt;
	&lt;br /&gt;
	/* restituisce true se aggiungendo o rimuovendo (in base a i) un processo del colore passato&lt;br /&gt;
	viene rispettato il 75% dei processi di un colore */&lt;br /&gt;
	bool morethan75p(colore, int i) { &lt;br /&gt;
		return (running[colore]+i&amp;gt;=running[1-colore]*3 || (running[colore]+i)*3&amp;lt;=running[1-colore])&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// risveglia un processo del colore passato se è possibile farlo&lt;br /&gt;
	void checkwakeup() {&lt;br /&gt;
		if (waiting.empty() == false) {&lt;br /&gt;
			colore,azione = waiting.head() // head resituisce l'elemento in testa senza rimuoverlo&lt;br /&gt;
			if (morethan75p(colore,azione)) {&lt;br /&gt;
				waiting.dequeue()&lt;br /&gt;
				if (azione == 1)&lt;br /&gt;
					oktoenter.signal()&lt;br /&gt;
				else&lt;br /&gt;
					oktoexit.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry enter(colore) {&lt;br /&gt;
		if (morethan75p(colore,1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,1)&lt;br /&gt;
			oktoenter.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]++&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry exit(colore) {&lt;br /&gt;
		if (morethan75p(colore,-1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,-1)&lt;br /&gt;
			oktoexit.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]--&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daniele Cortesi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLUE 1&lt;br /&gt;
int majorcolor = -1&lt;br /&gt;
int numproc[2] = 0,0&lt;br /&gt;
cond oktoenter[2]  //bastavano due condizioni.&lt;br /&gt;
cond oktoexit[2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
	procedure entry enter(COL){&lt;br /&gt;
		if(COL == majorcolor){&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			if((proc[majorcolor]*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;lt; 75)&lt;br /&gt;
				oktoenter[COL].wait()&lt;br /&gt;
			if(majorcolor == -1)&lt;br /&gt;
				majorcolor == COL&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			majorcolor = COL&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(COL){&lt;br /&gt;
		if(numproc[COL] + numproc[1-COL] == 1){&lt;br /&gt;
			majorcolor = -1&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == majorcolor){&lt;br /&gt;
			if(((proc[majorcolor] - 1)*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;lt; 75){&lt;br /&gt;
				oktoexit[COL].wait()&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoexit[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLU 1&lt;br /&gt;
&lt;br /&gt;
limcol{&lt;br /&gt;
	/*variable*/&lt;br /&gt;
	int array[2] = 0,0;&lt;br /&gt;
	color major = -1;&lt;br /&gt;
	/*condition*/&lt;br /&gt;
	condition oktoenter[2];&lt;br /&gt;
	condition oktoleave[2];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter( color ){&lt;br /&gt;
		if ( majorcolor == -1 ) &lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( majorcolor == (1-color) &amp;amp;&amp;amp; newmajorcolor%(color) &amp;lt; 75% )&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		array[color]++; &lt;br /&gt;
		if ( majorcolor == -1 )            //se un processo si risveglia nel monitor vuoto deve impostare majorcolor&lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( newmajorcolor%(1-color) &amp;gt;= 75% )         &lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit( color ){&lt;br /&gt;
		if ( majorcolor == color &amp;amp;&amp;amp; majorcolor_less1%(color) &amp;gt; 75% )&lt;br /&gt;
			oktoleave[color].wait();&lt;br /&gt;
		array[color]--;&lt;br /&gt;
		if ( !colorsempty() )&lt;br /&gt;
			if ( majorcolor_less1%(color) &amp;gt;= 75% )&lt;br /&gt;
				oktoleave[1-color].signal();&lt;br /&gt;
		else{&lt;br /&gt;
			majorcolor == -1;&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
				}&lt;br /&gt;
					}	 &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
newmajorcolor%(color) calcola la nuova % del colore maggiore aggiungendo color&lt;br /&gt;
majorcolor_less1%(color) calcola la nuova % del colore maggiore togliendo color&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pir@t@&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#DEFINE BLUE 0&lt;br /&gt;
#DEFINE RED 1&lt;br /&gt;
monitor limcol{&lt;br /&gt;
condition ok;&lt;br /&gt;
int numcolor[2];&lt;br /&gt;
Queue q;&lt;br /&gt;
int i=1;&lt;br /&gt;
procedure entry enter(color){&lt;br /&gt;
if((numcolor[color] + 1 &amp;lt; float((tot+1)*(75/100))  &amp;amp;&amp;amp;&lt;br /&gt;
   numcolor[color] + 1 &amp;gt;= float((tot+1)*(25/100))) ||&lt;br /&gt;
   !q.empty() ) &lt;br /&gt;
	{&lt;br /&gt;
	q.enqueue(color);&lt;br /&gt;
	ok.wait();&lt;br /&gt;
	i++;&lt;br /&gt;
	if(!q.empty()){&lt;br /&gt;
          if(numcolor[q.head()] + i &amp;gt;= float((tot+i)*(75/100)) ||&lt;br /&gt;
	   numcolor[q.head()] + i &amp;lt; float((tot+i)*(25/100)))  )&lt;br /&gt;
	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
	i=1;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
numcolor[color]++;&lt;br /&gt;
tot++;&lt;br /&gt;
}&lt;br /&gt;
procedure entry exit(color){&lt;br /&gt;
numcolor[color]--;&lt;br /&gt;
tot--;&lt;br /&gt;
if( numcolor[q.head()] + 1 &amp;gt;= float((tot+1)*(75/100))  ||&lt;br /&gt;
    numcolor[q.head()] + 1 &amp;lt; float((tot+1)*(25/100)) )&lt;br /&gt;
  	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio c.2&amp;lt;/h2&amp;gt;&lt;br /&gt;
Per quali indici n le funzioni foo possono essere utilizzate al posto della test&amp;amp;set?&lt;br /&gt;
Risposta: per n = 5&lt;br /&gt;
x prende il fatto il valore di y, quindi y deve essere = booln(x,y)&lt;br /&gt;
Andiamo a vedere per quali valori y è uguale a booln(x,y)&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! x || y || bool0 || bool1 || bool2 || bool3 || bool4 || bool5 || bool6 || bool7 || bool8 || bool9 || bool10 || bool11 || bool12 || bool13 || bool14 || bool15&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''0''' || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In bold sono indicati i valori per cui y = booln(x,y)&lt;br /&gt;
L'unico caso in cui i valori sono evidenziati in ogni riga è per bool5.&lt;br /&gt;
&lt;br /&gt;
Giulia (non sono molto sicura della soluzione, ma questo è il ragionamento che mi è sembrato più corretto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Reference String&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 4 || 5 || 6 || 3 || 2 || 1 || 3 || 2 || 1 || 6 || 5 || 4 || 6 || 5 || 4 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 1&lt;br /&gt;
| 1 || 1 || 1 || 4 || 4 || 4 ||   ||   ||   || 3 || 3 || 3 ||   ||   ||   || 6 || 6 || 6 ||   ||   ||   || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 2&lt;br /&gt;
|   || 2 || 2 || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2 ||   ||   ||   || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 3&lt;br /&gt;
|   ||   || 3 || 3 || 3 || 6 ||   ||   ||   || 6 || 6 || 1 ||   ||   ||   || 1 || 1 || 4 ||   ||   ||   || 4 || 4 || 3&lt;br /&gt;
|}&lt;br /&gt;
                        &lt;br /&gt;
The above Reference String is both FIFO, LRU and MIN compliant.&lt;br /&gt;
&lt;br /&gt;
-TomOgn&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=500</id>
		<title>ProvaTeorica 2012.05.24</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=500"/>
		<updated>2014-03-25T14:28:12Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
	Go = 0;               // andare al santuario&lt;br /&gt;
	Back = 1;             // tornare indietro&lt;br /&gt;
	condition ok[2];      // 2 condizioni&lt;br /&gt;
	crossing[2] = {0, 0}; // numero di persone sul ponte&lt;br /&gt;
	visiting = 0;         // numero di persone nel santuario&lt;br /&gt;
	waiting[2] = {0, 0};  // numero di persone in attesa&lt;br /&gt;
&lt;br /&gt;
	procedure entry entraponte(dir)&lt;br /&gt;
	{&lt;br /&gt;
		/* Mi blocco se: &lt;br /&gt;
		      - il numero di persone sul ponte ha raggiunto il massimo; oppure&lt;br /&gt;
		      - la direzione e' il santuario e il numero di visitatori &lt;br /&gt;
                        (compresi quelli che stanno raggiungendo il santuario) ha raggiunto il massimo; oppure&lt;br /&gt;
		      - qualcuno sta attraversando il ponte in direzione opposta; oppure&lt;br /&gt;
		      - qualcuno sta attendendo di attraversare nel senso opposto */	&lt;br /&gt;
		if (crossing[dir] == MAXPONTE || &lt;br /&gt;
		    (dir == Go &amp;amp;&amp;amp; visiting + crossing[dir] == MAXSANTUARIO) || &lt;br /&gt;
		    crossing[1 - dir] &amp;gt; 0 || &lt;br /&gt;
		    waiting[1 - dir] &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			waiting[dir]++;&lt;br /&gt;
			ok[dir].wait();&lt;br /&gt;
			waiting[dir]--;&lt;br /&gt;
		}&lt;br /&gt;
		crossing[dir]++;&lt;br /&gt;
&lt;br /&gt;
		if (dir == Back)&lt;br /&gt;
			visiting--;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry esciponte(dir)&lt;br /&gt;
	{&lt;br /&gt;
		crossing[dir]--;&lt;br /&gt;
&lt;br /&gt;
		if (dir == Go)&lt;br /&gt;
			visiting++;&lt;br /&gt;
		&lt;br /&gt;
		// [Case 1] Nessuno sta attraversando il ponte&lt;br /&gt;
		if (crossing[dir] == 0)&lt;br /&gt;
			ok[1 - dir].signal();&lt;br /&gt;
		// [Case 2] Qualcuno sta attraversando il ponte&lt;br /&gt;
		else&lt;br /&gt;
			ok[dir].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-TomOgn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario{&lt;br /&gt;
	#define ANDATA 0&lt;br /&gt;
	#define RITORNO 1&lt;br /&gt;
	&lt;br /&gt;
	int waiting[2];&lt;br /&gt;
	int crossing[2];&lt;br /&gt;
	condition oktoenter[2];&lt;br /&gt;
	int count; /* persone dentro al santuario */&lt;br /&gt;
	&lt;br /&gt;
	procedure entry entraponte(int dir){&lt;br /&gt;
		if (dir == ANDATA){&lt;br /&gt;
			if (crossing[1-dir] &amp;gt; 0 || crossing[dir] &amp;gt;= MAXPONTE || cout+crossing[dir] &amp;gt;= MAXSANTUARIO){&lt;br /&gt;
				waiting[dir]++;&lt;br /&gt;
				oktoenter[dir].wait();&lt;br /&gt;
				waiting[dir]--;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			if (crossing[1-dir] &amp;gt; 0 || crossing[dir] &amp;gt;= MAXPONTE){&lt;br /&gt;
				waiting[dir]++;&lt;br /&gt;
				oktoenter[dir].wait();&lt;br /&gt;
				waiting[dir]--;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		crossing[dir]++;&lt;br /&gt;
		if ((crossing[dir]+count &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; crossing[dir] &amp;lt; MAXPONTE)&lt;br /&gt;
			oktoenter[dir].signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry esciponte(int dir){&lt;br /&gt;
		crossing[dir]--;&lt;br /&gt;
		if (dir == ANDATA){&lt;br /&gt;
			count++;&lt;br /&gt;
			if (count+crossing[dir] &amp;lt; MAXSANTUARIO) /* voi che siete in attesa andate sul ponte */&lt;br /&gt;
				oktoenter[dir].signal();&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
			count--;&lt;br /&gt;
		&lt;br /&gt;
		if (crossing[dir] == 0)&lt;br /&gt;
			oktoenter[1-dir].signal();	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gabriele &amp;amp; Giulia (se non va colpa di Gabriele)&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=470</id>
		<title>ProvaTeorica 2013.01.24</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=470"/>
		<updated>2014-03-18T17:04:43Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio C1:&lt;br /&gt;
(a) Scrivere un monitor nmbb che realizzi un buffer limitato (di ampiezza BUFSIZE) che consenta alle&lt;br /&gt;
chiamate write (inserimento nel buffer) e read (lettura da buffer) di operare su vettori di piu' elementi. In particolare&lt;br /&gt;
l'interfaccia delle procedure entry da implementare e' la seguente:&lt;br /&gt;
procedure entry write(int n, struct elem *v);&lt;br /&gt;
procedure entry read(int m, struct elem *w);&lt;br /&gt;
se n o m sono maggiori di BUFSIZE le funzioni non devono fare nulla (caso di errore).&lt;br /&gt;
La funzione write deve attendere che ci sia spazio nel buffer per inserire n elementi (il vettore v conterra' n elementi).&lt;br /&gt;
Solo quando e' possibile completare l'operazione vengono inseriti tutti gli elementi di v nel buffer.&lt;br /&gt;
La funzione read attende che vi siano almeno m elementi nel buffer quindi estrae dal buffer (in ordine FIFO) m elementi e li copia nel vettore w .&lt;br /&gt;
(b) sono possibili casi di deadlock? (motivare dettagliatamente la risposta)&lt;br /&gt;
&lt;br /&gt;
La mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
read(): legge dalla coda un elemento senza rimuoverlo&lt;br /&gt;
queue(elem v,int n): inserisce nella coda n elementi v;&lt;br /&gt;
dequeue(int n): legge n elementi dalla coda e li rimuove;&lt;br /&gt;
&lt;br /&gt;
monitor  mnbb{&lt;br /&gt;
	conditon oktowrite, oktoread;&lt;br /&gt;
	queue qwrite,qread;&lt;br /&gt;
&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		}&lt;br /&gt;
		if( n &amp;gt; (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.queue( n, 1 );&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		}&lt;br /&gt;
		buff.queue( v, n );&lt;br /&gt;
		if(qread.read() &amp;lt;= buff.lengh){&lt;br /&gt;
			qread.dequeue(1);&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m &amp;gt; BUFSIZE){&lt;br /&gt;
			return(ERROR);&lt;br /&gt;
		} &lt;br /&gt;
		if(m &amp;gt; buff.lengh){&lt;br /&gt;
			qread.queue( m, 1 );&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		}&lt;br /&gt;
		w = buff.dequeue(m);&lt;br /&gt;
		if(qwrite.read() &amp;lt;= (BUFSIZE - buff.lengh)){&lt;br /&gt;
			qwrite.dequeue(1);&lt;br /&gt;
			oktowirte.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor nmbb{&lt;br /&gt;
	queue buffer;&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	&lt;br /&gt;
	/* assumiamo che essendo un buffer limitato ci sia un solo processo che vuole scrivere e un solo processo che vuole leggere */&lt;br /&gt;
	int N, M;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry write(int n, struct elem *v){&lt;br /&gt;
		if(n&amp;gt;BUFSIZE) return;&lt;br /&gt;
		N=n;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; N)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;N; i++)&lt;br /&gt;
			buffer.enqueue(v[i]);&lt;br /&gt;
			&lt;br /&gt;
		if(M &amp;gt; buffer.len)&lt;br /&gt;
			oktoread.signal();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	procedure entry read(int m, struct elem *w){&lt;br /&gt;
		if(m&amp;gt;BUFSIZE) return;&lt;br /&gt;
		M=m;&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;lt; M)&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++)&lt;br /&gt;
			w[i] = buffer.dequeue;&lt;br /&gt;
		&lt;br /&gt;
		if((BUFSIZE - buffer.len) &amp;gt;= N)&lt;br /&gt;
			oktowrite.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Si può verificare deadlock. Esempio: un lettore vuole leggere un tot di elementi, ma quelli presenti non sono sufficienti. Uno scrittore a sua volta non può più scrivere un certo numero di elementi in quanto il buffer è parzialmente occupato. Lo scrittore aspetterà che il lettore legga; il lettore aspetterà invece lo scrittore: deadlock.&lt;br /&gt;
&lt;br /&gt;
Gabriele e Giulia&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.07.19&amp;diff=468</id>
		<title>ProvaTeorica 2013.07.19</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.07.19&amp;diff=468"/>
		<updated>2014-03-18T16:32:34Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esecizio C1:&lt;br /&gt;
scrivere un monitor m vie che gestisca M buffer limitati. Ogni buffer ha l'ampiezza di M ELEM elementi. I produttori chiamano la procedure entry:&lt;br /&gt;
put(generic *object)&lt;br /&gt;
mentre i consumatori chiamano la procedure entry&lt;br /&gt;
generic *get(int n)&lt;br /&gt;
I produttori conferiscono un vettore di M element i, uno per ogni buffer al buffer.&lt;br /&gt;
Per esempio put( v ), (dove v e' un vettore di M elementi) inserisce ogni elemento del vettore nel buffer corrispondente.&lt;br /&gt;
I consumatori ricevono un oggetto dal buffer indicato come parametro oggetti ma attendono sempre che ci sia almeno un elemento in ogni buffer.&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*AreEmpy: */&lt;br /&gt;
/*true quando almeno un buff é vuoto*/&lt;br /&gt;
/*false quando tutti hanno almeno un elemento*/&lt;br /&gt;
bool areEmpy(*buff){&lt;br /&gt;
	for(int a = 0; a&amp;lt;M;a++){&lt;br /&gt;
		if(buff[a].lengh != 0){&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
        }&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
/*AreFull: */&lt;br /&gt;
/*true quando almeno un buff é pieno*/&lt;br /&gt;
/*false quando sono tutti non pieni*/&lt;br /&gt;
bool areFull(*buff){&lt;br /&gt;
	for(int a =  0; a&amp;lt;M;a++){&lt;br /&gt;
		if (buff[a].lengh == MELEM){&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return false;   &lt;br /&gt;
}&lt;br /&gt;
monitor mvie{&lt;br /&gt;
	put(generic *object){&lt;br /&gt;
		if( areFull(buff) ) &lt;br /&gt;
			oktoput.wait();&lt;br /&gt;
		for(int a = 0; a&amp;lt;M;a++){&lt;br /&gt;
			buf[a].queue(object[a]);&lt;br /&gt;
		}&lt;br /&gt;
		for(int a = 0; a&amp;lt;M;a++){&lt;br /&gt;
			oktoget[a].signal();//tutti i buffer hanno almeno un elemento quindi manda la signal a tutti i lettori&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	generic *get(int i){&lt;br /&gt;
		if( areEmpty(buff))&lt;br /&gt;
			oktoget.wait();&lt;br /&gt;
		buf[i].dequeue(); &lt;br /&gt;
		if(!areFull(buf)) //  se cé spazio in tutti i buffer manda la signal per scrivere&lt;br /&gt;
			oktoput.signal(); &lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questa è la mia soluzione:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int everything_set(queue[]) /*prende un array di code e ritorna 1 se sono tutte non vuote*/&lt;br /&gt;
int not_full(queue[]) /*prende un array di code e ritorna 1 se tutte le code hanno meno di MELEM elementi*/&lt;br /&gt;
&lt;br /&gt;
monitor mvie&lt;br /&gt;
{&lt;br /&gt;
	queue buf[M];&lt;br /&gt;
	condition oktowrite,oktoread;&lt;br /&gt;
	procedure entry put(generic *object)&lt;br /&gt;
	{&lt;br /&gt;
		if (!not_full(buf))&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
		for (i=0;i&amp;lt;M;i++)&lt;br /&gt;
		{&lt;br /&gt;
			buf[i].enqueue(object[i]);&lt;br /&gt;
		}&lt;br /&gt;
		oktoread.signal();&lt;br /&gt;
	}&lt;br /&gt;
	procedure entry generic* get (int n)&lt;br /&gt;
	{&lt;br /&gt;
		if (!everything_set(buf))&lt;br /&gt;
			oktoread.wait();&lt;br /&gt;
		generic g=buf[n].dequeue();&lt;br /&gt;
		if (not_full(buf)&lt;br /&gt;
			oktowrite.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Secondo me, bloccare il processo che vuole fare PUT, nel caso in cui esiste un buffer pieno, determina DEADLOCK.&lt;br /&gt;
&lt;br /&gt;
Infatti il testo non lo chiede. Faccio un esempio:&lt;br /&gt;
&lt;br /&gt;
Buffer 1: (empty)&lt;br /&gt;
&lt;br /&gt;
Buffer 2: (full)&lt;br /&gt;
&lt;br /&gt;
Processo 1: GET -&amp;gt; si blocca in quanto il Buffer 1 e' vuoto.&lt;br /&gt;
&lt;br /&gt;
Processo 2: PUT -&amp;gt; si blocca in quanto il Buffer 2 e' pieno.&lt;br /&gt;
&lt;br /&gt;
...etc...&lt;br /&gt;
&lt;br /&gt;
DEADLOCK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quando aggiungi a tutti e togli a 1 solo, e' plausibile che si formi, prima o poi, la situazione descritta sopra: un buffer pieno e uno vuoto.&lt;br /&gt;
Nella mia soluzione quindi non c'e' questo controllo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor mvie&lt;br /&gt;
{&lt;br /&gt;
	condition okP, okG;&lt;br /&gt;
	queue buf[M];&lt;br /&gt;
	&lt;br /&gt;
	bool isOneEmpty()&lt;br /&gt;
	{&lt;br /&gt;
		for (int i = 0; i &amp;lt; M; i++)&lt;br /&gt;
			if (buf[i].isEmpty())&lt;br /&gt;
				return true;&lt;br /&gt;
				&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry put(generic *object)&lt;br /&gt;
	{&lt;br /&gt;
		for (int i = 0; i &amp;lt; M; i++)&lt;br /&gt;
			if (buf[i].length() &amp;lt; MELEM)&lt;br /&gt;
				buf[i].enqueue(object[i]);&lt;br /&gt;
		&lt;br /&gt;
		okG.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry generic *get(int n)&lt;br /&gt;
	{&lt;br /&gt;
		if (isOneEmpty())&lt;br /&gt;
			okG.wait();&lt;br /&gt;
		&lt;br /&gt;
		generic output = buf[n].dequeue();&lt;br /&gt;
		okP.signal();&lt;br /&gt;
		return &amp;amp;output;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-TomOgn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
monitor mvie{&lt;br /&gt;
	queue buffer[M];&lt;br /&gt;
	condition oktoput;&lt;br /&gt;
	condition oktoget;&lt;br /&gt;
	&lt;br /&gt;
	mvie(){&lt;br /&gt;
		int i;&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++)&lt;br /&gt;
			buffer[i] = new queue(MELEM);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	put(generic *object){&lt;br /&gt;
		int i;&lt;br /&gt;
		boolean b=1;&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++){&lt;br /&gt;
			if(!(buffer[i].len &amp;lt; MELEM))&lt;br /&gt;
				b=0;&lt;br /&gt;
			}&lt;br /&gt;
		if(b == 0) /*almeno un elemento non era disponibile*/&lt;br /&gt;
			oktoput.wait();&lt;br /&gt;
		&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++)&lt;br /&gt;
			buffer[i].enqueue(object[i]);&lt;br /&gt;
		oktoget.signal();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	generic *get(int n){&lt;br /&gt;
		int i;&lt;br /&gt;
		boolean b=1;&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++){&lt;br /&gt;
			if(buffer[i].len == 0)&lt;br /&gt;
				b=0;&lt;br /&gt;
			}&lt;br /&gt;
		if(b == 0)&lt;br /&gt;
			oktoget.wait();&lt;br /&gt;
		&lt;br /&gt;
		object toread = buffer[n].dequeue;&lt;br /&gt;
		/* dobbiamo controllare che ci sia almeno un elemento libero per ciascun buffer prima di fare la signal */&lt;br /&gt;
		b = 1;&lt;br /&gt;
		for(i=0; i&amp;lt;M; i++){&lt;br /&gt;
			if(!(buffer[i].len &amp;lt; MELEM))&lt;br /&gt;
				b=0;&lt;br /&gt;
			}&lt;br /&gt;
		if(b)&lt;br /&gt;
			oktoput.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gabriele e Giulia&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.01.25&amp;diff=401</id>
		<title>ProvaPratica 2013.01.25</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.01.25&amp;diff=401"/>
		<updated>2013-12-18T15:26:39Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
http://www.cs.unibo.it/~renzo/so/pratiche/2013.01.25.pdf&lt;br /&gt;
 &lt;br /&gt;
Scrivere un programma listexe che fornisca in output l'elenco dei processi attivi nel sistema mettendo in output per ogni&lt;br /&gt;
processo il pid e il path dell'eseguibile.&lt;br /&gt;
L'informazione puo' essere trovata scandendo la directory proc, infatti ad ogni processo attivo corrisponde una directory in&lt;br /&gt;
/proc che ha come nome il numero del processo (ad esempio al processo 9801 corrisponde la directory /proc/9801) e all'interno&lt;br /&gt;
di queste directory il file exe e' un link simbolico all'eseguibile.&lt;br /&gt;
Esempio:&lt;br /&gt;
$ ls -l /proc/9801/exe&lt;br /&gt;
lrwxrwxrwx 1 renzo renzo 0 Jan 22 18:26 /proc/9801/exe -&amp;gt; /bin/bash&lt;br /&gt;
l'output del programma listexe dovrebbe essere:&lt;br /&gt;
$ listexe&lt;br /&gt;
.....&lt;br /&gt;
9801 /bin/bash&lt;br /&gt;
9933 /usr/bin/vim&lt;br /&gt;
.....&lt;br /&gt;
(alcuni link simbolici possono essere non leggibili per sicurezza, verranno omessi).*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	struct dirent **namelist;&lt;br /&gt;
	int n;&lt;br /&gt;
	struct stat buf;&lt;br /&gt;
	char dir[1024];&lt;br /&gt;
	char path[1024];&lt;br /&gt;
	char exe[1024];&lt;br /&gt;
	&lt;br /&gt;
	n = scandir(&amp;quot;/proc&amp;quot;, &amp;amp;namelist, NULL, 0);&lt;br /&gt;
	&lt;br /&gt;
	if(n&amp;lt;0)&lt;br /&gt;
		perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	else{	&lt;br /&gt;
		while(n--){&lt;br /&gt;
			sprintf(dir, &amp;quot;/proc/%s&amp;quot;,namelist[n]-&amp;gt;d_name);&lt;br /&gt;
			&lt;br /&gt;
			stat(dir,&amp;amp;buf);&lt;br /&gt;
			if(S_ISDIR(buf.st_mode)){&lt;br /&gt;
				sprintf(path, &amp;quot;%s/exe&amp;quot;,dir);&lt;br /&gt;
				readlink(path, exe, 1024);&lt;br /&gt;
				printf(&amp;quot;%s %s\n&amp;quot;,namelist[n]-&amp;gt;d_name,exe);&lt;br /&gt;
				free(namelist[n]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		free(namelist);&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene...&lt;br /&gt;
&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.01.25&amp;diff=400</id>
		<title>ProvaPratica 2013.01.25</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.01.25&amp;diff=400"/>
		<updated>2013-12-18T15:25:11Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: Created page with &amp;quot;Esercizio 1  &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; /* http://www.cs.unibo.it/~renzo/so/pratiche/2013.01.25.pdf   Scrivere un programma listexe che fornisca in output l'elenco dei process...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
http://www.cs.unibo.it/~renzo/so/pratiche/2013.01.25.pdf&lt;br /&gt;
 &lt;br /&gt;
Scrivere un programma listexe che fornisca in output l'elenco dei processi attivi nel sistema mettendo in output per ogni&lt;br /&gt;
processo il pid e il path dell'eseguibile.&lt;br /&gt;
L'informazione puo' essere trovata scandendo la directory proc, infatti ad ogni processo attivo corrisponde una directory in&lt;br /&gt;
/proc che ha come nome il numero del processo (ad esempio al processo 9801 corrisponde la directory /proc/9801) e all'interno&lt;br /&gt;
di queste directory il file exe e' un link simbolico all'eseguibile.&lt;br /&gt;
Esempio:&lt;br /&gt;
$ ls -l /proc/9801/exe&lt;br /&gt;
lrwxrwxrwx 1 renzo renzo 0 Jan 22 18:26 /proc/9801/exe -&amp;gt; /bin/bash&lt;br /&gt;
l'output del programma listexe dovrebbe essere:&lt;br /&gt;
$ listexe&lt;br /&gt;
.....&lt;br /&gt;
9801 /bin/bash&lt;br /&gt;
9933 /usr/bin/vim&lt;br /&gt;
.....&lt;br /&gt;
(alcuni link simbolici possono essere non leggibili per sicurezza, verranno omessi).*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	struct dirent **namelist;&lt;br /&gt;
	int n;&lt;br /&gt;
	struct stat buf;&lt;br /&gt;
	char dir[1024];&lt;br /&gt;
	char path[1024];&lt;br /&gt;
	char exe[1024];&lt;br /&gt;
	&lt;br /&gt;
	n = scandir(&amp;quot;/proc&amp;quot;, &amp;amp;namelist, NULL, 0);&lt;br /&gt;
	&lt;br /&gt;
	if(n&amp;lt;0)&lt;br /&gt;
		perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	else{	&lt;br /&gt;
		while(n--){&lt;br /&gt;
			sprintf(dir, &amp;quot;/proc/%s&amp;quot;,namelist[n]-&amp;gt;d_name);&lt;br /&gt;
			&lt;br /&gt;
			stat(dir,&amp;amp;buf);&lt;br /&gt;
			if(S_ISDIR(buf.st_mode)){&lt;br /&gt;
				sprintf(path, &amp;quot;%s/exe&amp;quot;,dir);&lt;br /&gt;
				readlink(path, exe, 1024);&lt;br /&gt;
				printf(&amp;quot;%s %s\n&amp;quot;,namelist[n]-&amp;gt;d_name,exe);&lt;br /&gt;
				free(namelist[n]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		free(namelist);&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene...&lt;br /&gt;
GiuliaN.&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=399</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=399"/>
		<updated>2013-12-18T15:21:52Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Esercizi a caso del Prof.]]&lt;br /&gt;
&lt;br /&gt;
[[Python Programma tieni punteggio.]]&lt;br /&gt;
&lt;br /&gt;
[[Comandi visti alle lezioni.]]&lt;br /&gt;
&lt;br /&gt;
[[SYS CALL viste a lezione.]]&lt;br /&gt;
&lt;br /&gt;
[[Parametri con getopt().]]&lt;br /&gt;
&lt;br /&gt;
[[Funzione con numero variabile di parametri.]]&lt;br /&gt;
&lt;br /&gt;
[[stampf - implementazione ridotta della printf.]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.07.18]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.06.21]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.05.29]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.02.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.01.25]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.06.21&amp;diff=397</id>
		<title>ProvaPratica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.06.21&amp;diff=397"/>
		<updated>2013-12-15T14:30:41Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Esercizio 1 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
20 giugno 2013&lt;br /&gt;
Esercizio 1&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.06.21.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Comparison function for iNode&lt;br /&gt;
 * Input:    2 dirent pointers&lt;br /&gt;
 * Output:&lt;br /&gt;
 *           1,   if iNode[a] &amp;gt; iNode[b]&lt;br /&gt;
 * 	     0,   if iNode[a] == iNode[b]&lt;br /&gt;
 * 	    -1,   else */&lt;br /&gt;
int iNodeComparison(const struct dirent **a, const struct dirent **b)&lt;br /&gt;
{&lt;br /&gt;
    long iNodeA = (long)(*a)-&amp;gt;d_ino;&lt;br /&gt;
    long iNodeB = (long)(*b)-&amp;gt;d_ino;&lt;br /&gt;
    return (iNodeA &amp;gt; iNodeB) - (iNodeA &amp;lt; iNodeB);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Scan a directory -&amp;gt;&lt;br /&gt;
 * Order the entries by iNode number -&amp;gt;&lt;br /&gt;
 * Print name and iNode of each file. */&lt;br /&gt;
void scanDirectory(char *dir)&lt;br /&gt;
{&lt;br /&gt;
    int result, iterator;&lt;br /&gt;
    struct dirent **files;&lt;br /&gt;
&lt;br /&gt;
    result = scandir(dir, &amp;amp;files, NULL, iNodeComparison);&lt;br /&gt;
&lt;br /&gt;
    // Check if any errors occurred&lt;br /&gt;
    if (result &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        perror(&amp;quot;scandir()&amp;quot;);&lt;br /&gt;
	exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Loop through directory entries&lt;br /&gt;
    for(iterator = 0; iterator &amp;lt; result; iterator++)&lt;br /&gt;
    {&lt;br /&gt;
	printf(&amp;quot;%s/%s %li\n&amp;quot;, dir, files[iterator]-&amp;gt;d_name, (long)files[iterator]-&amp;gt;d_ino);&lt;br /&gt;
&lt;br /&gt;
	// Garbage collection&lt;br /&gt;
	free(files[iterator]);&lt;br /&gt;
    }&lt;br /&gt;
    free(files);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Entry point&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    char cwd[1024];&lt;br /&gt;
&lt;br /&gt;
    // if (number of parameters&lt;br /&gt;
    switch(argc)&lt;br /&gt;
    {&lt;br /&gt;
    	// == 0) =&amp;gt; Use the current directory&lt;br /&gt;
    	case 1:&lt;br /&gt;
    	    if (!getcwd(cwd, sizeof(cwd)))&lt;br /&gt;
    	    {&lt;br /&gt;
    		perror(&amp;quot;getcwd()&amp;quot;);&lt;br /&gt;
    		exit(EXIT_FAILURE);&lt;br /&gt;
    	    }&lt;br /&gt;
    	    scanDirectory(cwd);&lt;br /&gt;
    	    exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
    	// == 1) =&amp;gt; Use the given directory&lt;br /&gt;
    	case 2:&lt;br /&gt;
    	    scanDirectory(argv[1]);&lt;br /&gt;
    	    exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
    	// &amp;gt; 1) =&amp;gt; Wrong input&lt;br /&gt;
    	default:&lt;br /&gt;
    	    printf(&amp;quot;The function requires 0 or 1 parameters.\n&amp;quot;);&lt;br /&gt;
    	    exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La mia versione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*Scrivere un programma che stampi il numero di inode di ogni file presente in una direcotory passata come argomento (o della&lt;br /&gt;
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.&lt;br /&gt;
Es:&lt;br /&gt;
$ lsino demo&lt;br /&gt;
demo/. 1972484&lt;br /&gt;
demo/.. 1971834&lt;br /&gt;
demo/1.c 1972528&lt;br /&gt;
demo/a.out 1972485&lt;br /&gt;
demo/l1 1972486&lt;br /&gt;
demo/l2 1972486&lt;br /&gt;
demo/l3 1972486&lt;br /&gt;
demo/link.c 1972528*/&lt;br /&gt;
&lt;br /&gt;
#define _SVID_SOURCE&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	struct stat sb;&lt;br /&gt;
	char cwd[1024];&lt;br /&gt;
	struct dirent **namelist;&lt;br /&gt;
	int n; /*valore di ritorno di scandir*/&lt;br /&gt;
	int i=0;&lt;br /&gt;
		&lt;br /&gt;
	if(argc&amp;gt;1){ /*se la directory e' stata data in input*/&lt;br /&gt;
		strcpy(cwd,argv[1]);&lt;br /&gt;
		}	&lt;br /&gt;
	else{ /*se la directory non viene data in input*/&lt;br /&gt;
		getcwd(cwd, sizeof(cwd));&lt;br /&gt;
	}&lt;br /&gt;
	/*ora dentro cwd c'è la cartella interessata*/&lt;br /&gt;
	&lt;br /&gt;
	n = scandir(cwd, &amp;amp;namelist, NULL, alphasort);&lt;br /&gt;
	&lt;br /&gt;
	if(n&amp;lt;0)&lt;br /&gt;
		perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
	else {&lt;br /&gt;
		while (i&amp;lt;n) {&lt;br /&gt;
			printf(&amp;quot;%s/%s %ld\n&amp;quot;, cwd,namelist[i]-&amp;gt;d_name,(long)namelist[i]-&amp;gt;d_ino);&lt;br /&gt;
			free(namelist[i]);&lt;br /&gt;
			i++;&lt;br /&gt;
	    }&lt;br /&gt;
	free(namelist);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Non mi è chiara una cosa: nel testo specifica &amp;quot;stampi l'elenco in ordine crescente di numero di i-node&amp;quot;, tuttavia nell'esempio sono ordinati grazie a quella che penso sia l'alphasort e quindi è la soluzione che ho sviluppato io.&lt;br /&gt;
Giulia N.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 3 ==&lt;br /&gt;
&lt;br /&gt;
[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
20 giugno 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.06.21.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys, hashlib&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 1:&lt;br /&gt;
        print(&amp;quot;The function does not require arguments to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file size - [file name]}&lt;br /&gt;
    sameSize = { }&lt;br /&gt;
    PopulateSameSize(sameSize)&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {MD5 hash - [file name]}&lt;br /&gt;
    sameContent = { }&lt;br /&gt;
    for filePaths in sorted(sameSize.values(), key = len, reverse = True):&lt;br /&gt;
        # No files with same size =&amp;gt; No files with same content&lt;br /&gt;
        if len(filePaths) &amp;lt; 2: break&lt;br /&gt;
        PopulateSameContent(filePaths, sameContent)&lt;br /&gt;
&lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(sameContent)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Done!&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
# Populate a dictionary with key-value pair {file size - [file name]}&lt;br /&gt;
def PopulateSameSize(sameSize):&lt;br /&gt;
    for dirPath, _, fileNames in os.walk(os.getcwd()):&lt;br /&gt;
        for fileName in fileNames:&lt;br /&gt;
            filePath = os.path.join(dirPath, fileName)&lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            sameSize[fileSize] = sameSize.get(fileSize, []) + [filePath]  &lt;br /&gt;
 &lt;br /&gt;
# Populate a dictionary with key-value pair {MD5 hash - [file name]}&lt;br /&gt;
def PopulateSameContent(filePaths, sameContent):&lt;br /&gt;
    for filePath in filePaths:&lt;br /&gt;
        md5 = GetMd5Hash(filePath)&lt;br /&gt;
        fileRelPath = os.path.relpath(filePath, os.getcwd())&lt;br /&gt;
        sameContent[md5] = sameContent.get(md5, []) + [fileRelPath]&lt;br /&gt;
&lt;br /&gt;
# Get the MD5 hash without loading the whole file to memory&lt;br /&gt;
# Break the file in chunks whose size is a multiple of 128&lt;br /&gt;
# This takes advantage of the fact that MD5 has 128-byte digest blocks&lt;br /&gt;
def GetMd5Hash(filePath, blockSize = 2 ** 20):&lt;br /&gt;
    digest = hashlib.md5()&lt;br /&gt;
    with open(filePath, &amp;quot;rb&amp;quot;) as file:&lt;br /&gt;
        for chunk in iter(lambda: file.read(blockSize), b''): &lt;br /&gt;
            digest.update(chunk)&lt;br /&gt;
    return digest.hexdigest()&lt;br /&gt;
&lt;br /&gt;
# Printout the lists of files having same content&lt;br /&gt;
def PrintResults(sameContent):&lt;br /&gt;
    print(&amp;quot;Lists of files having same content:&amp;quot;)&lt;br /&gt;
    for files in sorted(sameContent.values(), key = len, reverse = True):&lt;br /&gt;
        if len(files) &amp;lt; 2: break&lt;br /&gt;
        print(&amp;quot;[{0}]&amp;quot;.format(&amp;quot;, &amp;quot;.join(file for file in files)))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ecco la mia versione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, hashlib&lt;br /&gt;
&lt;br /&gt;
def fileCurrDir():#restituisce una lista res di file presenti nella directory&lt;br /&gt;
	fcd = os.listdir('.')&lt;br /&gt;
	res = []&lt;br /&gt;
	for ott in fcd:&lt;br /&gt;
		if os.path.isfile('{0}'.format(ott)):res.append(ott)&lt;br /&gt;
		else:continue&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def dictsize(fl=fileCurrDir()):#restituisce un dizionario con key filesize e value lista di filenames aventi size di filesize&lt;br /&gt;
	res = {}&lt;br /&gt;
	for f in fl:&lt;br /&gt;
		if os.path.getsize('{0}'.format(f)) in list(res.keys()):res[os.path.getsize('{0}'.format(f))].append(f);continue&lt;br /&gt;
		else:pass&lt;br /&gt;
		res[os.path.getsize('{0}'.format(f))] = list()&lt;br /&gt;
		res[os.path.getsize('{0}'.format(f))].append(f)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def dictremsa(a=dictsize()):#data un dizionario key::list rimuove tutti gli item la cui len di lista sia unitaria&lt;br /&gt;
	tmp = list(a.keys())&lt;br /&gt;
	for tmpkey in tmp:&lt;br /&gt;
		if len(a[tmpkey]) &amp;lt; 2: a.pop(tmpkey)&lt;br /&gt;
		else:continue&lt;br /&gt;
	return a&lt;br /&gt;
&lt;br /&gt;
def hashcontrolinsl(l1): #data una lista di nomi di file compara l hash di tutte le possibili coppie dentro 	l1&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		toTest = l1.pop()&lt;br /&gt;
		del res[:]&lt;br /&gt;
		res.append(toTest)&lt;br /&gt;
		for tmp in l1:&lt;br /&gt;
			#res.append(list[toTest,tmp])&lt;br /&gt;
	#return res&lt;br /&gt;
			hasher = hashlib.md5()&lt;br /&gt;
			hasher2 = hashlib.md5()&lt;br /&gt;
			f = open('{0}'.format(toTest), 'rb')&lt;br /&gt;
			toHash = f.read()&lt;br /&gt;
			hasher.update(toHash)&lt;br /&gt;
			toTesthash = hasher.hexdigest()&lt;br /&gt;
			f.close()&lt;br /&gt;
			f = open('{0}'.format(tmp), 'rb')&lt;br /&gt;
			toHash2 = f.read()&lt;br /&gt;
			hasher2.update(toHash2)&lt;br /&gt;
			tmphash = hasher2.hexdigest()&lt;br /&gt;
			if tmphash==toTesthash: #print('{0} e {1}  sono uguali\n'.format(toTest,tmp))&lt;br /&gt;
				res.append(tmp)&lt;br /&gt;
			else:continue&lt;br /&gt;
		if len(res)&amp;gt;1: &lt;br /&gt;
			print(res);res.pop(0)&lt;br /&gt;
			for j in res:&lt;br /&gt;
				l1.pop(l1.index(j))&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def hashcontroltoMajorTom(a=dictremsa()):#fa in modo che vengano &amp;quot;hashate&amp;quot; solo delle liste di file che abbiano passato il &amp;quot;stessadimenzione&amp;quot; test&lt;br /&gt;
	hasher = hashlib.md5()&lt;br /&gt;
	try:&lt;br /&gt;
		obviouslyequal = a.pop(0)&lt;br /&gt;
		print(&amp;quot;i seguenti file hanno lo stesso contenuto... NULLA!!!!!:\n&amp;quot;)&lt;br /&gt;
		for oe in obviouslyequal:&lt;br /&gt;
			print(&amp;quot;{0}&amp;quot;.format(oe))&lt;br /&gt;
	except KeyError:pass&lt;br /&gt;
	values = list(a.values())&lt;br /&gt;
	print(&amp;quot;\ni seguenti file contengono qualcosa ma sono uguali:\n&amp;quot;)&lt;br /&gt;
	for namelist in values:&lt;br /&gt;
		hashcontrolinsl(namelist)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hashcontroltoMajorTom()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
==Bash==&lt;br /&gt;
Qualche idea per Bash...&amp;lt;br/&amp;gt;&lt;br /&gt;
Si potrebbero usare:&amp;lt;br/&amp;gt;&lt;br /&gt;
Per la dimensione in byte dei &amp;lt;file&amp;gt;:&lt;br /&gt;
 fileSize=$(stat --format=%s &amp;lt;file&amp;gt;)&lt;br /&gt;
Per avere l'output del solo hash md5 (senza l'ausilio di altri comandi):&lt;br /&gt;
 fileHashMd5=$(md5sum &amp;lt;file&amp;gt; | while read fileHash fileName; do echo $fileHash; done)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#Fede&amp;amp;Alessio#&lt;br /&gt;
for file in *; do&lt;br /&gt;
	if [[ -f &amp;quot;$file&amp;quot; ]] ; then&lt;br /&gt;
		filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
		for file2 in *; do&lt;br /&gt;
			if [[ -f &amp;quot;$file2&amp;quot; ]] ; then&lt;br /&gt;
				if [[ &amp;quot;$file&amp;quot; = &amp;quot;$file2&amp;quot; ]]; then &lt;br /&gt;
					continue&lt;br /&gt;
				fi&lt;br /&gt;
				filesize2=$(stat -c%s &amp;quot;$file2&amp;quot;)&lt;br /&gt;
				if [[ $filesize -eq $filesize2 ]]; then&lt;br /&gt;
					diff &amp;quot;$file&amp;quot; &amp;quot;$file2&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;&amp;quot;$file&amp;quot; == &amp;quot;$file2&amp;quot;&amp;quot;  ###&lt;br /&gt;
				fi&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
#Purtroppo non siamo riusciti a finire e abbiamo optato per una soluzione poco efficiente con un diff, poi continueremo per rendarlà un po migliore&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.06.21&amp;diff=396</id>
		<title>ProvaPratica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.06.21&amp;diff=396"/>
		<updated>2013-12-15T14:30:23Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Esercizio 1 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
20 giugno 2013&lt;br /&gt;
Esercizio 1&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.06.21.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Comparison function for iNode&lt;br /&gt;
 * Input:    2 dirent pointers&lt;br /&gt;
 * Output:&lt;br /&gt;
 *           1,   if iNode[a] &amp;gt; iNode[b]&lt;br /&gt;
 * 	     0,   if iNode[a] == iNode[b]&lt;br /&gt;
 * 	    -1,   else */&lt;br /&gt;
int iNodeComparison(const struct dirent **a, const struct dirent **b)&lt;br /&gt;
{&lt;br /&gt;
    long iNodeA = (long)(*a)-&amp;gt;d_ino;&lt;br /&gt;
    long iNodeB = (long)(*b)-&amp;gt;d_ino;&lt;br /&gt;
    return (iNodeA &amp;gt; iNodeB) - (iNodeA &amp;lt; iNodeB);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Scan a directory -&amp;gt;&lt;br /&gt;
 * Order the entries by iNode number -&amp;gt;&lt;br /&gt;
 * Print name and iNode of each file. */&lt;br /&gt;
void scanDirectory(char *dir)&lt;br /&gt;
{&lt;br /&gt;
    int result, iterator;&lt;br /&gt;
    struct dirent **files;&lt;br /&gt;
&lt;br /&gt;
    result = scandir(dir, &amp;amp;files, NULL, iNodeComparison);&lt;br /&gt;
&lt;br /&gt;
    // Check if any errors occurred&lt;br /&gt;
    if (result &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        perror(&amp;quot;scandir()&amp;quot;);&lt;br /&gt;
	exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Loop through directory entries&lt;br /&gt;
    for(iterator = 0; iterator &amp;lt; result; iterator++)&lt;br /&gt;
    {&lt;br /&gt;
	printf(&amp;quot;%s/%s %li\n&amp;quot;, dir, files[iterator]-&amp;gt;d_name, (long)files[iterator]-&amp;gt;d_ino);&lt;br /&gt;
&lt;br /&gt;
	// Garbage collection&lt;br /&gt;
	free(files[iterator]);&lt;br /&gt;
    }&lt;br /&gt;
    free(files);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Entry point&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    char cwd[1024];&lt;br /&gt;
&lt;br /&gt;
    // if (number of parameters&lt;br /&gt;
    switch(argc)&lt;br /&gt;
    {&lt;br /&gt;
    	// == 0) =&amp;gt; Use the current directory&lt;br /&gt;
    	case 1:&lt;br /&gt;
    	    if (!getcwd(cwd, sizeof(cwd)))&lt;br /&gt;
    	    {&lt;br /&gt;
    		perror(&amp;quot;getcwd()&amp;quot;);&lt;br /&gt;
    		exit(EXIT_FAILURE);&lt;br /&gt;
    	    }&lt;br /&gt;
    	    scanDirectory(cwd);&lt;br /&gt;
    	    exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
    	// == 1) =&amp;gt; Use the given directory&lt;br /&gt;
    	case 2:&lt;br /&gt;
    	    scanDirectory(argv[1]);&lt;br /&gt;
    	    exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
    	// &amp;gt; 1) =&amp;gt; Wrong input&lt;br /&gt;
    	default:&lt;br /&gt;
    	    printf(&amp;quot;The function requires 0 or 1 parameters.\n&amp;quot;);&lt;br /&gt;
    	    exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
La mia versione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*Scrivere un programma che stampi il numero di inode di ogni file presente in una direcotory passata come argomento (o della&lt;br /&gt;
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.&lt;br /&gt;
Es:&lt;br /&gt;
$ lsino demo&lt;br /&gt;
demo/. 1972484&lt;br /&gt;
demo/.. 1971834&lt;br /&gt;
demo/1.c 1972528&lt;br /&gt;
demo/a.out 1972485&lt;br /&gt;
demo/l1 1972486&lt;br /&gt;
demo/l2 1972486&lt;br /&gt;
demo/l3 1972486&lt;br /&gt;
demo/link.c 1972528*/&lt;br /&gt;
&lt;br /&gt;
#define _SVID_SOURCE&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	struct stat sb;&lt;br /&gt;
	char cwd[1024];&lt;br /&gt;
	struct dirent **namelist;&lt;br /&gt;
	int n; /*valore di ritorno di scandir*/&lt;br /&gt;
	int i=0;&lt;br /&gt;
		&lt;br /&gt;
	if(argc&amp;gt;1){ /*se la directory e' stata data in input*/&lt;br /&gt;
		strcpy(cwd,argv[1]);&lt;br /&gt;
		}	&lt;br /&gt;
	else{ /*se la directory non viene data in input*/&lt;br /&gt;
		getcwd(cwd, sizeof(cwd));&lt;br /&gt;
	}&lt;br /&gt;
	/*ora dentro cwd c'è la cartella interessata*/&lt;br /&gt;
	&lt;br /&gt;
	n = scandir(cwd, &amp;amp;namelist, NULL, alphasort);&lt;br /&gt;
	&lt;br /&gt;
	if(n&amp;lt;0)&lt;br /&gt;
		perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
	else {&lt;br /&gt;
		while (i&amp;lt;n) {&lt;br /&gt;
			printf(&amp;quot;%s/%s %ld\n&amp;quot;, cwd,namelist[i]-&amp;gt;d_name,(long)namelist[i]-&amp;gt;d_ino);&lt;br /&gt;
			free(namelist[i]);&lt;br /&gt;
			i++;&lt;br /&gt;
	    }&lt;br /&gt;
	free(namelist);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Non mi è chiara una cosa: nel testo specifica &amp;quot;stampi l'elenco in ordine crescente di numero di i-node&amp;quot;, tuttavia nell'esempio sono ordinati grazie a quella che penso sia l'alphasort e quindi è la soluzione che ho sviluppato io.&lt;br /&gt;
Giulia N.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 3 ==&lt;br /&gt;
&lt;br /&gt;
[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
20 giugno 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.06.21.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys, hashlib&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 1:&lt;br /&gt;
        print(&amp;quot;The function does not require arguments to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file size - [file name]}&lt;br /&gt;
    sameSize = { }&lt;br /&gt;
    PopulateSameSize(sameSize)&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {MD5 hash - [file name]}&lt;br /&gt;
    sameContent = { }&lt;br /&gt;
    for filePaths in sorted(sameSize.values(), key = len, reverse = True):&lt;br /&gt;
        # No files with same size =&amp;gt; No files with same content&lt;br /&gt;
        if len(filePaths) &amp;lt; 2: break&lt;br /&gt;
        PopulateSameContent(filePaths, sameContent)&lt;br /&gt;
&lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(sameContent)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Done!&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
# Populate a dictionary with key-value pair {file size - [file name]}&lt;br /&gt;
def PopulateSameSize(sameSize):&lt;br /&gt;
    for dirPath, _, fileNames in os.walk(os.getcwd()):&lt;br /&gt;
        for fileName in fileNames:&lt;br /&gt;
            filePath = os.path.join(dirPath, fileName)&lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            sameSize[fileSize] = sameSize.get(fileSize, []) + [filePath]  &lt;br /&gt;
 &lt;br /&gt;
# Populate a dictionary with key-value pair {MD5 hash - [file name]}&lt;br /&gt;
def PopulateSameContent(filePaths, sameContent):&lt;br /&gt;
    for filePath in filePaths:&lt;br /&gt;
        md5 = GetMd5Hash(filePath)&lt;br /&gt;
        fileRelPath = os.path.relpath(filePath, os.getcwd())&lt;br /&gt;
        sameContent[md5] = sameContent.get(md5, []) + [fileRelPath]&lt;br /&gt;
&lt;br /&gt;
# Get the MD5 hash without loading the whole file to memory&lt;br /&gt;
# Break the file in chunks whose size is a multiple of 128&lt;br /&gt;
# This takes advantage of the fact that MD5 has 128-byte digest blocks&lt;br /&gt;
def GetMd5Hash(filePath, blockSize = 2 ** 20):&lt;br /&gt;
    digest = hashlib.md5()&lt;br /&gt;
    with open(filePath, &amp;quot;rb&amp;quot;) as file:&lt;br /&gt;
        for chunk in iter(lambda: file.read(blockSize), b''): &lt;br /&gt;
            digest.update(chunk)&lt;br /&gt;
    return digest.hexdigest()&lt;br /&gt;
&lt;br /&gt;
# Printout the lists of files having same content&lt;br /&gt;
def PrintResults(sameContent):&lt;br /&gt;
    print(&amp;quot;Lists of files having same content:&amp;quot;)&lt;br /&gt;
    for files in sorted(sameContent.values(), key = len, reverse = True):&lt;br /&gt;
        if len(files) &amp;lt; 2: break&lt;br /&gt;
        print(&amp;quot;[{0}]&amp;quot;.format(&amp;quot;, &amp;quot;.join(file for file in files)))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ecco la mia versione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, hashlib&lt;br /&gt;
&lt;br /&gt;
def fileCurrDir():#restituisce una lista res di file presenti nella directory&lt;br /&gt;
	fcd = os.listdir('.')&lt;br /&gt;
	res = []&lt;br /&gt;
	for ott in fcd:&lt;br /&gt;
		if os.path.isfile('{0}'.format(ott)):res.append(ott)&lt;br /&gt;
		else:continue&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def dictsize(fl=fileCurrDir()):#restituisce un dizionario con key filesize e value lista di filenames aventi size di filesize&lt;br /&gt;
	res = {}&lt;br /&gt;
	for f in fl:&lt;br /&gt;
		if os.path.getsize('{0}'.format(f)) in list(res.keys()):res[os.path.getsize('{0}'.format(f))].append(f);continue&lt;br /&gt;
		else:pass&lt;br /&gt;
		res[os.path.getsize('{0}'.format(f))] = list()&lt;br /&gt;
		res[os.path.getsize('{0}'.format(f))].append(f)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def dictremsa(a=dictsize()):#data un dizionario key::list rimuove tutti gli item la cui len di lista sia unitaria&lt;br /&gt;
	tmp = list(a.keys())&lt;br /&gt;
	for tmpkey in tmp:&lt;br /&gt;
		if len(a[tmpkey]) &amp;lt; 2: a.pop(tmpkey)&lt;br /&gt;
		else:continue&lt;br /&gt;
	return a&lt;br /&gt;
&lt;br /&gt;
def hashcontrolinsl(l1): #data una lista di nomi di file compara l hash di tutte le possibili coppie dentro 	l1&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		toTest = l1.pop()&lt;br /&gt;
		del res[:]&lt;br /&gt;
		res.append(toTest)&lt;br /&gt;
		for tmp in l1:&lt;br /&gt;
			#res.append(list[toTest,tmp])&lt;br /&gt;
	#return res&lt;br /&gt;
			hasher = hashlib.md5()&lt;br /&gt;
			hasher2 = hashlib.md5()&lt;br /&gt;
			f = open('{0}'.format(toTest), 'rb')&lt;br /&gt;
			toHash = f.read()&lt;br /&gt;
			hasher.update(toHash)&lt;br /&gt;
			toTesthash = hasher.hexdigest()&lt;br /&gt;
			f.close()&lt;br /&gt;
			f = open('{0}'.format(tmp), 'rb')&lt;br /&gt;
			toHash2 = f.read()&lt;br /&gt;
			hasher2.update(toHash2)&lt;br /&gt;
			tmphash = hasher2.hexdigest()&lt;br /&gt;
			if tmphash==toTesthash: #print('{0} e {1}  sono uguali\n'.format(toTest,tmp))&lt;br /&gt;
				res.append(tmp)&lt;br /&gt;
			else:continue&lt;br /&gt;
		if len(res)&amp;gt;1: &lt;br /&gt;
			print(res);res.pop(0)&lt;br /&gt;
			for j in res:&lt;br /&gt;
				l1.pop(l1.index(j))&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def hashcontroltoMajorTom(a=dictremsa()):#fa in modo che vengano &amp;quot;hashate&amp;quot; solo delle liste di file che abbiano passato il &amp;quot;stessadimenzione&amp;quot; test&lt;br /&gt;
	hasher = hashlib.md5()&lt;br /&gt;
	try:&lt;br /&gt;
		obviouslyequal = a.pop(0)&lt;br /&gt;
		print(&amp;quot;i seguenti file hanno lo stesso contenuto... NULLA!!!!!:\n&amp;quot;)&lt;br /&gt;
		for oe in obviouslyequal:&lt;br /&gt;
			print(&amp;quot;{0}&amp;quot;.format(oe))&lt;br /&gt;
	except KeyError:pass&lt;br /&gt;
	values = list(a.values())&lt;br /&gt;
	print(&amp;quot;\ni seguenti file contengono qualcosa ma sono uguali:\n&amp;quot;)&lt;br /&gt;
	for namelist in values:&lt;br /&gt;
		hashcontrolinsl(namelist)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hashcontroltoMajorTom()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
==Bash==&lt;br /&gt;
Qualche idea per Bash...&amp;lt;br/&amp;gt;&lt;br /&gt;
Si potrebbero usare:&amp;lt;br/&amp;gt;&lt;br /&gt;
Per la dimensione in byte dei &amp;lt;file&amp;gt;:&lt;br /&gt;
 fileSize=$(stat --format=%s &amp;lt;file&amp;gt;)&lt;br /&gt;
Per avere l'output del solo hash md5 (senza l'ausilio di altri comandi):&lt;br /&gt;
 fileHashMd5=$(md5sum &amp;lt;file&amp;gt; | while read fileHash fileName; do echo $fileHash; done)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#Fede&amp;amp;Alessio#&lt;br /&gt;
for file in *; do&lt;br /&gt;
	if [[ -f &amp;quot;$file&amp;quot; ]] ; then&lt;br /&gt;
		filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
		for file2 in *; do&lt;br /&gt;
			if [[ -f &amp;quot;$file2&amp;quot; ]] ; then&lt;br /&gt;
				if [[ &amp;quot;$file&amp;quot; = &amp;quot;$file2&amp;quot; ]]; then &lt;br /&gt;
					continue&lt;br /&gt;
				fi&lt;br /&gt;
				filesize2=$(stat -c%s &amp;quot;$file2&amp;quot;)&lt;br /&gt;
				if [[ $filesize -eq $filesize2 ]]; then&lt;br /&gt;
					diff &amp;quot;$file&amp;quot; &amp;quot;$file2&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;&amp;quot;$file&amp;quot; == &amp;quot;$file2&amp;quot;&amp;quot;  ###&lt;br /&gt;
				fi&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
#Purtroppo non siamo riusciti a finire e abbiamo optato per una soluzione poco efficiente con un diff, poi continueremo per rendarlà un po migliore&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.06.21&amp;diff=395</id>
		<title>ProvaPratica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.06.21&amp;diff=395"/>
		<updated>2013-12-15T14:27:20Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Esercizio 1 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
20 giugno 2013&lt;br /&gt;
Esercizio 1&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.06.21.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Comparison function for iNode&lt;br /&gt;
 * Input:    2 dirent pointers&lt;br /&gt;
 * Output:&lt;br /&gt;
 *           1,   if iNode[a] &amp;gt; iNode[b]&lt;br /&gt;
 * 	     0,   if iNode[a] == iNode[b]&lt;br /&gt;
 * 	    -1,   else */&lt;br /&gt;
int iNodeComparison(const struct dirent **a, const struct dirent **b)&lt;br /&gt;
{&lt;br /&gt;
    long iNodeA = (long)(*a)-&amp;gt;d_ino;&lt;br /&gt;
    long iNodeB = (long)(*b)-&amp;gt;d_ino;&lt;br /&gt;
    return (iNodeA &amp;gt; iNodeB) - (iNodeA &amp;lt; iNodeB);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Scan a directory -&amp;gt;&lt;br /&gt;
 * Order the entries by iNode number -&amp;gt;&lt;br /&gt;
 * Print name and iNode of each file. */&lt;br /&gt;
void scanDirectory(char *dir)&lt;br /&gt;
{&lt;br /&gt;
    int result, iterator;&lt;br /&gt;
    struct dirent **files;&lt;br /&gt;
&lt;br /&gt;
    result = scandir(dir, &amp;amp;files, NULL, iNodeComparison);&lt;br /&gt;
&lt;br /&gt;
    // Check if any errors occurred&lt;br /&gt;
    if (result &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        perror(&amp;quot;scandir()&amp;quot;);&lt;br /&gt;
	exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Loop through directory entries&lt;br /&gt;
    for(iterator = 0; iterator &amp;lt; result; iterator++)&lt;br /&gt;
    {&lt;br /&gt;
	printf(&amp;quot;%s/%s %li\n&amp;quot;, dir, files[iterator]-&amp;gt;d_name, (long)files[iterator]-&amp;gt;d_ino);&lt;br /&gt;
&lt;br /&gt;
	// Garbage collection&lt;br /&gt;
	free(files[iterator]);&lt;br /&gt;
    }&lt;br /&gt;
    free(files);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Entry point&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    char cwd[1024];&lt;br /&gt;
&lt;br /&gt;
    // if (number of parameters&lt;br /&gt;
    switch(argc)&lt;br /&gt;
    {&lt;br /&gt;
    	// == 0) =&amp;gt; Use the current directory&lt;br /&gt;
    	case 1:&lt;br /&gt;
    	    if (!getcwd(cwd, sizeof(cwd)))&lt;br /&gt;
    	    {&lt;br /&gt;
    		perror(&amp;quot;getcwd()&amp;quot;);&lt;br /&gt;
    		exit(EXIT_FAILURE);&lt;br /&gt;
    	    }&lt;br /&gt;
    	    scanDirectory(cwd);&lt;br /&gt;
    	    exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
    	// == 1) =&amp;gt; Use the given directory&lt;br /&gt;
    	case 2:&lt;br /&gt;
    	    scanDirectory(argv[1]);&lt;br /&gt;
    	    exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
    	// &amp;gt; 1) =&amp;gt; Wrong input&lt;br /&gt;
    	default:&lt;br /&gt;
    	    printf(&amp;quot;The function requires 0 or 1 parameters.\n&amp;quot;);&lt;br /&gt;
    	    exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mia versione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*Scrivere un programma che stampi il numero di inode di ogni file presente in una direcotory passata come argomento (o della&lt;br /&gt;
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.&lt;br /&gt;
Es:&lt;br /&gt;
$ lsino demo&lt;br /&gt;
demo/. 1972484&lt;br /&gt;
demo/.. 1971834&lt;br /&gt;
demo/1.c 1972528&lt;br /&gt;
demo/a.out 1972485&lt;br /&gt;
demo/l1 1972486&lt;br /&gt;
demo/l2 1972486&lt;br /&gt;
demo/l3 1972486&lt;br /&gt;
demo/link.c 1972528*/&lt;br /&gt;
&lt;br /&gt;
#define _SVID_SOURCE&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	struct stat sb;&lt;br /&gt;
	char cwd[1024];&lt;br /&gt;
	struct dirent **namelist;&lt;br /&gt;
	int n; /*valore di ritorno di scandir*/&lt;br /&gt;
	int i=0;&lt;br /&gt;
		&lt;br /&gt;
	if(argc&amp;gt;1){ /*se la directory e' stata data in input*/&lt;br /&gt;
		strcpy(cwd,argv[1]);&lt;br /&gt;
		}	&lt;br /&gt;
	else{ /*se la directory non viene data in input*/&lt;br /&gt;
		getcwd(cwd, sizeof(cwd));&lt;br /&gt;
	}&lt;br /&gt;
	/*ora dentro cwd c'è la cartella interessata*/&lt;br /&gt;
	&lt;br /&gt;
	n = scandir(cwd, &amp;amp;namelist, NULL, alphasort);&lt;br /&gt;
	&lt;br /&gt;
	if(n&amp;lt;0)&lt;br /&gt;
		perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
	else {&lt;br /&gt;
		while (i&amp;lt;n) {&lt;br /&gt;
			printf(&amp;quot;%s/%s %ld\n&amp;quot;, cwd,namelist[i]-&amp;gt;d_name,(long)namelist[i]-&amp;gt;d_ino);&lt;br /&gt;
			free(namelist[i]);&lt;br /&gt;
			i++;&lt;br /&gt;
	    }&lt;br /&gt;
	free(namelist);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Non mi è chiara una cosa: nel testo specifica &amp;quot;stampi l'elenco in ordine crescente di numero di i-node&amp;quot;, tuttavia nell'esempio sono ordinati grazie a quella che penso sia l'alphasort e quindi è la soluzione che ho sviluppato io.&lt;br /&gt;
Giulia N.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 3 ==&lt;br /&gt;
&lt;br /&gt;
[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
20 giugno 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.06.21.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys, hashlib&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 1:&lt;br /&gt;
        print(&amp;quot;The function does not require arguments to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file size - [file name]}&lt;br /&gt;
    sameSize = { }&lt;br /&gt;
    PopulateSameSize(sameSize)&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {MD5 hash - [file name]}&lt;br /&gt;
    sameContent = { }&lt;br /&gt;
    for filePaths in sorted(sameSize.values(), key = len, reverse = True):&lt;br /&gt;
        # No files with same size =&amp;gt; No files with same content&lt;br /&gt;
        if len(filePaths) &amp;lt; 2: break&lt;br /&gt;
        PopulateSameContent(filePaths, sameContent)&lt;br /&gt;
&lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(sameContent)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Done!&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
# Populate a dictionary with key-value pair {file size - [file name]}&lt;br /&gt;
def PopulateSameSize(sameSize):&lt;br /&gt;
    for dirPath, _, fileNames in os.walk(os.getcwd()):&lt;br /&gt;
        for fileName in fileNames:&lt;br /&gt;
            filePath = os.path.join(dirPath, fileName)&lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            sameSize[fileSize] = sameSize.get(fileSize, []) + [filePath]  &lt;br /&gt;
 &lt;br /&gt;
# Populate a dictionary with key-value pair {MD5 hash - [file name]}&lt;br /&gt;
def PopulateSameContent(filePaths, sameContent):&lt;br /&gt;
    for filePath in filePaths:&lt;br /&gt;
        md5 = GetMd5Hash(filePath)&lt;br /&gt;
        fileRelPath = os.path.relpath(filePath, os.getcwd())&lt;br /&gt;
        sameContent[md5] = sameContent.get(md5, []) + [fileRelPath]&lt;br /&gt;
&lt;br /&gt;
# Get the MD5 hash without loading the whole file to memory&lt;br /&gt;
# Break the file in chunks whose size is a multiple of 128&lt;br /&gt;
# This takes advantage of the fact that MD5 has 128-byte digest blocks&lt;br /&gt;
def GetMd5Hash(filePath, blockSize = 2 ** 20):&lt;br /&gt;
    digest = hashlib.md5()&lt;br /&gt;
    with open(filePath, &amp;quot;rb&amp;quot;) as file:&lt;br /&gt;
        for chunk in iter(lambda: file.read(blockSize), b''): &lt;br /&gt;
            digest.update(chunk)&lt;br /&gt;
    return digest.hexdigest()&lt;br /&gt;
&lt;br /&gt;
# Printout the lists of files having same content&lt;br /&gt;
def PrintResults(sameContent):&lt;br /&gt;
    print(&amp;quot;Lists of files having same content:&amp;quot;)&lt;br /&gt;
    for files in sorted(sameContent.values(), key = len, reverse = True):&lt;br /&gt;
        if len(files) &amp;lt; 2: break&lt;br /&gt;
        print(&amp;quot;[{0}]&amp;quot;.format(&amp;quot;, &amp;quot;.join(file for file in files)))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ecco la mia versione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, hashlib&lt;br /&gt;
&lt;br /&gt;
def fileCurrDir():#restituisce una lista res di file presenti nella directory&lt;br /&gt;
	fcd = os.listdir('.')&lt;br /&gt;
	res = []&lt;br /&gt;
	for ott in fcd:&lt;br /&gt;
		if os.path.isfile('{0}'.format(ott)):res.append(ott)&lt;br /&gt;
		else:continue&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def dictsize(fl=fileCurrDir()):#restituisce un dizionario con key filesize e value lista di filenames aventi size di filesize&lt;br /&gt;
	res = {}&lt;br /&gt;
	for f in fl:&lt;br /&gt;
		if os.path.getsize('{0}'.format(f)) in list(res.keys()):res[os.path.getsize('{0}'.format(f))].append(f);continue&lt;br /&gt;
		else:pass&lt;br /&gt;
		res[os.path.getsize('{0}'.format(f))] = list()&lt;br /&gt;
		res[os.path.getsize('{0}'.format(f))].append(f)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def dictremsa(a=dictsize()):#data un dizionario key::list rimuove tutti gli item la cui len di lista sia unitaria&lt;br /&gt;
	tmp = list(a.keys())&lt;br /&gt;
	for tmpkey in tmp:&lt;br /&gt;
		if len(a[tmpkey]) &amp;lt; 2: a.pop(tmpkey)&lt;br /&gt;
		else:continue&lt;br /&gt;
	return a&lt;br /&gt;
&lt;br /&gt;
def hashcontrolinsl(l1): #data una lista di nomi di file compara l hash di tutte le possibili coppie dentro 	l1&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		toTest = l1.pop()&lt;br /&gt;
		del res[:]&lt;br /&gt;
		res.append(toTest)&lt;br /&gt;
		for tmp in l1:&lt;br /&gt;
			#res.append(list[toTest,tmp])&lt;br /&gt;
	#return res&lt;br /&gt;
			hasher = hashlib.md5()&lt;br /&gt;
			hasher2 = hashlib.md5()&lt;br /&gt;
			f = open('{0}'.format(toTest), 'rb')&lt;br /&gt;
			toHash = f.read()&lt;br /&gt;
			hasher.update(toHash)&lt;br /&gt;
			toTesthash = hasher.hexdigest()&lt;br /&gt;
			f.close()&lt;br /&gt;
			f = open('{0}'.format(tmp), 'rb')&lt;br /&gt;
			toHash2 = f.read()&lt;br /&gt;
			hasher2.update(toHash2)&lt;br /&gt;
			tmphash = hasher2.hexdigest()&lt;br /&gt;
			if tmphash==toTesthash: #print('{0} e {1}  sono uguali\n'.format(toTest,tmp))&lt;br /&gt;
				res.append(tmp)&lt;br /&gt;
			else:continue&lt;br /&gt;
		if len(res)&amp;gt;1: &lt;br /&gt;
			print(res);res.pop(0)&lt;br /&gt;
			for j in res:&lt;br /&gt;
				l1.pop(l1.index(j))&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def hashcontroltoMajorTom(a=dictremsa()):#fa in modo che vengano &amp;quot;hashate&amp;quot; solo delle liste di file che abbiano passato il &amp;quot;stessadimenzione&amp;quot; test&lt;br /&gt;
	hasher = hashlib.md5()&lt;br /&gt;
	try:&lt;br /&gt;
		obviouslyequal = a.pop(0)&lt;br /&gt;
		print(&amp;quot;i seguenti file hanno lo stesso contenuto... NULLA!!!!!:\n&amp;quot;)&lt;br /&gt;
		for oe in obviouslyequal:&lt;br /&gt;
			print(&amp;quot;{0}&amp;quot;.format(oe))&lt;br /&gt;
	except KeyError:pass&lt;br /&gt;
	values = list(a.values())&lt;br /&gt;
	print(&amp;quot;\ni seguenti file contengono qualcosa ma sono uguali:\n&amp;quot;)&lt;br /&gt;
	for namelist in values:&lt;br /&gt;
		hashcontrolinsl(namelist)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hashcontroltoMajorTom()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
==Bash==&lt;br /&gt;
Qualche idea per Bash...&amp;lt;br/&amp;gt;&lt;br /&gt;
Si potrebbero usare:&amp;lt;br/&amp;gt;&lt;br /&gt;
Per la dimensione in byte dei &amp;lt;file&amp;gt;:&lt;br /&gt;
 fileSize=$(stat --format=%s &amp;lt;file&amp;gt;)&lt;br /&gt;
Per avere l'output del solo hash md5 (senza l'ausilio di altri comandi):&lt;br /&gt;
 fileHashMd5=$(md5sum &amp;lt;file&amp;gt; | while read fileHash fileName; do echo $fileHash; done)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#Fede&amp;amp;Alessio#&lt;br /&gt;
for file in *; do&lt;br /&gt;
	if [[ -f &amp;quot;$file&amp;quot; ]] ; then&lt;br /&gt;
		filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
		for file2 in *; do&lt;br /&gt;
			if [[ -f &amp;quot;$file2&amp;quot; ]] ; then&lt;br /&gt;
				if [[ &amp;quot;$file&amp;quot; = &amp;quot;$file2&amp;quot; ]]; then &lt;br /&gt;
					continue&lt;br /&gt;
				fi&lt;br /&gt;
				filesize2=$(stat -c%s &amp;quot;$file2&amp;quot;)&lt;br /&gt;
				if [[ $filesize -eq $filesize2 ]]; then&lt;br /&gt;
					diff &amp;quot;$file&amp;quot; &amp;quot;$file2&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;&amp;quot;$file&amp;quot; == &amp;quot;$file2&amp;quot;&amp;quot;  ###&lt;br /&gt;
				fi&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
#Purtroppo non siamo riusciti a finire e abbiamo optato per una soluzione poco efficiente con un diff, poi continueremo per rendarlà un po migliore&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=353</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=353"/>
		<updated>2013-11-25T21:11:41Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				read(0,buf1,sizeof(buf1)); /*0 indica lo standard input*/&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=352</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=352"/>
		<updated>2013-11-25T21:07:24Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				scanf(&amp;quot;%s&amp;quot;,buf1);&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=351</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=351"/>
		<updated>2013-11-25T21:07:10Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i,ris;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				scanf(&amp;quot;%s&amp;quot;,buf1);&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=350</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=350"/>
		<updated>2013-11-25T21:05:39Z</updated>

		<summary type="html">&lt;p&gt;GiuliaN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i,ris;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				scanf(&amp;quot;%s&amp;quot;,buf1);&lt;br /&gt;
				ris = write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			ris = read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;/div&gt;</summary>
		<author><name>GiuliaN</name></author>
	</entry>
</feed>