<?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=MidoloM</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=MidoloM"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/MidoloM"/>
	<updated>2026-04-30T05:42:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=698</id>
		<title>Prova Teorica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=698"/>
		<updated>2014-05-08T10:10:52Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.06.21.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[http://so.v2.cs.unibo.it/wiki/images/0/02/G1paginazione.jpg soluzione]]&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio c.2 &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Casi possibili delle iterazioni&lt;br /&gt;
int val = 0&lt;br /&gt;
&lt;br /&gt;
PQPQQ (((val +1) *2) +1) * 2 * 2	→ 	12&lt;br /&gt;
PQQPQ (( val +1 ) * 2 * 2) +1 * 2	→	12&lt;br /&gt;
QQPQP (((val * 2 * 2) + 1 )* 2) + 1	→	3&lt;br /&gt;
QPQQP (((val * 2) + 1) * 2 * 2) + 1	→	5&lt;br /&gt;
QPQPQ ((((val * 2) + 1) * 2) + 1) * 2	→	6&lt;br /&gt;
&lt;br /&gt;
a) 	#Quindi i valori possibili sono → (3, 5, 6, 12)&lt;br /&gt;
b)	#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo e Marangoni&lt;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=697</id>
		<title>Prova Teorica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=697"/>
		<updated>2014-05-08T10:10:36Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.06.21.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[http://so.v2.cs.unibo.it/wiki/images/0/02/G1paginazione.jpg soluzione]]&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio c.2 &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Casi possibili delle interazioni&lt;br /&gt;
int val = 0&lt;br /&gt;
&lt;br /&gt;
PQPQQ (((val +1) *2) +1) * 2 * 2	→ 	12&lt;br /&gt;
PQQPQ (( val +1 ) * 2 * 2) +1 * 2	→	12&lt;br /&gt;
QQPQP (((val * 2 * 2) + 1 )* 2) + 1	→	3&lt;br /&gt;
QPQQP (((val * 2) + 1) * 2 * 2) + 1	→	5&lt;br /&gt;
QPQPQ ((((val * 2) + 1) * 2) + 1) * 2	→	6&lt;br /&gt;
&lt;br /&gt;
a) 	#Quindi i valori possibili sono → (3, 5, 6, 12)&lt;br /&gt;
b)	#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo e Marangoni&lt;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=696</id>
		<title>Prova Teorica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=696"/>
		<updated>2014-05-08T10:08:36Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.06.21.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[http://so.v2.cs.unibo.it/wiki/images/0/02/G1paginazione.jpg soluzione]]&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio c.2 &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Casi possibili delle interazioni&lt;br /&gt;
int val = 0&lt;br /&gt;
&lt;br /&gt;
PQPQQ (((val +1) *2) +1) * 2 * 2	→ 	12&lt;br /&gt;
PQQPQ (( val +1 ) * 2 * 2) +1 * 2	→	12&lt;br /&gt;
QQPQP (((val * 2 * 2) + 1 )* 2) + 1	→	11&lt;br /&gt;
QPQQP (((val * 2) + 1) * 2 * 2) + 1	→	13&lt;br /&gt;
QPQPQ ((((val * 2) + 1) * 2) + 1) * 2	→	14&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a) 	#Quindi i valori possibili sono → (11, 12, 13, 14)&lt;br /&gt;
b)	#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo e Marangoni&lt;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=695</id>
		<title>Prova Teorica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=695"/>
		<updated>2014-05-08T10:08:13Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.06.21.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[http://so.v2.cs.unibo.it/wiki/images/0/02/G1paginazione.jpg soluzione]]&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio c.2 &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Casi possibili delle interazioni&lt;br /&gt;
&lt;br /&gt;
PQPQQ (((val +1) *2) +1) * 2 * 2	→ 	12&lt;br /&gt;
PQQPQ (( val +1 ) * 2 * 2) +1 * 2	→	12&lt;br /&gt;
QQPQP (((val * 2 * 2) + 1 )* 2) + 1	→	11&lt;br /&gt;
QPQQP (((val * 2) + 1) * 2 * 2) + 1	→	13&lt;br /&gt;
QPQPQ ((((val * 2) + 1) * 2) + 1) * 2	→	14&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a) 	#Quindi i valori possibili sono → (11, 12, 13, 14)&lt;br /&gt;
b)	#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo e Marangoni&lt;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=694</id>
		<title>Prova Teorica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=694"/>
		<updated>2014-05-08T10:07:47Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.06.21.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[http://so.v2.cs.unibo.it/wiki/images/0/02/G1paginazione.jpg soluzione]]&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio c.2 &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#casi possibili dei processi con risultato&lt;br /&gt;
&lt;br /&gt;
PQPQQ (((val +1) *2) +1) * 2 * 2	→ 	12&lt;br /&gt;
PQQPQ (( val +1 ) * 2 * 2) +1 * 2	→	12&lt;br /&gt;
QQPQP (((val * 2 * 2) + 1 )* 2) + 1	→	11&lt;br /&gt;
QPQQP (((val * 2) + 1) * 2 * 2) + 1	→	13&lt;br /&gt;
QPQPQ ((((val * 2) + 1) * 2) + 1) * 2	→	14&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a) 	#Quindi i valori possibili sono → (11, 12, 13, 14)&lt;br /&gt;
b)	#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo e Marangoni&lt;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=693</id>
		<title>Prova Teorica 2013.06.21</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=693"/>
		<updated>2014-05-08T10:06:43Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.06.21.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[http://so.v2.cs.unibo.it/wiki/images/0/02/G1paginazione.jpg soluzione]]&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio c.2 &amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#casi possibili dei processi con risultato&lt;br /&gt;
&lt;br /&gt;
PQPQQ (((val +1) *2) +1) * 2 * 2	→ 	12&lt;br /&gt;
PQQPQ (( val +1 ) * 2 * 2) +1 * 2	→	12&lt;br /&gt;
QQPQP (((val * 2 * 2) + 1 )* 2) + 1	→	11&lt;br /&gt;
QPQQP (((val * 2) + 1) * 2 * 2) + 1	→	13&lt;br /&gt;
QPQPQ ((((val * 2) + 1) * 2) + 1) * 2	→	14&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a) 	#Quindi i valori possibili sono → (11, 12, 13, 14)&lt;br /&gt;
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&amp;gt;&lt;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=536</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=536"/>
		<updated>2014-04-01T11:37:45Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
		running=false;&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Berna3.14&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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=534</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=534"/>
		<updated>2014-04-01T10:01:59Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
