<?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=Mirk+M</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=Mirk+M"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Mirk_M"/>
	<updated>2026-05-05T08:12:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2009.09.23&amp;diff=645</id>
		<title>ProvaPratica 2009.09.23</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2009.09.23&amp;diff=645"/>
		<updated>2014-04-30T13:59:34Z</updated>

		<summary type="html">&lt;p&gt;Mirk M: Created page with &amp;quot;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/pratiche/2009.09.23.pdf&amp;lt;/h1&amp;gt;  == Esercizio 1 ==  &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #in...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/pratiche/2009.09.23.pdf&amp;lt;/h1&amp;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;stdlib.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;
#include &amp;lt;fcntl.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;
&lt;br /&gt;
#define BUFSIZE 4096&lt;br /&gt;
&lt;br /&gt;
void buf_invert(char *b_input, char *b_output)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;BUFSIZE; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if(b_input[i] == EOF)&lt;br /&gt;
			break;&lt;br /&gt;
		b_output[i] = b_input[BUFSIZE-i];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
off_t file_dim(char *path)&lt;br /&gt;
{&lt;br /&gt;
	struct stat buf;&lt;br /&gt;
	int ris;&lt;br /&gt;
&lt;br /&gt;
	ris = stat (path, &amp;amp;buf);&lt;br /&gt;
	if(ris == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Stat, error %d: %s\n&amp;quot;, errno, strerror(errno));&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return buf.st_size;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int invert(int input, int output, off_t file_size)&lt;br /&gt;
{&lt;br /&gt;
	char b_input[BUFSIZE], b_output[BUFSIZE];&lt;br /&gt;
	int rris, wris;&lt;br /&gt;
	off_t i=0;&lt;br /&gt;
&lt;br /&gt;
	while(i &amp;lt; file_size)&lt;br /&gt;
	{&lt;br /&gt;
		rris = pread(input, b_input, BUFSIZE, i);&lt;br /&gt;
		if(rris == -1)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;Pread error %d: %s\n&amp;quot;, errno, strerror(errno));&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		i += rris;&lt;br /&gt;
&lt;br /&gt;
		wris = pwrite(output, b_output, BUFSIZE, file_size-i);&lt;br /&gt;
		if(wris == -1)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;Pwrite error %d: %s\n&amp;quot;, errno, strerror(errno));&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(rris != wris)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;Invert error\n&amp;quot;);&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	int input, output, ris;&lt;br /&gt;
	off_t file_size;&lt;br /&gt;
&lt;br /&gt;
	if(argc &amp;gt; 3)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Too many arguments\n&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	input = open(argv[1], O_RDONLY);&lt;br /&gt;
	if(input == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Open error %d: %s\n&amp;quot;, errno, strerror(errno));&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	file_size = file_dim(argv[1]);&lt;br /&gt;
	if(file_size == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;File_dim error\n&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printf(&amp;quot;File size %d\n&amp;quot;, file_size);&lt;br /&gt;
&lt;br /&gt;
	output = open(argv[2], O_CREAT | O_RDWR /*| O_APPEND*/);&lt;br /&gt;
	if(output == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;File creation (open) error %d: %s\n&amp;quot;, errno, strerror(errno));&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ris = invert(input, output, file_size);&lt;br /&gt;
	if(ris == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Invert error\n&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mirko_M&lt;/div&gt;</summary>
		<author><name>Mirk M</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=642</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=642"/>
		<updated>2014-04-30T13:54:37Z</updated>

		<summary type="html">&lt;p&gt;Mirk M: &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 2012.09.19]]&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.05.30]]&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;