&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;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=533</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=533"/>
		<updated>2014-04-01T09:59:33Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
&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 waits = 0;&lt;br /&gt;
	int running = 0;&lt;br /&gt;
&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0 || waits !=0 ) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			waits++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			waits--;&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;
		if(waits != 0) {&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;
					waits++;&lt;br /&gt;
					oktogo[prio].wait;&lt;br /&gt;
					waits--;&lt;br /&gt;
					wait[prio]--;&lt;br /&gt;
					break();&lt;br /&gt;
				}&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;
		if(waits != 0) {&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;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=511</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=511"/>
		<updated>2014-03-27T10:40:19Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: Created page with &amp;quot;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo] &amp;lt;h2&amp;gt;Esercizio C.2&amp;lt;/h2&amp;gt;  Mia Soluzione: &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; #define RED 0 #define BLUE 1 //resti...&amp;quot;&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;
&amp;lt;h2&amp;gt;Esercizio C.2&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;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=510</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=510"/>
		<updated>2014-03-27T10:35:16Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
[[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;
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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=508</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=508"/>
		<updated>2014-03-26T16:29:27Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;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 santuario{&lt;br /&gt;
	int CurrentDir /* 0 = arriving , 1 = leaving */&lt;br /&gt;
	int crossing&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	condition oktoleave&lt;br /&gt;
	//queue enter&lt;br /&gt;
	//queue ponte&lt;br /&gt;
	//queue leave&lt;br /&gt;
	int fidelis /* fedeli nel tempio */&lt;br /&gt;
&lt;br /&gt;
	procedure entry entraponte(CrossingDir){&lt;br /&gt;
		if(CrossingDir != CurrentDir){&lt;br /&gt;
			if(CrossingDir == 0){&lt;br /&gt;
				//enter.enqueue()&lt;br /&gt;
				oktoenter.wait()&lt;br /&gt;
				//enter.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
			if(CrossingDir == 1){&lt;br /&gt;
				//leave.enqueue()&lt;br /&gt;
				oktoleave.wait()&lt;br /&gt;
				//leave.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if(CrossingDir == 0){&lt;br /&gt;
			if(fidelis == MAXSANTUARIO || crossing == MAXPONTE){&lt;br /&gt;
				//ponte.enqueue()&lt;br /&gt;
				oktoenter.wait()&lt;br /&gt;
				//ponte.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
			fidelis++&lt;br /&gt;
			crossing++&lt;br /&gt;
		}&lt;br /&gt;
		if(CrossingDir == 1){&lt;br /&gt;
			if(crossing == MAXPONTE){&lt;br /&gt;
				//ponte.enqueue()&lt;br /&gt;
				oktoleave.wait()&lt;br /&gt;
				//ponte.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
			fidelis--&lt;br /&gt;
			crossing++&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precedure entry esciponte(CrossingDir){&lt;br /&gt;
		crossing--&lt;br /&gt;
		if(crossing == 0){&lt;br /&gt;
			if(CrossingDir == 0){&lt;br /&gt;
				if(fidelis &amp;lt; MAXSANTUARIO /*&amp;amp;&amp;amp; !enter.isempty()*/){&lt;br /&gt;
					oktoenter.signal()&lt;br /&gt;
				}&lt;br /&gt;
				else{&lt;br /&gt;
					CurrentDir = 1 - CurrentDir&lt;br /&gt;
					oktoleave.signal()&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				CurrentDir = 1 - CurrentDir&lt;br /&gt;
				oktoenter.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	santuario{&lt;br /&gt;
		crossing = 0&lt;br /&gt;
		CurrentDir = 0&lt;br /&gt;
		fidelis = 0&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fede &amp;amp; Mirko&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;
#DEFINE MAXSANTUARIO N&lt;br /&gt;
&lt;br /&gt;
monitor santuario {&lt;br /&gt;
condition okpassa; // vai sul ponte secondo metodo FIFO&lt;br /&gt;
int turn=2;        // turno di attraversamento&lt;br /&gt;
int visitatori[2];  // contatori andata ritorno&lt;br /&gt;
visitatori[0]=0;&lt;br /&gt;
visitatori[1]=0;&lt;br /&gt;
int i=0;&lt;br /&gt;
Queue q;            // coda dei visitatori in attesa&lt;br /&gt;
&lt;br /&gt;
procedure entry entraponte(dir){&lt;br /&gt;
/* se il turno è della direzione opposta o&lt;br /&gt;
 i visitatori in transito sono N o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if(turn==(1-dir) || visitatori[dir]==N || !q.empty()){&lt;br /&gt;
		q.enqueue(dir);      // inserisci in coda&lt;br /&gt;
		okpassa.wait();      // aspetta&lt;br /&gt;
		if( q.head()==dir &amp;amp;&amp;amp; (visitatori[dir] + i) &amp;lt; (N - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // N visitatori nella direzione&lt;br /&gt;
			}			// in attesa quando nella direzione opposta &lt;br /&gt;
		i=0;	         		// i visitatori in transito erano N           &lt;br /&gt;
		}&lt;br /&gt;
turn=dir;           // setto il turno della direzione&lt;br /&gt;
visitatori[dir]++;   //incremento visitatori in transito&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
procedure entry esciponte(dir){&lt;br /&gt;
visitatore[dir]--;           //decremento visitatori in transito&lt;br /&gt;
/* se il primo visitatore in attesa va nella stessa direzione &lt;br /&gt;
di chi è uscito può entrare sul ponte poichè questo&lt;br /&gt;
si verifica solo se il visitatore uscito era il numero N &lt;br /&gt;
o il visitatore che esce è l'ultimo fa passare il primo in attesa&lt;br /&gt;
che sarà sicuramente della direzione opposta */      &lt;br /&gt;
                 &lt;br /&gt;
	if (q.head()==dir || visitatori[dir]==0){&lt;br /&gt;
              if(visitatore[dir]==0){&lt;br /&gt;
                turn=2;   // ponte vuoto&lt;br /&gt;
                }&lt;br /&gt;
		q.dequeue();&lt;br /&gt;
		okpassa.signal();    // causa il passaggio sul ponte &lt;br /&gt;
                     //  del primo visitatore in attesa&lt;br /&gt;
		     //	(secondo una politica FIFO)&lt;br /&gt;
		}&lt;br /&gt;
        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ANDARA 0;&lt;br /&gt;
#define RITORNO 1;&lt;br /&gt;
monitor santuario{&lt;br /&gt;
	int cross;	&lt;br /&gt;
	condition oktocross[2];	&lt;br /&gt;
	int fidelis;&lt;br /&gt;
	entraponte(dir){&lt;br /&gt;
		if( cross != 0 || (dir == 0 &amp;amp;&amp;amp; MAXSANTUARIO == fidelis)){&lt;br /&gt;
			wait[dir]++;&lt;br /&gt;
			oktocross[dir].wait();&lt;br /&gt;
			wait[dir]--;&lt;br /&gt;
		}&lt;br /&gt;
		cross++;	&lt;br /&gt;
		if(dir == 0){&lt;br /&gt;
			fidelis++;&lt;br /&gt;
			if(cross &amp;lt; MAXPONTE &amp;amp;&amp;amp; MAXSANTUARIO &amp;gt; fidelis){&lt;br /&gt;
				oktocross[dir].signal;&lt;br /&gt;
			}	&lt;br /&gt;
		}else{&lt;br /&gt;
			fidelis--;&lt;br /&gt;
			if(cross &amp;lt; MAXPONTE){&lt;br /&gt;
				oktocross[dir].signal;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	esciponte(dir){&lt;br /&gt;
		cross--;&lt;br /&gt;
		if(cross == 0 &amp;amp;&amp;amp; MAXSANTUARIO == fidelis){&lt;br /&gt;
			oktocross[RITORNO].signal();&lt;br /&gt;
		}else if(cross == 0 &amp;amp;&amp;amp; wait[1-dir]){&lt;br /&gt;
			oktocross[1-dir].signal();&lt;br /&gt;
		}else if(cross == 0){&lt;br /&gt;
			oktocross[dir].signal();&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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=507</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=507"/>
		<updated>2014-03-26T16:28:28Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;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 santuario{&lt;br /&gt;
	int CurrentDir /* 0 = arriving , 1 = leaving */&lt;br /&gt;
	int crossing&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	condition oktoleave&lt;br /&gt;
	//queue enter&lt;br /&gt;
	//queue ponte&lt;br /&gt;
	//queue leave&lt;br /&gt;
	int fidelis /* fedeli nel tempio */&lt;br /&gt;
&lt;br /&gt;
	procedure entry entraponte(CrossingDir){&lt;br /&gt;
		if(CrossingDir != CurrentDir){&lt;br /&gt;
			if(CrossingDir == 0){&lt;br /&gt;
				//enter.enqueue()&lt;br /&gt;
				oktoenter.wait()&lt;br /&gt;
				//enter.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
			if(CrossingDir == 1){&lt;br /&gt;
				//leave.enqueue()&lt;br /&gt;
				oktoleave.wait()&lt;br /&gt;
				//leave.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if(CrossingDir == 0){&lt;br /&gt;
			if(fidelis == MAXSANTUARIO || crossing == MAXPONTE){&lt;br /&gt;
				//ponte.enqueue()&lt;br /&gt;
				oktoenter.wait()&lt;br /&gt;
				//ponte.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
			fidelis++&lt;br /&gt;
			crossing++&lt;br /&gt;
		}&lt;br /&gt;
		if(CrossingDir == 1){&lt;br /&gt;
			if(crossing == MAXPONTE){&lt;br /&gt;
				//ponte.enqueue()&lt;br /&gt;
				oktoleave.wait()&lt;br /&gt;
				//ponte.dequeue()&lt;br /&gt;
			}&lt;br /&gt;
			fidelis--&lt;br /&gt;
			crossing++&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precedure entry esciponte(CrossingDir){&lt;br /&gt;
		crossing--&lt;br /&gt;
		if(crossing == 0){&lt;br /&gt;
			if(CrossingDir == 0){&lt;br /&gt;
				if(fidelis &amp;lt; MAXSANTUARIO /*&amp;amp;&amp;amp; !enter.isempty()*/){&lt;br /&gt;
					oktoenter.signal()&lt;br /&gt;
				}&lt;br /&gt;
				else{&lt;br /&gt;
					CurrentDir = 1 - CurrentDir&lt;br /&gt;
					oktoleave.signal()&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				CurrentDir = 1 - CurrentDir&lt;br /&gt;
				oktoenter.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	santuario{&lt;br /&gt;
		crossing = 0&lt;br /&gt;
		CurrentDir = 0&lt;br /&gt;
		fidelis = 0&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fede &amp;amp; Mirko&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;
#DEFINE MAXSANTUARIO N&lt;br /&gt;
&lt;br /&gt;
monitor santuario {&lt;br /&gt;
condition okpassa; // vai sul ponte secondo metodo FIFO&lt;br /&gt;
int turn=2;        // turno di attraversamento&lt;br /&gt;
int visitatori[2];  // contatori andata ritorno&lt;br /&gt;
visitatori[0]=0;&lt;br /&gt;
visitatori[1]=0;&lt;br /&gt;
int i=0;&lt;br /&gt;
Queue q;            // coda dei visitatori in attesa&lt;br /&gt;
&lt;br /&gt;
procedure entry entraponte(dir){&lt;br /&gt;
/* se il turno è della direzione opposta o&lt;br /&gt;
 i visitatori in transito sono N o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if(turn==(1-dir) || visitatori[dir]==N || !q.empty()){&lt;br /&gt;
		q.enqueue(dir);      // inserisci in coda&lt;br /&gt;
		okpassa.wait();      // aspetta&lt;br /&gt;
		if( q.head()==dir &amp;amp;&amp;amp; (visitatori[dir] + i) &amp;lt; (N - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // N visitatori nella direzione&lt;br /&gt;
			}			// in attesa quando nella direzione opposta &lt;br /&gt;
		i=0;	         		// i visitatori in transito erano N           &lt;br /&gt;
		}&lt;br /&gt;
turn=dir;           // setto il turno della direzione&lt;br /&gt;
visitatori[dir]++;   //incremento visitatori in transito&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
procedure entry esciponte(dir){&lt;br /&gt;
visitatore[dir]--;           //decremento visitatori in transito&lt;br /&gt;
/* se il primo visitatore in attesa va nella stessa direzione &lt;br /&gt;
di chi è uscito può entrare sul ponte poichè questo&lt;br /&gt;
si verifica solo se il visitatore uscito era il numero N &lt;br /&gt;
o il visitatore che esce è l'ultimo fa passare il primo in attesa&lt;br /&gt;
che sarà sicuramente della direzione opposta */      &lt;br /&gt;
                 &lt;br /&gt;
	if (q.head()==dir || visitatori[dir]==0){&lt;br /&gt;
              if(visitatore[dir]==0){&lt;br /&gt;
                turn=2;   // ponte vuoto&lt;br /&gt;
                }&lt;br /&gt;
		q.dequeue();&lt;br /&gt;
		okpassa.signal();    // causa il passaggio sul ponte &lt;br /&gt;
                     //  del primo visitatore in attesa&lt;br /&gt;
		     //	(secondo una politica FIFO)&lt;br /&gt;
		}&lt;br /&gt;
        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ANDARA 0;&lt;br /&gt;
#define RITORNO 1;&lt;br /&gt;
monitor santuario{&lt;br /&gt;
	int cross;	&lt;br /&gt;
	condition oktocross[2];	&lt;br /&gt;
	int fidelis;&lt;br /&gt;
	entraponte(dir){&lt;br /&gt;
		if( cross != 0 || (dir == 0 &amp;amp;&amp;amp; MAXSANTUARIO == fidelis)){&lt;br /&gt;
			wait[dir]++;&lt;br /&gt;
			oktocross[dir];&lt;br /&gt;
			wait[dir]--;&lt;br /&gt;
		}&lt;br /&gt;
		cross++;	&lt;br /&gt;
		if(dir == 0){&lt;br /&gt;
			fidelis++;&lt;br /&gt;
			if(cross &amp;lt; MAXPONTE &amp;amp;&amp;amp; MAXSANTUARIO &amp;gt; fidelis){&lt;br /&gt;
				oktocross[dir].signal;&lt;br /&gt;
			}	&lt;br /&gt;
		}else{&lt;br /&gt;
			fidelis--;&lt;br /&gt;
			if(cross &amp;lt; MAXPONTE){&lt;br /&gt;
				oktocross[dir].signal;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	esciponte(dir){&lt;br /&gt;
		cross--;&lt;br /&gt;
		if(cross == 0 &amp;amp;&amp;amp; MAXSANTUARIO == fidelis){&lt;br /&gt;
			oktocross[RITORNO].signal();&lt;br /&gt;
		}else if(cross == 0 &amp;amp;&amp;amp; wait[1-dir]){&lt;br /&gt;
			oktocross[1-dir].signal();&lt;br /&gt;
		}else if(cross == 0){&lt;br /&gt;
			oktocross[dir].signal();&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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=499</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=499"/>
		<updated>2014-03-25T10:32:45Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
[[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;
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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.01.22&amp;diff=498</id>
		<title>ProvaTeorica 2014.01.22</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.01.22&amp;diff=498"/>
		<updated>2014-03-25T10:32:29Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor bridge {&lt;br /&gt;
condition oktomove;	/* auto attraversa il ponte */&lt;br /&gt;
int turn=0;		/*indica il senso delle auto */&lt;br /&gt;
int est=0,ovest=0;      /*contatori delle auto da est e da ovest */&lt;br /&gt;
Queue q;		/*coda delle senso delle macchine in attesa */&lt;br /&gt;
&lt;br /&gt;
procedure entry enter (char EoW)&lt;br /&gt;
{&lt;br /&gt;
	if(EoW == &amp;quot;E&amp;quot;)		/* viene da est */&lt;br /&gt;
	{&lt;br /&gt;
		if(turn == 2 || est &amp;gt;=N || !empty(q))  &lt;br /&gt;
		{&lt;br /&gt;
			q=enqueue(&amp;quot;E&amp;quot;);		/*inserisco nella coda dei sensi*/	&lt;br /&gt;
			oktomove.wait();   	/*aspetta*/&lt;br /&gt;
									&lt;br /&gt;
		}&lt;br /&gt;
	turn = 1;	/*impongo il senso delle auto in circolo nel ponte */&lt;br /&gt;
	est++;&lt;br /&gt;
	}&lt;br /&gt;
	else		/* viene da ovest */&lt;br /&gt;
	{&lt;br /&gt;
		if(turn ==1 || ovest &amp;gt;=N || !empty(q))&lt;br /&gt;
		{&lt;br /&gt;
		        q=enqueue(&amp;quot;O&amp;quot;);		/*inserisco nella coda dei sensi*/&lt;br /&gt;
			oktomove.wait();	/*aspetta*/&lt;br /&gt;
									&lt;br /&gt;
		}&lt;br /&gt;
	turn = 2;	/*impongo il senso delle auto in circolo nel ponte */&lt;br /&gt;
	ovest++;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry exit(char EoW)&lt;br /&gt;
{&lt;br /&gt;
	char r;&lt;br /&gt;
	if(EoW == &amp;quot;O&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	est--;&lt;br /&gt;
	r=head(q);                          /* leggo la prossima auto che aspetta di entrare */&lt;br /&gt;
		if(est == 0 || r == &amp;quot;E&amp;quot;)     /*nessuna auto in transito nel ponte o il prossimo va nella stessa direzione*/&lt;br /&gt;
		{&lt;br /&gt;
		est--;&lt;br /&gt;
			if(est == 0)	/*nessuna auto in transito nel ponte */&lt;br /&gt;
			{&lt;br /&gt;
			turn = 0;	/*avanti un altro */&lt;br /&gt;
			}&lt;br /&gt;
			if(!empty(q))&lt;br /&gt;
			{&lt;br /&gt;
			q.dequeue();&lt;br /&gt;
			oktomove.signal();	/*segnale*/&lt;br /&gt;
			}&lt;br /&gt;
                }&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
	ovest--;&lt;br /&gt;
	r=head(q);                          /* leggo la prossima auto che aspetta di entrare */&lt;br /&gt;
		if(ovest == 0 || r == &amp;quot;O&amp;quot;)	 /*nessuna auto in transito nel ponte o il prossimo va nella stessa direzione*/&lt;br /&gt;
		{&lt;br /&gt;
		turn = 0;	/*avanti un altro */&lt;br /&gt;
		}&lt;br /&gt;
		if(!empty(q))&lt;br /&gt;
		{&lt;br /&gt;
		q.dequeue();		&lt;br /&gt;
		oktomove.signal();	/*segnale*/&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;
&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;
 * URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf&lt;br /&gt;
 * author: Tommaso Ognibene&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
monitor bridge&lt;br /&gt;
{&lt;br /&gt;
	condition okE;    // attraversare in direzione Est&lt;br /&gt;
	condition okW;    // attraversare in direzione Ovest&lt;br /&gt;
	int n = 0;        // numero di veicoli sul ponte&lt;br /&gt;
	int waitingE = 0; // numero di veicoli che attendono di attraversare in direzione Est&lt;br /&gt;
	int waitingW = 0; // numero di veicoli che attendono di attraversare in direzione Ovest&lt;br /&gt;
	bool toE = true;  // direzione di attraversamento&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter(Vehicle vehicle)&lt;br /&gt;
	{&lt;br /&gt;
		// [Case 1] Il veicolo vuole attraversare in direzione Ovest&lt;br /&gt;
		if (vehicle.To == 'W')&lt;br /&gt;
		{&lt;br /&gt;
			/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure&lt;br /&gt;
			      - qualcuno sta attraversando in direzione opposta; oppure&lt;br /&gt;
			      - qualcuno sta attendendo di attraversare in direzione opposta */&lt;br /&gt;
			if (n == N || (toE &amp;amp;&amp;amp; n &amp;gt; 0) || (!toE &amp;amp;&amp;amp; waitingE &amp;gt; 0))&lt;br /&gt;
			{&lt;br /&gt;
				// Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				waitingW++;&lt;br /&gt;
				okW.wait();&lt;br /&gt;
				waitingW--;&lt;br /&gt;
			}&lt;br /&gt;
			toE = false;&lt;br /&gt;
			n++;&lt;br /&gt;
			&lt;br /&gt;
			/* Se possibile, sblocco eventuali altri veicoli in attesa per la stessa direzione.&lt;br /&gt;
			 * Questo non crea starvation in quanto sono sicuramente un numero limitato. */&lt;br /&gt;
			if (n &amp;lt; N &amp;amp;&amp;amp; waitingE == 0)&lt;br /&gt;
				okW.signal();&lt;br /&gt;
		}&lt;br /&gt;
		// [Case 2] Il veicolo vuole attraversare in direzione Est&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure&lt;br /&gt;
			      - qualcuno sta attraversando in direzione opposta; oppure&lt;br /&gt;
			      - qualcuno sta attendendo di attraversare in direzione opposta */&lt;br /&gt;
			if (n == N || (!toE &amp;amp;&amp;amp; n &amp;gt; 0) || (toE &amp;amp;&amp;amp; waitingW &amp;gt; 0))&lt;br /&gt;
			{&lt;br /&gt;
			        // Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				waitingE++;&lt;br /&gt;
				okE.wait();&lt;br /&gt;
				waitingE--;&lt;br /&gt;
			}&lt;br /&gt;
			toE = true;&lt;br /&gt;
			n++;&lt;br /&gt;
&lt;br /&gt;
			/* Se possibile, sblocco eventuali altri veicoli in attesa per la stessa direzione.&lt;br /&gt;
			 * Questo non crea starvation in quanto sono sicuramente un numero limitato. */&lt;br /&gt;
			if (n &amp;lt; N &amp;amp;&amp;amp; waitingW == 0)&lt;br /&gt;
				okE.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(Vehicle vehicle)&lt;br /&gt;
	{&lt;br /&gt;
		n--;&lt;br /&gt;
		/* Se nessuno sta attraversando il ponte */&lt;br /&gt;
		if (n == 0)&lt;br /&gt;
		{&lt;br /&gt;
			// [Case 1] L'ultimo ad attraversare andava in direzione Ovest&lt;br /&gt;
			if (vehicle.To == 'W')&lt;br /&gt;
			{&lt;br /&gt;
			   /* Se esiste, attivo il veicolo che per primo si era messo&lt;br /&gt;
			      in attesa per la direzione opposta */&lt;br /&gt;
			   if (waitingE &amp;gt; 0)&lt;br /&gt;
				okE.signal();&lt;br /&gt;
			   else&lt;br /&gt;
				okW.signal();&lt;br /&gt;
			}&lt;br /&gt;
			// [Case 2] L'ultimo ad attraversare andava in direzione Est&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			   /* Se esiste, attivo il veicolo che per primo si era messo&lt;br /&gt;
		              in attesa per la direzione opposta */&lt;br /&gt;
			   if (waitingW &amp;gt; 0)&lt;br /&gt;
				okW.signal();&lt;br /&gt;
			   else&lt;br /&gt;
				okE.signal();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
/*&lt;br /&gt;
 * author: Midolo&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
Monitor Ponte {&lt;br /&gt;
#define O 0&lt;br /&gt;
#define E 1&lt;br /&gt;
condition oktocross[2];&lt;br /&gt;
int countwaiting[2], crossing;&lt;br /&gt;
&lt;br /&gt;
	bridge.enter(dir){&lt;br /&gt;
		if(crossing != 0 || countwaiting[1-dir] != 0){&lt;br /&gt;
			countwaiting[dir]++;&lt;br /&gt;
			oktocross[dir].wait();&lt;br /&gt;
			countwaiting[dir]--;            &lt;br /&gt;
		}&lt;br /&gt;
		crossing++;&lt;br /&gt;
		if(crossing &amp;lt; N){ &lt;br /&gt;
			oktocross[dir].signal();&lt;br /&gt;
		}    &lt;br /&gt;
	}&lt;br /&gt;
    &lt;br /&gt;
	bridge.exit(dir){&lt;br /&gt;
		crossing--;&lt;br /&gt;
		if(crossing == 0){&lt;br /&gt;
			if(countwaiting[dir] != 0){&lt;br /&gt;
				oktocross[dir].signal();&lt;br /&gt;
			}else{&lt;br /&gt;
				oktocross[1-dir].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;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=497</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=497"/>
		<updated>2014-03-25T10:28:56Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
[[ProvaTeoria_2011.07.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2014.01.22]]&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;
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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=496</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=496"/>
		<updated>2014-03-25T10:28:47Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
[[ProvaTeoria_2011.07.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2014.01.22]]&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;
&lt;br /&gt;
[[ProvaTeorica 2014.01.22]]&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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.01.24&amp;diff=465</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=465"/>
		<updated>2014-03-18T13:02:16Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: Created page with &amp;quot;Esercizio C1: (a) Scrivere un monitor nmbb che realizzi un buffer limitato (di ampiezza BUFSIZE) che consenta alle chiamate write (inserimento nel buffer) e read (lettura da b...&amp;quot;&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;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=464</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=464"/>
		<updated>2014-03-18T12:58:34Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
[[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;
[[ProvaTeoria_2011.07.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2014.01.22]]&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;
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>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.07.19&amp;diff=462</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=462"/>
		<updated>2014-03-18T11:41:02Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.07.19&amp;diff=461</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=461"/>
		<updated>2014-03-18T10:51:02Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: Created page with &amp;quot;Esecizio C1: 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: put(generic *obj...&amp;quot;&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 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;/div&gt;</summary>
		<author><name>MidoloM</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=460</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=460"/>
		<updated>2014-03-18T10:47:12Z</updated>

		<summary type="html">&lt;p&gt;MidoloM: &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;
[[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;
[[ProvaTeoria_2011.07.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2014.01.22]]&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;
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>MidoloM</name></author>
	</entry>
</feed>