[[Prova Teorica 2008.01.16]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2013.09.12]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2009.09.18]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2008.09.17]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2007.09.07]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2013.06.21]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2010.02.03]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2011.09.12]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2009.02.12]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2009.01.15]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2007.07.12]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeoria 2011.01.17]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeoria 2010.05.12]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeoria 2012.01.12]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2009.09.23]]&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>Mirk M</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=527</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=527"/>
		<updated>2014-03-30T20:48:22Z</updated>

		<summary type="html">&lt;p&gt;Mirk M: &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 il processo in testa alla coda waiting 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;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define LIMIT 0.75&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
	double procNum; // numero processi all'interno del semaforo&lt;br /&gt;
	double pColourNum[2]; // numero di processi rossi [0] o blu [1]&lt;br /&gt;
	condition okToEnter;&lt;br /&gt;
	condition okToLeave;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter(colour)&lt;br /&gt;
	{	// Se ci sono processi nel semaforo &amp;amp;&amp;amp; il numero dei processi del colore attuale è inferiore &lt;br /&gt;
                // al 75% &amp;amp;&amp;amp; il numero dei processi dell'altro colore è inferiore al 75% sul totale+1, wait&lt;br /&gt;
		if(procNum != 0 &amp;amp;&amp;amp; (pColourNum[1-colour]/procNum+1) &amp;lt; LIMIT &amp;amp;&amp;amp; (pColourNum[colour]/procNum) &amp;lt; LIMIT)&lt;br /&gt;
		{&lt;br /&gt;
			okToEnter.wait();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			procNum++;&lt;br /&gt;
			pColourNum[colour]++;&lt;br /&gt;
&lt;br /&gt;
			// Se qualcuno è in attesa di uscire e adesso le percentuali lo permettono, signal&lt;br /&gt;
			if((pColourNum[colour]/procNum-1) &amp;gt;= LIMIT)&lt;br /&gt;
			{&lt;br /&gt;
				okToLeave.signal();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Se qualcuno è in attesa di entrare e adesso le percentuali lo permettono, signal&lt;br /&gt;
			if((pColourNum[colour]/procNum+1) &amp;gt;= LIMIT)&lt;br /&gt;
			{&lt;br /&gt;
				okToEnter.signal();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(colour)&lt;br /&gt;
	{&lt;br /&gt;
		// Se il numero di processi del colore attuale è inferiore al 75% sul totale+1, wait&lt;br /&gt;
		if((pColourNum[colour]/procNum-1) &amp;lt; LIMIT)&lt;br /&gt;
		{&lt;br /&gt;
			okToLeave.wait();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			procNum--;&lt;br /&gt;
			pColourNum[colour]--;&lt;br /&gt;
&lt;br /&gt;
			// Se qualcuno dell'altro colore è in attesa di uscire e adesso le percentuali lo permettono, signal&lt;br /&gt;
                        if((pColourNum[1-colour]/procNum-1) &amp;gt;= LIMIT)&lt;br /&gt;
                        {&lt;br /&gt;
                                okToLeave.signal();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	limcol&lt;br /&gt;
	{&lt;br /&gt;
		procNum = 0;&lt;br /&gt;
		pColourNum[0] = 0;&lt;br /&gt;
		pColourNum[1] = 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mirko&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>Mirk M</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=526</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=526"/>
		<updated>2014-03-30T20:47:03Z</updated>

		<summary type="html">&lt;p&gt;Mirk M: &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 il processo in testa alla coda waiting 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;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define LIMIT 0.75&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
	double procNum; // numero processi all'interno del semaforo&lt;br /&gt;
	double pColourNum[2]; // numero di processi rossi [0] o blu [1]&lt;br /&gt;
	condition okToEnter;&lt;br /&gt;
	condition okToLeave;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter(colour)&lt;br /&gt;
	{	// Se ci sono processi nel semaforo &amp;amp;&amp;amp; il numero dei processi del colore attuale è inferiore &lt;br /&gt;
                // al 75% &amp;amp;&amp;amp; il numero dei processi dell'altro colore è inferiore al 75% sul totale+1, wait&lt;br /&gt;
		if(procNum != 0 &amp;amp;&amp;amp; (pColourNum[1-colour]/procNum+1) &amp;lt; LIMIT &amp;amp;&amp;amp; (pColourNum[colour]/procNum) &amp;lt; LIMIT)&lt;br /&gt;
		{&lt;br /&gt;
			okToEnter.wait();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			procNum++;&lt;br /&gt;
			pColourNum[colour]++;&lt;br /&gt;
&lt;br /&gt;
			// Se qualcuno è in attesa di uscire e adesso le percentuali lo permettono, signal&lt;br /&gt;
			if((pColourNum[colour]/procNum-1) &amp;gt;= LIMIT)&lt;br /&gt;
			{&lt;br /&gt;
				okToLeave.signal();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Se qualcuno è in attesa di entrare e adesso le percentuali lo permettono, signal&lt;br /&gt;
			if((pColourNum[colour]/procNum+1) &amp;gt;= LIMIT)&lt;br /&gt;
			{&lt;br /&gt;
				okToEnter.signal();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(colour)&lt;br /&gt;
	{&lt;br /&gt;
		// Se il numero di processi del colore attuale è inferiore al 75% sul totale+1, wait&lt;br /&gt;
		if((pColourNum[colour]/procNum-1) &amp;lt; LIMIT)&lt;br /&gt;
		{&lt;br /&gt;
			okToLeave.wait();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			procNum--;&lt;br /&gt;
			pColourNum[colour]--;&lt;br /&gt;
&lt;br /&gt;
			// Se qualcuno dell'altro colore è in attesa di uscire e adesso le percentuali lo permettono, signal&lt;br /&gt;
                        if((pColourNum[1-colour]/procNum-1) &amp;gt;= LIMIT)&lt;br /&gt;
                        {&lt;br /&gt;
                                okToLeave.signal();&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	limcol&lt;br /&gt;
	{&lt;br /&gt;
		procNum = 0;&lt;br /&gt;
		redProc = 0;&lt;br /&gt;
		blueProc = 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mirko&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>Mirk M</name></author>
	</entry>
</feed>