<?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=Save</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=Save"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Save"/>
	<updated>2026-05-01T12:11:20Z</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_2017.05.29&amp;diff=1958</id>
		<title>Prova teorica 2017.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1958"/>
		<updated>2017-07-13T09:19:57Z</updated>

		<summary type="html">&lt;p&gt;Save: /* Soluzione di Mida */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2017.05.29.tot.pdf link al compito]&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.1==&lt;br /&gt;
===Soluzione di Mida===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monitor rb() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
condition oktorun, oktochiama&lt;br /&gt;
int c, punteggio[2], nstudentiP, arrivati&lt;br /&gt;
int i = [1,2,3,4]&lt;br /&gt;
&lt;br /&gt;
 procedure entry nuovaPartita ()&lt;br /&gt;
   {  &lt;br /&gt;
     punteggio[A] = punteggio [B] = c = arrivati = 0;&lt;br /&gt;
     &lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
 procedure entry chiama( n ) &lt;br /&gt;
 &lt;br /&gt;
   { &lt;br /&gt;
     int k = random(i);&lt;br /&gt;
     c = k;&lt;br /&gt;
     if ( nstudentiP &amp;lt; 2 * MAX )&lt;br /&gt;
          oktochiama(n).wait();&lt;br /&gt;
     for(j=0 ; j&amp;lt;k ; k++)&lt;br /&gt;
          n inrange(0, MAX-1);&lt;br /&gt;
          oktorun(n).signal();&lt;br /&gt;
     return Punteggio&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
 procedure entry pronto (sq, n)&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      if(max(punteggio) == 10;&lt;br /&gt;
         return 1&lt;br /&gt;
&lt;br /&gt;
      nstudentiP ++;&lt;br /&gt;
      if ( nstudentiP &amp;gt;= 2*MAX )&lt;br /&gt;
         oktochiama(n).signal();&lt;br /&gt;
      oktorun(n).wait();&lt;br /&gt;
      arrivati(sq)++;&lt;br /&gt;
      else return 0&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
 procedure entry allabandiera ( sq, n)&lt;br /&gt;
&lt;br /&gt;
   { &lt;br /&gt;
     if ( arrivati(sq) == C )&lt;br /&gt;
         punteggio[sq]++;&lt;br /&gt;
     else punteggio[1-sq]++;&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qualcuno cortesemente può dirmi se può andar bene?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Stefano Zaniboni===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Monitor rb () {&lt;br /&gt;
&lt;br /&gt;
  condition ok2chiama, ok2run[MAX], ok2fine&lt;br /&gt;
  int npronti, punteggio[2], arrivati, c&lt;br /&gt;
&lt;br /&gt;
 procedure entry void nuovapartita() {&lt;br /&gt;
    c = npronti = arrived punteggio[0] = punteggio[1] = 0&lt;br /&gt;
}&lt;br /&gt;
 procedure entry int chiama(int *chiamati) {&lt;br /&gt;
     c = chiamati.length&lt;br /&gt;
     if(npronti &amp;lt; 2 * MAX)&lt;br /&gt;
           ok2chiama.wait()&lt;br /&gt;
     for(int i = 0; i &amp;lt; c; i++){&lt;br /&gt;
           ok2run[i].signal()&lt;br /&gt;
           ok2run[i].signal()&lt;br /&gt;
     }&lt;br /&gt;
     ok2fine.wait()&lt;br /&gt;
     if(max(punteggio) == 10)&lt;br /&gt;
           for(int i = 0; i in range(MAX); i++){&lt;br /&gt;
                ok2run[i].signal()&lt;br /&gt;
                ok2run[i].signal()&lt;br /&gt;
          }  &lt;br /&gt;
      return punteggio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 procedure entry int pronto(int squadra, int numero) {&lt;br /&gt;
      if(max(punteggio) == 10)&lt;br /&gt;
            return -1&lt;br /&gt;
      npronti++ &lt;br /&gt;
      if (npronti &amp;gt; 2 * MAX)&lt;br /&gt;
            ok2chiama.signal()&lt;br /&gt;
            if(n not in chiamata)&lt;br /&gt;
                   ok2run[n].wait()&lt;br /&gt;
       npronti--&lt;br /&gt;
       if(max(punteggio) == 10)&lt;br /&gt;
                return -1&lt;br /&gt;
       else return 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 procedure entry void allabandiera(int squadra, int numero) {&lt;br /&gt;
      arrived++ &lt;br /&gt;
      if(arrived = 2 * c)&lt;br /&gt;
                 punteggio[1 - squadra]++&lt;br /&gt;
                 ok2fine.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;
==Esercizio c.2==&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Stefano Zaniboni===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
sia dato un servizio di message passing asincrono distratto. Questo servizio si comporta come un servizio di message passing asincrono ma talvolta dimentica la destinazione.&lt;br /&gt;
E’ però possibile indicare un processo come “ufficio messaggi smarriti” al quale verranno recapitati tutti i messaggi per i quali il servizio distratto ha dimenticato la destinazione.&lt;br /&gt;
&lt;br /&gt;
Void dmsgsend(pid_t dest, msg_t msg); //si comporta come amsgsend ma può dimenticare la desticazione&lt;br /&gt;
msg_t dmsgrecv() //si comporta come amsgrecv(*) &lt;br /&gt;
void dset_lost_n_found(pid_t pid); //indica il processo per i messaggi smarriti.&lt;br /&gt;
&lt;br /&gt;
Usando il servizio “distratto” e un processo “ufficio messaggi smarriti”, &lt;br /&gt;
implementare un servizio di message passing standard (senza la selezione del mittente in ricezione, la amsgrecv riceve da qualsiasi mittente).&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void asend(pid_t dest, msg_t msg){&lt;br /&gt;
        dmsgsend(dest,{getpid(), dest, msg})&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
msg_t arecv(pid_t sender){&lt;br /&gt;
        {snd, dst, m} = dmsgrecv()&lt;br /&gt;
        return m&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process l+f{&lt;br /&gt;
        dset_lost_n_found(getpid())&lt;br /&gt;
        while(true){&lt;br /&gt;
               {snd, dst, m} = dmsgrecv()&lt;br /&gt;
               if dst != getpid(){&lt;br /&gt;
                        asend(dst, {snd, dst, m})&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;
==Esercizio g.1==&lt;br /&gt;
===Soluzione di GiovanniF===&lt;br /&gt;
&lt;br /&gt;
min = lifo 1234123124123124...&lt;br /&gt;
&lt;br /&gt;
lifo = lru 123124123124123124...&lt;br /&gt;
&lt;br /&gt;
--[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 10:17, 16 June 2017 (CEST) &amp;lt;br&amp;gt;&lt;br /&gt;
Ho verificato la soluzione:&amp;lt;br&amp;gt;&lt;br /&gt;
Il ragionamento da fare qui è: &amp;lt;br&amp;gt;&lt;br /&gt;
MIN = LIFO &amp;lt;br&amp;gt;&lt;br /&gt;
MIN sceglie la pagina che più tardi nel futuro verrà richiesta &amp;lt;br&amp;gt;&lt;br /&gt;
LIFO sceglie l'ultima pagina caricata &amp;lt;br&amp;gt;&lt;br /&gt;
Quindi ad ogni page fault l'ultima pagina caricata deve essere quella che più tardi nel futuro verrà richiesta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MIN&lt;br /&gt;
1	2	3	4	1	2	3	1	2	4	1	2	3	1	2	4&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	4	4	4	3	3	3	4	4	4	3	3	3	4&lt;br /&gt;
			#			#			#			#			#&lt;br /&gt;
&lt;br /&gt;
LIFO&lt;br /&gt;
1	2	3	4	1	2	3	1	2	4	1	2	3	1	2	4&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	1	2	2	2	2	2&lt;br /&gt;
		3	4	4	4	3	3	3	4	4	4	3	3	3	4&lt;br /&gt;
			#			#			#			#			#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LIFO = LRU &amp;lt;br&amp;gt;&lt;br /&gt;
LRU sceglie la pagina che più precedentemente nel passato è stata richiesta &amp;lt;br&amp;gt;&lt;br /&gt;
Quindi ad ogni page fault l'ultima pagina caricata deve essere quella che più precedentemente nel passato è stata richiesta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LRU&lt;br /&gt;
1	2	3	1	2	4	1	2	3	1	2	4	1	2	3&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	3	3	4	4	4	3	3	3	4	4	4	4&lt;br /&gt;
					#			#			#			#&lt;br /&gt;
&lt;br /&gt;
LIFO&lt;br /&gt;
1	2	3	1	2	4	1	2	3	1	2	4	1	2	3&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	3	3	4	4	4	3	3	3	4	4	4	4&lt;br /&gt;
					#			#			#			#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.2==&lt;br /&gt;
#'''Un i-node di un file system tipo ext2 per un errore viene riportato un numero di link maggiore del reale. Cosa può succedere se si continua ad usare il file system? (perchè?) E se il numero di link errato fosse il contrario inferiore al reale cosa potrebbe succedere? (perchè?) ''' &amp;lt;br&amp;gt; Che quando i reali link al i-node verrano eliminati e il numero decrementato questo non raggiungerà mai zero e lo spazio non verrà rilasciato. Se invece il numero di link è inferiore al reale può succedere che con solo l'eliminazione di pochi link al inode l'area del file venga segnata come libera perchè il sistema operativo pensa che l'inode non sia più utilizzato.&lt;br /&gt;
#'''Perchè è necessario usare spinlock in sistemi multiprocessore per implementare kernel di tipo simmetrico (SMP)?''' &amp;lt;br&amp;gt;Perchè la semplice disabilitazione degli interrupt non sarebbe sufficiente in caso di parallelismo reale a prevenire l'accesso a memoria condivisa in concorrenza. Bisogna perciò utilizzare strumenti come gli spinlock che grazie a istruzioni atomiche, per esempio la test-and-set, bloccano l'esecuzione di un processo fino al verificarsi di una condizione. Per evitare il busy wait si possono usare gli spinlock solo per rendere atomiche le istruzioni P e V di un semaforo in modo che la maggior parte del tempo di attesa per entrare in una sezione critica un processo lo passi in stato di wait invece che consumare inutilmente cicli di CPU.&lt;br /&gt;
#'''Perchè nei sistemi reali l'algoritmo di rimpiazzamento second chance (orologio) viene preferito a LRU sebbene il primo non sia a stack e il secondo sì?''' &amp;lt;br&amp;gt; perchè la gestione dei timestamp richiesti da LRU è costosa nella MMU.&lt;br /&gt;
#'''Perchè revocare un'autorizzazione espressa come capability è più difficile che revocare lo stesso diritto quando espresso come access control list?''' &amp;lt;br&amp;gt; Perchè le capability sono salvate al interno dello spazio di memoria di ciascun processo mentre le access control list sono legate al file.&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1957</id>
		<title>Prova teorica 2017.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1957"/>
		<updated>2017-07-13T09:19:07Z</updated>

		<summary type="html">&lt;p&gt;Save: /* Esercizio c.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2017.05.29.tot.pdf link al compito]&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.1==&lt;br /&gt;
===Soluzione di Mida===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monitor rb() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
condition oktorun, oktochiama&lt;br /&gt;
int c, punteggio[2], nstudentiP, arrivati&lt;br /&gt;
int i = [1,2,3,4]&lt;br /&gt;
&lt;br /&gt;
 procedure entry nuovaPartita ()&lt;br /&gt;
   {  &lt;br /&gt;
     punteggio[A] = punteggio [B] = c = arrivati = 0;&lt;br /&gt;
     &lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
 procedure entry chiama( n ) &lt;br /&gt;
 &lt;br /&gt;
   { &lt;br /&gt;
     int k = random(i);&lt;br /&gt;
     c = k;&lt;br /&gt;
     if ( nstudentiP &amp;lt; 2 * MAX )&lt;br /&gt;
          oktochiama(n).wait();&lt;br /&gt;
     for(j=0 ; j&amp;lt;k ; k++)&lt;br /&gt;
          n inrange(0, MAX-1);&lt;br /&gt;
          oktorun(n).signal();&lt;br /&gt;
     return Punteggio&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
 procedure entry pronto (sq, n)&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      if(max(punteggio) == 10;&lt;br /&gt;
         return 1&lt;br /&gt;
&lt;br /&gt;
      nstudentiP ++;&lt;br /&gt;
      if ( nstudentiP &amp;gt;= 2*MAX )&lt;br /&gt;
         oktochiama(n).signal();&lt;br /&gt;
      oktorun(n).wait();&lt;br /&gt;
      arrivati(sq)++;&lt;br /&gt;
      else return 0&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
 procedure entry allabandiera ( sq, n)&lt;br /&gt;
&lt;br /&gt;
   { &lt;br /&gt;
     if ( arrivati(sq) == C )&lt;br /&gt;
         punteggio[sq]++;&lt;br /&gt;
     else punteggio[1-sq]++;&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Stefano Zaniboni===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Monitor rb () {&lt;br /&gt;
&lt;br /&gt;
  condition ok2chiama, ok2run[MAX], ok2fine&lt;br /&gt;
  int npronti, punteggio[2], arrivati, c&lt;br /&gt;
&lt;br /&gt;
 procedure entry void nuovapartita() {&lt;br /&gt;
    c = npronti = arrived punteggio[0] = punteggio[1] = 0&lt;br /&gt;
}&lt;br /&gt;
 procedure entry int chiama(int *chiamati) {&lt;br /&gt;
     c = chiamati.length&lt;br /&gt;
     if(npronti &amp;lt; 2 * MAX)&lt;br /&gt;
           ok2chiama.wait()&lt;br /&gt;
     for(int i = 0; i &amp;lt; c; i++){&lt;br /&gt;
           ok2run[i].signal()&lt;br /&gt;
           ok2run[i].signal()&lt;br /&gt;
     }&lt;br /&gt;
     ok2fine.wait()&lt;br /&gt;
     if(max(punteggio) == 10)&lt;br /&gt;
           for(int i = 0; i in range(MAX); i++){&lt;br /&gt;
                ok2run[i].signal()&lt;br /&gt;
                ok2run[i].signal()&lt;br /&gt;
          }  &lt;br /&gt;
      return punteggio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 procedure entry int pronto(int squadra, int numero) {&lt;br /&gt;
      if(max(punteggio) == 10)&lt;br /&gt;
            return -1&lt;br /&gt;
      npronti++ &lt;br /&gt;
      if (npronti &amp;gt; 2 * MAX)&lt;br /&gt;
            ok2chiama.signal()&lt;br /&gt;
            if(n not in chiamata)&lt;br /&gt;
                   ok2run[n].wait()&lt;br /&gt;
       npronti--&lt;br /&gt;
       if(max(punteggio) == 10)&lt;br /&gt;
                return -1&lt;br /&gt;
       else return 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 procedure entry void allabandiera(int squadra, int numero) {&lt;br /&gt;
      arrived++ &lt;br /&gt;
      if(arrived = 2 * c)&lt;br /&gt;
                 punteggio[1 - squadra]++&lt;br /&gt;
                 ok2fine.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;
==Esercizio c.2==&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Stefano Zaniboni===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
sia dato un servizio di message passing asincrono distratto. Questo servizio si comporta come un servizio di message passing asincrono ma talvolta dimentica la destinazione.&lt;br /&gt;
E’ però possibile indicare un processo come “ufficio messaggi smarriti” al quale verranno recapitati tutti i messaggi per i quali il servizio distratto ha dimenticato la destinazione.&lt;br /&gt;
&lt;br /&gt;
Void dmsgsend(pid_t dest, msg_t msg); //si comporta come amsgsend ma può dimenticare la desticazione&lt;br /&gt;
msg_t dmsgrecv() //si comporta come amsgrecv(*) &lt;br /&gt;
void dset_lost_n_found(pid_t pid); //indica il processo per i messaggi smarriti.&lt;br /&gt;
&lt;br /&gt;
Usando il servizio “distratto” e un processo “ufficio messaggi smarriti”, &lt;br /&gt;
implementare un servizio di message passing standard (senza la selezione del mittente in ricezione, la amsgrecv riceve da qualsiasi mittente).&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void asend(pid_t dest, msg_t msg){&lt;br /&gt;
        dmsgsend(dest,{getpid(), dest, msg})&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
msg_t arecv(pid_t sender){&lt;br /&gt;
        {snd, dst, m} = dmsgrecv()&lt;br /&gt;
        return m&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process l+f{&lt;br /&gt;
        dset_lost_n_found(getpid())&lt;br /&gt;
        while(true){&lt;br /&gt;
               {snd, dst, m} = dmsgrecv()&lt;br /&gt;
               if dst != getpid(){&lt;br /&gt;
                        asend(dst, {snd, dst, m})&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;
==Esercizio g.1==&lt;br /&gt;
===Soluzione di GiovanniF===&lt;br /&gt;
&lt;br /&gt;
min = lifo 1234123124123124...&lt;br /&gt;
&lt;br /&gt;
lifo = lru 123124123124123124...&lt;br /&gt;
&lt;br /&gt;
--[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 10:17, 16 June 2017 (CEST) &amp;lt;br&amp;gt;&lt;br /&gt;
Ho verificato la soluzione:&amp;lt;br&amp;gt;&lt;br /&gt;
Il ragionamento da fare qui è: &amp;lt;br&amp;gt;&lt;br /&gt;
MIN = LIFO &amp;lt;br&amp;gt;&lt;br /&gt;
MIN sceglie la pagina che più tardi nel futuro verrà richiesta &amp;lt;br&amp;gt;&lt;br /&gt;
LIFO sceglie l'ultima pagina caricata &amp;lt;br&amp;gt;&lt;br /&gt;
Quindi ad ogni page fault l'ultima pagina caricata deve essere quella che più tardi nel futuro verrà richiesta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MIN&lt;br /&gt;
1	2	3	4	1	2	3	1	2	4	1	2	3	1	2	4&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	4	4	4	3	3	3	4	4	4	3	3	3	4&lt;br /&gt;
			#			#			#			#			#&lt;br /&gt;
&lt;br /&gt;
LIFO&lt;br /&gt;
1	2	3	4	1	2	3	1	2	4	1	2	3	1	2	4&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	1	2	2	2	2	2&lt;br /&gt;
		3	4	4	4	3	3	3	4	4	4	3	3	3	4&lt;br /&gt;
			#			#			#			#			#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LIFO = LRU &amp;lt;br&amp;gt;&lt;br /&gt;
LRU sceglie la pagina che più precedentemente nel passato è stata richiesta &amp;lt;br&amp;gt;&lt;br /&gt;
Quindi ad ogni page fault l'ultima pagina caricata deve essere quella che più precedentemente nel passato è stata richiesta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LRU&lt;br /&gt;
1	2	3	1	2	4	1	2	3	1	2	4	1	2	3&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	3	3	4	4	4	3	3	3	4	4	4	4&lt;br /&gt;
					#			#			#			#&lt;br /&gt;
&lt;br /&gt;
LIFO&lt;br /&gt;
1	2	3	1	2	4	1	2	3	1	2	4	1	2	3&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	3	3	4	4	4	3	3	3	4	4	4	4&lt;br /&gt;
					#			#			#			#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.2==&lt;br /&gt;
#'''Un i-node di un file system tipo ext2 per un errore viene riportato un numero di link maggiore del reale. Cosa può succedere se si continua ad usare il file system? (perchè?) E se il numero di link errato fosse il contrario inferiore al reale cosa potrebbe succedere? (perchè?) ''' &amp;lt;br&amp;gt; Che quando i reali link al i-node verrano eliminati e il numero decrementato questo non raggiungerà mai zero e lo spazio non verrà rilasciato. Se invece il numero di link è inferiore al reale può succedere che con solo l'eliminazione di pochi link al inode l'area del file venga segnata come libera perchè il sistema operativo pensa che l'inode non sia più utilizzato.&lt;br /&gt;
#'''Perchè è necessario usare spinlock in sistemi multiprocessore per implementare kernel di tipo simmetrico (SMP)?''' &amp;lt;br&amp;gt;Perchè la semplice disabilitazione degli interrupt non sarebbe sufficiente in caso di parallelismo reale a prevenire l'accesso a memoria condivisa in concorrenza. Bisogna perciò utilizzare strumenti come gli spinlock che grazie a istruzioni atomiche, per esempio la test-and-set, bloccano l'esecuzione di un processo fino al verificarsi di una condizione. Per evitare il busy wait si possono usare gli spinlock solo per rendere atomiche le istruzioni P e V di un semaforo in modo che la maggior parte del tempo di attesa per entrare in una sezione critica un processo lo passi in stato di wait invece che consumare inutilmente cicli di CPU.&lt;br /&gt;
#'''Perchè nei sistemi reali l'algoritmo di rimpiazzamento second chance (orologio) viene preferito a LRU sebbene il primo non sia a stack e il secondo sì?''' &amp;lt;br&amp;gt; perchè la gestione dei timestamp richiesti da LRU è costosa nella MMU.&lt;br /&gt;
#'''Perchè revocare un'autorizzazione espressa come capability è più difficile che revocare lo stesso diritto quando espresso come access control list?''' &amp;lt;br&amp;gt; Perchè le capability sono salvate al interno dello spazio di memoria di ciascun processo mentre le access control list sono legate al file.&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1956</id>
		<title>Prova teorica 2017.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1956"/>
		<updated>2017-07-13T07:15:29Z</updated>

		<summary type="html">&lt;p&gt;Save: /* Soluzione di Save */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2017.05.29.tot.pdf link al compito]&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.1==&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Stefano Zaniboni===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Monitor rb () {&lt;br /&gt;
&lt;br /&gt;
  condition ok2chiama, ok2run[MAX], ok2fine&lt;br /&gt;
  int npronti, punteggio[2], arrivati, c&lt;br /&gt;
&lt;br /&gt;
 procedure entry void nuovapartita() {&lt;br /&gt;
    c = npronti = arrived punteggio[0] = punteggio[1] = 0&lt;br /&gt;
}&lt;br /&gt;
 procedure entry int chiama(int *chiamati) {&lt;br /&gt;
     c = chiamati.length&lt;br /&gt;
     if(npronti &amp;lt; 2 * MAX)&lt;br /&gt;
           ok2chiama.wait()&lt;br /&gt;
     for(int i = 0; i &amp;lt; c; i++){&lt;br /&gt;
           ok2run[i].signal()&lt;br /&gt;
           ok2run[i].signal()&lt;br /&gt;
     }&lt;br /&gt;
     ok2fine.wait()&lt;br /&gt;
     if(max(punteggio) == 10)&lt;br /&gt;
           for(int i = 0; i in range(MAX); i++){&lt;br /&gt;
                ok2run[i].signal()&lt;br /&gt;
                ok2run[i].signal()&lt;br /&gt;
          }  &lt;br /&gt;
      return punteggio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 procedure entry int pronto(int squadra, int numero) {&lt;br /&gt;
      if(max(punteggio) == 10)&lt;br /&gt;
            return -1&lt;br /&gt;
      npronti++ &lt;br /&gt;
      if (npronti &amp;gt; 2 * MAX)&lt;br /&gt;
            ok2chiama.signal()&lt;br /&gt;
            if(n not in chiamata)&lt;br /&gt;
                   ok2run[n].wait()&lt;br /&gt;
       npronti--&lt;br /&gt;
       if(max(punteggio) == 10)&lt;br /&gt;
                return -1&lt;br /&gt;
       else return 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 procedure entry void allabandiera(int squadra, int numero) {&lt;br /&gt;
      arrived++ &lt;br /&gt;
      if(arrived = 2 * c)&lt;br /&gt;
                 punteggio[1 - squadra]++&lt;br /&gt;
                 ok2fine.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;
==Esercizio c.2==&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Stefano Zaniboni===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
sia dato un servizio di message passing asincrono distratto. Questo servizio si comporta come un servizio di message passing asincrono ma talvolta dimentica la destinazione.&lt;br /&gt;
E’ però possibile indicare un processo come “ufficio messaggi smarriti” al quale verranno recapitati tutti i messaggi per i quali il servizio distratto ha dimenticato la destinazione.&lt;br /&gt;
&lt;br /&gt;
Void dmsgsend(pid_t dest, msg_t msg); //si comporta come amsgsend ma può dimenticare la desticazione&lt;br /&gt;
msg_t dmsgrecv() //si comporta come amsgrecv(*) &lt;br /&gt;
void dset_lost_n_found(pid_t pid); //indica il processo per i messaggi smarriti.&lt;br /&gt;
&lt;br /&gt;
Usando il servizio “distratto” e un processo “ufficio messaggi smarriti”, &lt;br /&gt;
implementare un servizio di message passing standard (senza la selezione del mittente in ricezione, la amsgrecv riceve da qualsiasi mittente).&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void asend(pid_t dest, msg_t msg){&lt;br /&gt;
        dmsgsend(dest,{getpid(), dest, msg})&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
msg_t arecv(pid_t sender){&lt;br /&gt;
        {snd, dst, m} = dmsgrecv()&lt;br /&gt;
        return m&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process l+f{&lt;br /&gt;
        dset_lost_n_found(getpid())&lt;br /&gt;
        while(true){&lt;br /&gt;
               {snd, dst, m} = dmsgrecv()&lt;br /&gt;
               if dst != getpid(){&lt;br /&gt;
                        asend(dst, {snd, dst, m})&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;
==Esercizio g.1==&lt;br /&gt;
===Soluzione di GiovanniF===&lt;br /&gt;
&lt;br /&gt;
min = lifo 1234123124123124...&lt;br /&gt;
&lt;br /&gt;
lifo = lru 123124123124123124...&lt;br /&gt;
&lt;br /&gt;
--[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 10:17, 16 June 2017 (CEST) &amp;lt;br&amp;gt;&lt;br /&gt;
Ho verificato la soluzione:&amp;lt;br&amp;gt;&lt;br /&gt;
Il ragionamento da fare qui è: &amp;lt;br&amp;gt;&lt;br /&gt;
MIN = LIFO &amp;lt;br&amp;gt;&lt;br /&gt;
MIN sceglie la pagina che più tardi nel futuro verrà richiesta &amp;lt;br&amp;gt;&lt;br /&gt;
LIFO sceglie l'ultima pagina caricata &amp;lt;br&amp;gt;&lt;br /&gt;
Quindi ad ogni page fault l'ultima pagina caricata deve essere quella che più tardi nel futuro verrà richiesta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MIN&lt;br /&gt;
1	2	3	4	1	2	3	1	2	4	1	2	3	1	2	4&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	4	4	4	3	3	3	4	4	4	3	3	3	4&lt;br /&gt;
			#			#			#			#			#&lt;br /&gt;
&lt;br /&gt;
LIFO&lt;br /&gt;
1	2	3	4	1	2	3	1	2	4	1	2	3	1	2	4&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	1	2	2	2	2	2&lt;br /&gt;
		3	4	4	4	3	3	3	4	4	4	3	3	3	4&lt;br /&gt;
			#			#			#			#			#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LIFO = LRU &amp;lt;br&amp;gt;&lt;br /&gt;
LRU sceglie la pagina che più precedentemente nel passato è stata richiesta &amp;lt;br&amp;gt;&lt;br /&gt;
Quindi ad ogni page fault l'ultima pagina caricata deve essere quella che più precedentemente nel passato è stata richiesta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LRU&lt;br /&gt;
1	2	3	1	2	4	1	2	3	1	2	4	1	2	3&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	3	3	4	4	4	3	3	3	4	4	4	4&lt;br /&gt;
					#			#			#			#&lt;br /&gt;
&lt;br /&gt;
LIFO&lt;br /&gt;
1	2	3	1	2	4	1	2	3	1	2	4	1	2	3&lt;br /&gt;
1	1	1	1	1	1	1	1	1	1	1	1	1	1	1&lt;br /&gt;
	2	2	2	2	2	2	2	2	2	2	2	2	2	2&lt;br /&gt;
		3	3	3	4	4	4	3	3	3	4	4	4	4&lt;br /&gt;
					#			#			#			#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.2==&lt;br /&gt;
#'''Un i-node di un file system tipo ext2 per un errore viene riportato un numero di link maggiore del reale. Cosa può succedere se si continua ad usare il file system? (perchè?) E se il numero di link errato fosse il contrario inferiore al reale cosa potrebbe succedere? (perchè?) ''' &amp;lt;br&amp;gt; Che quando i reali link al i-node verrano eliminati e il numero decrementato questo non raggiungerà mai zero e lo spazio non verrà rilasciato. Se invece il numero di link è inferiore al reale può succedere che con solo l'eliminazione di pochi link al inode l'area del file venga segnata come libera perchè il sistema operativo pensa che l'inode non sia più utilizzato.&lt;br /&gt;
#'''Perchè è necessario usare spinlock in sistemi multiprocessore per implementare kernel di tipo simmetrico (SMP)?''' &amp;lt;br&amp;gt;Perchè la semplice disabilitazione degli interrupt non sarebbe sufficiente in caso di parallelismo reale a prevenire l'accesso a memoria condivisa in concorrenza. Bisogna perciò utilizzare strumenti come gli spinlock che grazie a istruzioni atomiche, per esempio la test-and-set, bloccano l'esecuzione di un processo fino al verificarsi di una condizione. Per evitare il busy wait si possono usare gli spinlock solo per rendere atomiche le istruzioni P e V di un semaforo in modo che la maggior parte del tempo di attesa per entrare in una sezione critica un processo lo passi in stato di wait invece che consumare inutilmente cicli di CPU.&lt;br /&gt;
#'''Perchè nei sistemi reali l'algoritmo di rimpiazzamento second chance (orologio) viene preferito a LRU sebbene il primo non sia a stack e il secondo sì?''' &amp;lt;br&amp;gt; perchè la gestione dei timestamp richiesti da LRU è costosa nella MMU.&lt;br /&gt;
#'''Perchè revocare un'autorizzazione espressa come capability è più difficile che revocare lo stesso diritto quando espresso come access control list?''' &amp;lt;br&amp;gt; Perchè le capability sono salvate al interno dello spazio di memoria di ciascun processo mentre le access control list sono legate al file.&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1928</id>
		<title>Prova teorica 2017.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1928"/>
		<updated>2017-06-15T12:15:56Z</updated>

		<summary type="html">&lt;p&gt;Save: /* Esercizio c.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Media:20170529.jpg | link al compito]]&lt;br /&gt;
&lt;br /&gt;
Ho caricato questa foto del compito intanto che non è ancora disponibile il pdf. Quando sarà disponibile sostituire con il link al pdf. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 11:41, 15 June 2017 (CEST)&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.1==&lt;br /&gt;
&lt;br /&gt;
se qualcuno può correggermi o confermare il rispetto delle regole concorrenziali, mi fa un grande piacere. &lt;br /&gt;
saluti&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Monitor rubaBandiera () {&lt;br /&gt;
&lt;br /&gt;
  condition oktochiama, oktopunteggio, oktopronto; &lt;br /&gt;
&lt;br /&gt;
  listnum [] = [1,2,3,4]&lt;br /&gt;
  numeri[]&lt;br /&gt;
  numeriChiamati[0...MAX-1]&lt;br /&gt;
  studentiPronti = True; &lt;br /&gt;
&lt;br /&gt;
  punteggio [A] = 0;&lt;br /&gt;
  punteggio [B] = 0;&lt;br /&gt;
&lt;br /&gt;
 procedure entry gioco() {&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
      n=random(listnum);&lt;br /&gt;
      numeri(n)=random(numeriChiamati);&lt;br /&gt;
&lt;br /&gt;
      if( studentiPronti == false)&lt;br /&gt;
&lt;br /&gt;
             oktochiama(numeri).wait() ;&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      studentiPronti(numeri) = false ;&lt;br /&gt;
      oktopunteggio.signal();&lt;br /&gt;
}&lt;br /&gt;
 procedure entry studente () {&lt;br /&gt;
&lt;br /&gt;
    while(studentiPronti(numeri))&lt;br /&gt;
&lt;br /&gt;
         oktochiama(numeri).signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 procedure entry chiama () {&lt;br /&gt;
&lt;br /&gt;
      print(punteggio[A] &amp;quot;:&amp;quot; punteggio[B]);&lt;br /&gt;
      if (studentiPronti(numeri))&lt;br /&gt;
&lt;br /&gt;
         oktopunteggio.wait()&lt;br /&gt;
&lt;br /&gt;
      if (allabadiera(A))&lt;br /&gt;
         punteggio[A] ++;&lt;br /&gt;
      else punteggio [B]++;&lt;br /&gt;
      print(punteggio[A] &amp;quot;:&amp;quot; punteggio[B]);&lt;br /&gt;
      studentiPronti(numeri) = true&lt;br /&gt;
&lt;br /&gt;
      pronto();&lt;br /&gt;
&lt;br /&gt;
 procedure entry pronto() {&lt;br /&gt;
&lt;br /&gt;
      if(punteggio[A] || punteggio[B] &amp;lt; 10)&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
      else return 1;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.2==&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.2==&lt;br /&gt;
#'''Un i-node di un file system tipo ext2 per un errore viene riportato un numero di link maggiore del reale. Cosa può succedere se si continua ad usare il file system? (perchè?) E se il numero di link errato fosse il contrario inferiore al reale cosa potrebbe succedere? (perchè?)&lt;br /&gt;
#'''Perchè è necessario usare spinlock in sistemi multiprocessore per implementare kernel di tipo simmetrico (SMP)?''' &amp;lt;br&amp;gt;Perchè la semplice disabilitazione degli interrupt non sarebbe sufficiente in caso di parallelismo reale a prevenire l'accesso a memoria condivisa in concorrenza. Bisogna perciò utilizzare strumenti come gli spinlock che grazie a istruzioni atomiche, per esempio la test-and-set, bloccano l'esecuzione di un processo fino al verificarsi di una condizione. Per evitare il busy wait si possono usare gli spinlock solo per rendere atomiche le istruzioni P e V di un semaforo in modo che la maggior parte del tempo di attesa per entrare in una sezione critica un processo lo passi in stato di wait invece che consumare inutilmente cicli di CPU.&lt;br /&gt;
#'''Perchè nei sistemi reali l'algoritmo di rimpiazzamento second chance (orologio) viene preferito a LRU sebbene il primo non sia a stack e il secondo sì?&lt;br /&gt;
#'''Perchè revocare un'autorizzazione espressa come capability è più difficile che revocare lo stesso diritto quando espresso come access control list?'''&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1926</id>
		<title>Prova teorica 2017.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1926"/>
		<updated>2017-06-15T12:14:38Z</updated>

		<summary type="html">&lt;p&gt;Save: /* Esercizio c.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Media:20170529.jpg | link al compito]]&lt;br /&gt;
&lt;br /&gt;
Ho caricato questa foto del compito intanto che non è ancora disponibile il pdf. Quando sarà disponibile sostituire con il link al pdf. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 11:41, 15 June 2017 (CEST)&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.1==&lt;br /&gt;
&lt;br /&gt;
se qualcuno può correggermi o confermare il rispetto delle regole concorrenziali, mi fa un grande piacere. &lt;br /&gt;
saluti&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Monitor rubaBandiera () {&lt;br /&gt;
&lt;br /&gt;
  condition oktochiama, oktopunteggio, oktopronto; &lt;br /&gt;
&lt;br /&gt;
  listnum [] = [1,2,3,4]&lt;br /&gt;
  numeri[]&lt;br /&gt;
  numeriChiamati[0...MAX-1]&lt;br /&gt;
  studentiPronti = True; &lt;br /&gt;
&lt;br /&gt;
  punteggio [A] = 0;&lt;br /&gt;
  punteggio [B] = 0;&lt;br /&gt;
&lt;br /&gt;
 procedure entry gioco() {&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
      n=random(listnum);&lt;br /&gt;
      numeri=random(numeriChiamati);&lt;br /&gt;
&lt;br /&gt;
      if( studentiPronti == false)&lt;br /&gt;
&lt;br /&gt;
             oktochiama(numeri).wait() ;&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      studentiPronti(numeri) = false ;&lt;br /&gt;
      oktopunteggio.signal();&lt;br /&gt;
}&lt;br /&gt;
 procedure entry studente () {&lt;br /&gt;
&lt;br /&gt;
    while(studentiPronti(numeri))&lt;br /&gt;
&lt;br /&gt;
         oktochiama(numeri).signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 procedure entry chiama () {&lt;br /&gt;
&lt;br /&gt;
      print(punteggio[A] &amp;quot;:&amp;quot; punteggio[B]);&lt;br /&gt;
      if (studentiPronti(numeri))&lt;br /&gt;
&lt;br /&gt;
         oktopunteggio.wait()&lt;br /&gt;
&lt;br /&gt;
      if (allabadiera(A))&lt;br /&gt;
         punteggio[A] ++;&lt;br /&gt;
      else punteggio [B]++;&lt;br /&gt;
      print(punteggio[A] &amp;quot;:&amp;quot; punteggio[B]);&lt;br /&gt;
      studentiPronti(numeri) = true&lt;br /&gt;
&lt;br /&gt;
      pronto();&lt;br /&gt;
&lt;br /&gt;
 procedure entry pronto() {&lt;br /&gt;
&lt;br /&gt;
      if(punteggio[A] || punteggio[B] &amp;lt; 10)&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
      else return 1;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.2==&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.2==&lt;br /&gt;
#'''Un i-node di un file system tipo ext2 per un errore viene riportato un numero di link maggiore del reale. Cosa può succedere se si continua ad usare il file system? (perchè?) E se il numero di link errato fosse il contrario inferiore al reale cosa potrebbe succedere? (perchè?)&lt;br /&gt;
#'''Perchè è necessario usare spinlock in sistemi multiprocessore per implementare kernel di tipo simmetrico (SMP)?''' &amp;lt;br&amp;gt;Perchè la semplice disabilitazione degli interrupt non sarebbe sufficiente in caso di parallelismo reale a prevenire l'accesso a memoria condivisa in concorrenza. Bisogna perciò utilizzare strumenti come gli spinlock che grazie a istruzioni atomiche, per esempio la test-and-set, bloccano l'esecuzione di un processo fino al verificarsi di una condizione. Per evitare il busy wait si possono usare gli spinlock solo per rendere atomiche le istruzioni P e V di un semaforo in modo che la maggior parte del tempo di attesa per entrare in una sezione critica un processo lo passi in stato di wait invece che consumare inutilmente cicli di CPU.&lt;br /&gt;
#'''Perchè nei sistemi reali l'algoritmo di rimpiazzamento second chance (orologio) viene preferito a LRU sebbene il primo non sia a stack e il secondo sì?&lt;br /&gt;
#'''Perchè revocare un'autorizzazione espressa come capability è più difficile che revocare lo stesso diritto quando espresso come access control list?'''&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1925</id>
		<title>Prova teorica 2017.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2017.05.29&amp;diff=1925"/>
		<updated>2017-06-15T12:13:15Z</updated>

		<summary type="html">&lt;p&gt;Save: /* Esercizio c.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Media:20170529.jpg | link al compito]]&lt;br /&gt;
&lt;br /&gt;
Ho caricato questa foto del compito intanto che non è ancora disponibile il pdf. Quando sarà disponibile sostituire con il link al pdf. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 11:41, 15 June 2017 (CEST)&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.1==&lt;br /&gt;
&lt;br /&gt;
se qualcuno può correggermi o confermare il rispetto delle regole concorrenziali, mi fa un grande piacere. &lt;br /&gt;
saluti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Monitor rubaBandiera () {&lt;br /&gt;
&lt;br /&gt;
  condition oktochiama, oktopunteggio, oktopronto; &lt;br /&gt;
&lt;br /&gt;
  listnum [] = [1,2,3,4]&lt;br /&gt;
  numeri[]&lt;br /&gt;
  numeriChiamati[0...MAX-1]&lt;br /&gt;
  studentiPronti = True; &lt;br /&gt;
&lt;br /&gt;
  punteggio [A] = 0;&lt;br /&gt;
  punteggio [B] = 0;&lt;br /&gt;
&lt;br /&gt;
 procedure entry gioco() {&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
      n=random(listnum);&lt;br /&gt;
      numeri=random(numeriChiamati);&lt;br /&gt;
&lt;br /&gt;
      if( studentiPronti == false)&lt;br /&gt;
&lt;br /&gt;
             oktochiama(numeri).wait() ;&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      studentiPronti(numeri) = false ;&lt;br /&gt;
      oktopunteggio.signal();&lt;br /&gt;
}&lt;br /&gt;
 procedure entry studente () {&lt;br /&gt;
&lt;br /&gt;
    while(studentiPronti(numeri))&lt;br /&gt;
&lt;br /&gt;
         oktochiama(numeri).signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 procedure entry chiama () {&lt;br /&gt;
&lt;br /&gt;
      print(punteggio[A] &amp;quot;:&amp;quot; punteggio[B]);&lt;br /&gt;
      if (studentiPronti(numeri))&lt;br /&gt;
&lt;br /&gt;
         oktopunteggio.wait()&lt;br /&gt;
&lt;br /&gt;
      if (allabadiera(A))&lt;br /&gt;
         punteggio[A] ++;&lt;br /&gt;
      else punteggio [B]++;&lt;br /&gt;
      print(punteggio[A] &amp;quot;:&amp;quot; punteggio[B]);&lt;br /&gt;
      studentiPronti(numeri) = true&lt;br /&gt;
&lt;br /&gt;
      pronto();&lt;br /&gt;
&lt;br /&gt;
 procedure entry pronto() {&lt;br /&gt;
&lt;br /&gt;
      if(punteggio[A] || punteggio[B] &amp;lt; 10)&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
      else return 1;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.2==&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.2==&lt;br /&gt;
#'''Un i-node di un file system tipo ext2 per un errore viene riportato un numero di link maggiore del reale. Cosa può succedere se si continua ad usare il file system? (perchè?) E se il numero di link errato fosse il contrario inferiore al reale cosa potrebbe succedere? (perchè?)&lt;br /&gt;
#'''Perchè è necessario usare spinlock in sistemi multiprocessore per implementare kernel di tipo simmetrico (SMP)?''' &amp;lt;br&amp;gt;Perchè la semplice disabilitazione degli interrupt non sarebbe sufficiente in caso di parallelismo reale a prevenire l'accesso a memoria condivisa in concorrenza. Bisogna perciò utilizzare strumenti come gli spinlock che grazie a istruzioni atomiche, per esempio la test-and-set, bloccano l'esecuzione di un processo fino al verificarsi di una condizione. Per evitare il busy wait si possono usare gli spinlock solo per rendere atomiche le istruzioni P e V di un semaforo in modo che la maggior parte del tempo di attesa per entrare in una sezione critica un processo lo passi in stato di wait invece che consumare inutilmente cicli di CPU.&lt;br /&gt;
#'''Perchè nei sistemi reali l'algoritmo di rimpiazzamento second chance (orologio) viene preferito a LRU sebbene il primo non sia a stack e il secondo sì?&lt;br /&gt;
#'''Perchè revocare un'autorizzazione espressa come capability è più difficile che revocare lo stesso diritto quando espresso come access control list?'''&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2014.07.16&amp;diff=1892</id>
		<title>Prova teorica 2014.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2014.07.16&amp;diff=1892"/>
		<updated>2017-05-23T10:41:31Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Testo: [http://www.cs.unibo.it/~renzo/so/compiti/2014.07.16.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
== Esercizio c.1 ==&lt;br /&gt;
===Soluzione di S.G===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Esercizio c.1: scrivere il monitor mMbb che realizzi un meccanismo di un minmax bounded buffer.&lt;br /&gt;
 * Dopo le prime MIN operazioni di scrittura, un minmax bounded buffer deve sempre avere almeno MIN elementi e mai piu' di MAX&lt;br /&gt;
 * elementi (e' quindi limitato sia nell'ampiezza massima, sia nell'ampiezza minima).&lt;br /&gt;
 * Le funzioni (procedure entry) read e write del minmax bounded buffer hanno gli stessi argomenti e valori di ritorno di quelle del&lt;br /&gt;
 * producer/consumer o del bounded buffer ordinario.&lt;br /&gt;
 */&lt;br /&gt;
#define MIN&lt;br /&gt;
#define MAX&lt;br /&gt;
#define SIZE // con SIZE &amp;gt;= MAX&lt;br /&gt;
&lt;br /&gt;
monitor mMbb{&lt;br /&gt;
	&lt;br /&gt;
	generic_type bb[];&lt;br /&gt;
	int front, rear, count;&lt;br /&gt;
	condition R, W;&lt;br /&gt;
	&lt;br /&gt;
	void mMbb(void){&lt;br /&gt;
		bb = new generic_type[SIZE];&lt;br /&gt;
		front = rear = count = 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure_entry generic_type read(){&lt;br /&gt;
		while(count &amp;lt; MIN)	// Controllo che il buffer abbia MIN elementi per poter leggere&lt;br /&gt;
			R.wait();&lt;br /&gt;
		&lt;br /&gt;
		generic_type ret = bb[rear];&lt;br /&gt;
		count--;&lt;br /&gt;
		rear = (rear + 1) % SIZE;&lt;br /&gt;
		W.signal();&lt;br /&gt;
		return ret;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure_entry write(generic_type c){&lt;br /&gt;
		while(count &amp;gt;= MAX)	// Controllo che il buffer non abbia MAX elementi per poter scrivere&lt;br /&gt;
			W.wait();&lt;br /&gt;
		&lt;br /&gt;
		bb[front] = c;&lt;br /&gt;
		count++;&lt;br /&gt;
		front = (front + 1) % SIZE;&lt;br /&gt;
		R.signal();	&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 17:21, 2 December 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Non &amp;amp;egrave; fifo. Perch&amp;amp;eacute;? [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:43, 3 December 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Nel caso in cui MIN vale 3 e arrivino tre processi lettori nel seguente ordine, L1, L2, L3, avremmo che la coda di R è la seguente:&lt;br /&gt;
&lt;br /&gt;
R: L1, L2, L3&lt;br /&gt;
&lt;br /&gt;
Ora arriva un processo scrittore S1, viene eseguito liberando un lettore (R.signal) cioè L1. A questo punto L1 riprende la sua esecuzione, riesegue il ciclo e rientra nello stato di attesa. Quindi ora la coda di R è la seguente:&lt;br /&gt;
&lt;br /&gt;
R: L2, L3, L1&lt;br /&gt;
&lt;br /&gt;
Si potrebbe risolvere il problema modificando le funzioni write e read nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
procedure_entry generic_type read(){&lt;br /&gt;
		if(count &amp;lt; MIN)	// Controllo che il buffer abbia MIN elementi per poter leggere&lt;br /&gt;
			R.wait();&lt;br /&gt;
		&lt;br /&gt;
		generic_type ret = bb[rear];&lt;br /&gt;
		count--;&lt;br /&gt;
		rear = (rear + 1) % SIZE;&lt;br /&gt;
		if(count &amp;lt; MAX)&lt;br /&gt;
			W.signal();&lt;br /&gt;
		return ret;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure_entry write(generic_type c){&lt;br /&gt;
		if(count &amp;gt;= MAX)	// Controllo che il buffer non abbia MAX elementi per poter scrivere&lt;br /&gt;
			W.wait();&lt;br /&gt;
		&lt;br /&gt;
		bb[front] = c;&lt;br /&gt;
		count++;&lt;br /&gt;
		front = (front + 1) % SIZE;&lt;br /&gt;
		if(count &amp;gt; MIN)&lt;br /&gt;
			R.signal();	&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 10:37, 3 December 2016 (CET)&lt;br /&gt;
===Soluzione di Stefano Zaniboni===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*esercizio 1*/&lt;br /&gt;
&lt;br /&gt;
monitor mMbb{&lt;br /&gt;
	object[] buffer; //spazio di memorizzazione&lt;br /&gt;
	&lt;br /&gt;
	final int MAXELEM; // numero massimo di elementi che ci possono essere nel buffer&lt;br /&gt;
	final int MINELEM; //numero minimo di elementi --&amp;gt; numero di scritture minime&lt;br /&gt;
	&lt;br /&gt;
	condition okW; // dove mi fermo se non posso scrivere&lt;br /&gt;
	condition okR; // dove mi fermo se non posso leggere&lt;br /&gt;
&lt;br /&gt;
	int count; // elementi presenti nel buffer&lt;br /&gt;
	int front;   // contatore al elemento prodotto&lt;br /&gt;
	int rear;   // contatore al elemento consumato	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	mMbb(){&lt;br /&gt;
		 buffer = new Object[MAXELEM];&lt;br /&gt;
    	count = rear = front = 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry object read(){&lt;br /&gt;
		if ((count &amp;lt; MINELEM))  //se il buffer e' pieno oppure non ci sono min elem chiamo la wait&lt;br /&gt;
    		     okR.wait();&lt;br /&gt;
  		eltype val = buffer[rear]; // assegno al val l'elemento che ho letto e poi aggiorno rear&lt;br /&gt;
		rear = ((rear + 1) % (MAXELEM -1 ));  // aggiorno rear;&lt;br /&gt;
		count--; // decremento count per dire che ho consumato un elemento&lt;br /&gt;
  		okW.signal(); // qui faccio signal sui produttori che adesso possono scrivere&lt;br /&gt;
  		return retval;&lt;br /&gt;
	}&lt;br /&gt;
	procedure entry void write(int val){&lt;br /&gt;
		if (count == buffer.length) //se il buffer e' pieno mi fermo&lt;br /&gt;
    		      okW.wait();&lt;br /&gt;
  		buffer[front] = val; //scrivo elemento&lt;br /&gt;
  		count++; //aggiorno i prodotti disponibili&lt;br /&gt;
  		front = ((front+1)%(MAXELEM - 1)); // aggiorno il contatore front a puntare nella prossima posizione&lt;br /&gt;
&lt;br /&gt;
  		okR.signal();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Sav===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
monitor mMbb {&lt;br /&gt;
&lt;br /&gt;
     condition oktowrite, oktoread&lt;br /&gt;
     int waitingW = 0, waitingR = 0&lt;br /&gt;
     buffer buffermM&lt;br /&gt;
&lt;br /&gt;
     procedure entry write(val) {&lt;br /&gt;
&lt;br /&gt;
                     if ( buffermM.len()&amp;gt;= MAX)&lt;br /&gt;
                               waitingW++;&lt;br /&gt;
                               oktowrite.wait();&lt;br /&gt;
                               waitingW--;&lt;br /&gt;
                               buffermM.enqueue(val);&lt;br /&gt;
                     buffermM.enqueue(val);&lt;br /&gt;
&lt;br /&gt;
                     while(buffermM.len()&amp;gt;= MIN)&lt;br /&gt;
                            oktoread.signal();     }&lt;br /&gt;
&lt;br /&gt;
      procedure entry read()   {&lt;br /&gt;
 &lt;br /&gt;
                      if (buffermM.len()&amp;lt; MIN)&lt;br /&gt;
                               waitingR++;&lt;br /&gt;
                               oktoread.wait();&lt;br /&gt;
                               waitingR--;&lt;br /&gt;
                               buffermM.dequeue();&lt;br /&gt;
                               oktowrite.signal();&lt;br /&gt;
                      buffemM.dequeue();&lt;br /&gt;
                      oktowrite.signal();&lt;br /&gt;
&lt;br /&gt;
                                }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Esercizio c.2 ==&lt;br /&gt;
===Soluzione di S.G===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Esercizio c.2: Facendo uso di semafori scrivere la funzione rendezvous che consenta ai processi di sincronizzarsi secondo le&lt;br /&gt;
 * seguenti specifiche:&lt;br /&gt;
 * – Ogni processo indica come parametro della funzione rendezvous con quanti altri processi vuole sincronizzarsi.&lt;br /&gt;
 * – M processi che chiamano la rendezvous con parametro N rimangono bloccati se M&amp;lt;N.&lt;br /&gt;
 * – Quando l'N-mo processo richiama la rendezvous specificando N come parametro, lui e gli N-1 sospesi devono proseguire&lt;br /&gt;
 * nelle propria esecuzione&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
struct S {&lt;br /&gt;
	Semaphore sem;&lt;br /&gt;
	int N; // parametro della funzione rendezvous con quanti altri processi vuole sincronizzarsi&lt;br /&gt;
	int I; // Contatore dei processi che richiamano rendezvous con paramentro N&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
List&amp;lt;S&amp;gt; listS = new List[]; // Lista di possibili semafori&lt;br /&gt;
&lt;br /&gt;
Semaphore mutex = new Semaphore(1);		// Variabile che consente la mutua esclusione&lt;br /&gt;
&lt;br /&gt;
rendevouz(int n){&lt;br /&gt;
	mutex.P();	// Ottengo la mutua esclusione&lt;br /&gt;
	&lt;br /&gt;
	find = FALSE;&lt;br /&gt;
	for(s in listS){	// Cerco il semaforo nella lista&lt;br /&gt;
		if(s.N == n){	&lt;br /&gt;
			find = TRUE;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if(find == FALSE){	// se non è presente nella lista lo creo&lt;br /&gt;
		struct S s;&lt;br /&gt;
		s.sem = new semaphore(0);&lt;br /&gt;
		s.N = n;&lt;br /&gt;
		s.I = 0;&lt;br /&gt;
		listS.insert(s);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	s.I++;&lt;br /&gt;
	if(s.I == s.N){		// Quando l'N-mo processo richiama la rendezvous specificando N come parametro&lt;br /&gt;
		while(s.I--)	// lui e gli N-1 sospesi devono proseguire nelle propria esecuzione&lt;br /&gt;
			s.sem.V();&lt;br /&gt;
	}&lt;br /&gt;
	else if(s.I &amp;lt; s.N){	// M processi che chiamano la rendezvous con parametro N rimangono bloccati se M&amp;lt;N&lt;br /&gt;
		s.sem.P();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	mutex.V();	// Rilascio la mutua esclusione&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ho qualche dubbio su questa soluzione, riguardo la linea presente l'istruzione s.sem.P(), il processo viene immediatamente bloccato? Se si dovrei rilasciare la mutua esclusione prima quindi? [[User:S.G|S.G]] ([[User talk:S.G|talk]]) 16:43, 3 December 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Si, la mutua esclusione va, in linea di principio, sempre rilasaciata prima di un' operazione P() poichè il processo che la chiama potrebbe bloccarsi tenendo con se la mutua esclusione e causando quindi deadlock.--[[User:FedericoP|FedericoP]] ([[User talk:FedericoP|talk]]) 10:37, 15 January 2017 (CET)&lt;br /&gt;
===Soluzione di MV===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// ------------------------- SOLUZIONE DI MV -------------------------&lt;br /&gt;
&lt;br /&gt;
void rendezvous(int N)&lt;br /&gt;
{&lt;br /&gt;
	struct S { Semaphore sem; int N; int M };&lt;br /&gt;
	&lt;br /&gt;
	static List&amp;lt;struct S&amp;gt; L = new List&amp;lt;struct S&amp;gt;();&lt;br /&gt;
	static Semaphore mutex = new Semaphore(1);&lt;br /&gt;
	&lt;br /&gt;
	if(N &amp;lt;= 1)	// se N==1 significa che non vuole sincronizzarsi&lt;br /&gt;
		return;	// se N&amp;lt;1 non ha senso =&amp;gt; esce dalla funzione&lt;br /&gt;
	&lt;br /&gt;
	bool trovato = false;&lt;br /&gt;
	mutex.P();	// prende la mutua esclusione per evitare incoerenze&lt;br /&gt;
	// scorre la lista in cerca di un semaforo per N&lt;br /&gt;
	for(List&amp;lt;struct S&amp;gt; el = L.head(); !L.last(el) &amp;amp;&amp;amp; !trovato; el = L.next(el) )&lt;br /&gt;
		if(el.content.N == N)	// se esiste&lt;br /&gt;
		{&lt;br /&gt;
			trovato = true;&lt;br /&gt;
			if(el.content.M == N-1)	// se è l'N-esimo processo&lt;br /&gt;
			{&lt;br /&gt;
				while(el.content.M)	// sblocca tutti gli altri&lt;br /&gt;
				{&lt;br /&gt;
					el.content.sem.V();&lt;br /&gt;
					el.content.M--;&lt;br /&gt;
				}&lt;br /&gt;
				mutex.V();&lt;br /&gt;
			}&lt;br /&gt;
			else		// altrimenti si mette in attesa&lt;br /&gt;
			{&lt;br /&gt;
				el.content.M++;&lt;br /&gt;
				mutex.V();&lt;br /&gt;
				el.content.sem.P();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	if(!trovato)	// se non esiste lo crea&lt;br /&gt;
	{&lt;br /&gt;
		// NB: ho ancora la mutua esclusione&lt;br /&gt;
		struct S s;&lt;br /&gt;
		s.N = N;&lt;br /&gt;
		s.M = 1;&lt;br /&gt;
		s.sem = new Semaphore(0);&lt;br /&gt;
		L.insert_tail(S)	// inserisce nella lista (in coda)&lt;br /&gt;
		&lt;br /&gt;
		mutex.V():&lt;br /&gt;
		// si mette in attesa sul semaforo appena creato (NB: N!=1)&lt;br /&gt;
		L.tail().content.sem.P();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* NOTA: gli elementi della lista non vengono deallocati una volta liberato&lt;br /&gt;
	il semaforo; questo perchè è ancora possibile una race condition (rara)&lt;br /&gt;
	nel caso in cui un processo P1 stia per inserirsi su un semaforo già esistente&lt;br /&gt;
	(ha appena fatto mutex.V() ) e un altro P2 riesca ad entrare nel ciclo e&lt;br /&gt;
	liberare tutti =&amp;gt; P2 effettua una V in più e P1 esce subito dalla P&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Alexp===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
List&amp;lt;Queue&amp;lt;Semaphore&amp;gt;&amp;gt; waiting;         //Lista di code di semafori&lt;br /&gt;
Semaphore mutex = 1;                    //Semaforo per modificare la lista delle code&lt;br /&gt;
&lt;br /&gt;
void rendezvous(int N){&lt;br /&gt;
    if(N &amp;gt;= 2){&lt;br /&gt;
        //semaforo da accodare(e su cui si dovrà bloccare il thread nel caso waiting[N].size() &amp;lt; N)&lt;br /&gt;
        Semaphore s = 0;&lt;br /&gt;
        int i;&lt;br /&gt;
        //entriamo nella critical section per modificare una struttura condivisa&lt;br /&gt;
        mutex.P();&lt;br /&gt;
        //se il chiamante non è l'N-esimo thread&lt;br /&gt;
        if(waiting[N].size()+1 &amp;lt; N){&lt;br /&gt;
            //accodiamo il semaforo nel caso non ci siano esattamente N thread con cui sincronizzarsi&lt;br /&gt;
            waiting[N].enqueue(s);&lt;br /&gt;
            //usciamo dalla critical section per non causare deadlock&lt;br /&gt;
            mutex.V();&lt;br /&gt;
            //fermiamo il thread sul semaforo accodato prima, nel caso in cui debba aspettare&lt;br /&gt;
            //questo thread verrà risvegliato dall'N-esimo thread che si sincronizzerà&lt;br /&gt;
            s.P();&lt;br /&gt;
        }&lt;br /&gt;
        //se il thread chiamante è proprio l'N-esimo(quindi dovrà sbloccare tutti)&lt;br /&gt;
        else{&lt;br /&gt;
            //per ogni thread accodato sulla coda in cui si sincronizzano N thread&lt;br /&gt;
            /*&lt;br /&gt;
            (in realtà nella coda ci sono N-1 semafori dei thread fermi&lt;br /&gt;
             mentre il thread che entra in questo ramo else sarà l'N-esimo)&lt;br /&gt;
            */&lt;br /&gt;
            for(i = 0; i &amp;lt; N-1; i++){&lt;br /&gt;
                //togliamo dalla coda il semaforo e risvegliamo il thread che lo aspettava&lt;br /&gt;
                waiting[N].dequeue().V();&lt;br /&gt;
            }&lt;br /&gt;
            //struttura condivisa modificata, usciamo dalla critical section&lt;br /&gt;
            mutex.V();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2014.09.24&amp;diff=1891</id>
		<title>Prova teorica 2014.09.24</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2014.09.24&amp;diff=1891"/>
		<updated>2017-05-23T09:10:08Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Testo: [http://www.cs.unibo.it/~renzo/so/compiti/2014.09.24.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
=== Esercizio c.1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Esercizio c.1: Scrivere un monitor vBB che realizzi un bounded buffer a dimensione variabile.&lt;br /&gt;
 * Le procedure entry da implementare sono read, write e resize. Read e write hanno gli stessi parametri del BB ordinario.&lt;br /&gt;
 * La funzione resize ha come parametro un numero intero positivo che rappresenta la nuova dimensione del buffer espressa in numero&lt;br /&gt;
 * di elementi. Inizialmente il bounded buffer ha dimensione DEFAULTSIZE. Se la dimensione viene incrementata I processi&lt;br /&gt;
 * eventualmente in attesa di scrivere devono poter inserire I loro elementi nel buffer fino a che e' consentito della nuova dimensione.&lt;br /&gt;
 * Se la dimensione diminuisce, nuovi scrittori potranno inserire elementi nel buffer solo quando sara' possibile farlo in modo coerente&lt;br /&gt;
 * con il nuovo numero massimo di elementi.&lt;br /&gt;
 */&lt;br /&gt;
#define DEFAULTSIZE &lt;br /&gt;
&lt;br /&gt;
monitor vbb{&lt;br /&gt;
	generic_type bb[];&lt;br /&gt;
	int i, size;&lt;br /&gt;
	conditions W, R;&lt;br /&gt;
	&lt;br /&gt;
	void vbb(void){&lt;br /&gt;
		bb = new generic_type[DEFAULTSIZE];&lt;br /&gt;
		i = 0;&lt;br /&gt;
		size = DEFAULTSIZE;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry void write(generic_type val){&lt;br /&gt;
		if(i == size){					// Il buffer è completamente pieno&lt;br /&gt;
			W.wait();				// Metto in attesa il processo&lt;br /&gt;
		}&lt;br /&gt;
								// Il buffer non è pieno, scrivo&lt;br /&gt;
		bb[i] = val;&lt;br /&gt;
		i++;&lt;br /&gt;
		R.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry generic_type read(void){&lt;br /&gt;
		generic_type retval;&lt;br /&gt;
		if(i == 0){					// Il buffer è vuoto&lt;br /&gt;
			R.wait();				// Metto in attesa il processo&lt;br /&gt;
		}&lt;br /&gt;
								// Il buffer non è vuoto, leggo&lt;br /&gt;
		i--;&lt;br /&gt;
		retval = bb[i];&lt;br /&gt;
		W.signal();					// Riattivo uno scrittore in coda&lt;br /&gt;
		return retval;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry void resize(unsigned int n){&lt;br /&gt;
		int old_size, j;&lt;br /&gt;
		old_size = size;&lt;br /&gt;
		size = n;&lt;br /&gt;
		newbb = new generic_type[n];&lt;br /&gt;
		&lt;br /&gt;
		if(n &amp;gt; old_size){				// Se la nuova dim. è maggiore di quella vecchia&lt;br /&gt;
			int ndiff = n - old_size;		// Numero di celle libere su cui scrivere&lt;br /&gt;
			&lt;br /&gt;
			for(j = 0; j &amp;lt; old_size; j++)		// Copia gli elementi di bb nel nuovo vettore&lt;br /&gt;
				newbb[j] = bb[j];&lt;br /&gt;
			bb = newbb;&lt;br /&gt;
			&lt;br /&gt;
			for(j = 0; j &amp;lt; ndiff; j++)		// allora più scrittori possono scrivere perchè vi sono celle libere&lt;br /&gt;
				W.signal();					&lt;br /&gt;
		}&lt;br /&gt;
		else{						// Se la nuova dim. è minore o uguale a quella vecchia&lt;br /&gt;
			&lt;br /&gt;
			for(j = 0; j &amp;lt; n; j++)	// Copia gli elementi di bb nel nuovo vettore&lt;br /&gt;
				newbb[j] = bb[j];&lt;br /&gt;
			bb = newbb;&lt;br /&gt;
			&lt;br /&gt;
			if(i &amp;gt;= n){				// se il buffer è comunque completamente pieno&lt;br /&gt;
				if(i &amp;gt; n)&lt;br /&gt;
					i = n;&lt;br /&gt;
				R.signal();			// allora un lettore può leggere&lt;br /&gt;
			}&lt;br /&gt;
			else{					// se il buffer non è ancora pieno&lt;br /&gt;
				W.signal();			// allora uno scrittore può scrivere&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;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 14:18, 21 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Questo &amp;amp;egrave; un bounded stack! non un bounded buffer (che deve essere FIFO, se no c'e' starvation!).&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 19:17, 21 November 2016 (CET)&lt;br /&gt;
=== Esercizio c.1 mia soluzione ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define DEFAULTSIZE &lt;br /&gt;
&lt;br /&gt;
monitor vBB {&lt;br /&gt;
&lt;br /&gt;
       condition oktowrite, oktoread&lt;br /&gt;
       int waintingW                              // scrittori in attesa&lt;br /&gt;
       int waintingR                              // lettori in attesa&lt;br /&gt;
       buffer buffer = defaultsize;&lt;br /&gt;
       procedure entry write {&lt;br /&gt;
&lt;br /&gt;
                 if (bufferlen() &amp;gt;= defaultsize)&lt;br /&gt;
                          waitingW ++;&lt;br /&gt;
                          okowrite.wait();&lt;br /&gt;
                          waitingW++;&lt;br /&gt;
                          buffer.enqueue(val);&lt;br /&gt;
                          oktoread.signal();&lt;br /&gt;
                 buffer.enqueue(val);&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       procedure entry read () {&lt;br /&gt;
                 &lt;br /&gt;
                 if (buffer.len() == 0)&lt;br /&gt;
                           waitingR++;&lt;br /&gt;
                           oktoread.wait();&lt;br /&gt;
                           waitingR--;&lt;br /&gt;
                           buffer.dequeue();&lt;br /&gt;
                 buffer.dequeue();&lt;br /&gt;
                 oktowrite.signal();&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
        procedure entry resize (n) {&lt;br /&gt;
&lt;br /&gt;
                 buffer=(int*)realloc(n*sizeof(int);&lt;br /&gt;
                 while (waitingW&amp;gt;0)&lt;br /&gt;
                       oktowrite.signal()&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio 2==&lt;br /&gt;
Appunti:&lt;br /&gt;
Si può usare semplicemente il message passing a coda ma inserire in uno stack i messaggi che arrivano.&lt;br /&gt;
Nella recv si può automandarsi un messaggio con un tag particolare per sapere quando abbiamo letto tutti i messaggi.&lt;br /&gt;
--[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 13:49, 9 May 2017 (CEST)&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2015.01.20&amp;diff=1890</id>
		<title>Prova teorica 2015.01.20</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_teorica_2015.01.20&amp;diff=1890"/>
		<updated>2017-05-23T08:09:13Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Testo: [http://www.cs.unibo.it/~renzo/so/compiti/2015.01.20.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
== Esercizio c.1 ==&lt;br /&gt;
===Soluzione di S.G===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Esercizio c.1: Scrivere il monitor lwlrbb. Il monitor deve implementare le seguenti procedure entry:&lt;br /&gt;
 * void write(generic_type val);&lt;br /&gt;
 * generic_type read(void);&lt;br /&gt;
 * Il lwlrbb si comporta come un bounded buffer di MAX elementi che coordina l'attivita' di numerosi processi&lt;br /&gt;
 * produttori/scrittori e numerosi lettori/consumatori. lwlrbb ammette un numero massimo (sempre MAX) di lettori &lt;br /&gt;
 * e scrittori in attesa. Se il buffer e' vuoto e ci sono piu' gia' MAX lettori in attesa, il lettore che e' in &lt;br /&gt;
 * attesa da piu' tempo esce resituendo NULL. In ugual modo se il buffer e' completamente pieno e ci sono gia' MAX &lt;br /&gt;
 * scrittori che attendono di scrivere viene perduto il valore che da piu' tempo nel buffer attende di venir letto, &lt;br /&gt;
 * il primo processo in attesa di scrivere puo' cosi' scrivere il suo elemento nel buffer e sbloccarsi.&lt;br /&gt;
 */&lt;br /&gt;
#define MAX &lt;br /&gt;
&lt;br /&gt;
monitor lwlrbb{&lt;br /&gt;
	generic_type bb[];&lt;br /&gt;
	int count, rear, front, nw, nr;&lt;br /&gt;
	bool exitNull;&lt;br /&gt;
	conditions lw, lr;&lt;br /&gt;
	&lt;br /&gt;
	void lwlrbb(void){&lt;br /&gt;
		bb = new generic_type[MAX];&lt;br /&gt;
		exitNull = FALSE;&lt;br /&gt;
		rear = count = front = nw = nr = 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry void write(generic_type val){&lt;br /&gt;
		if(count == MAX){				// Il buffer è completamente pieno&lt;br /&gt;
			if(nw == MAX){				// ci sono già MAX scrittori che attendono di scrivere&lt;br /&gt;
				rear = (rear + 1) % MAX;	// Salto l'elemento da leggere da più tempo&lt;br /&gt;
				count--;&lt;br /&gt;
				lw.signal();			// il primo processo in attesa di scrivere puo' sbloccarsi.&lt;br /&gt;
			}&lt;br /&gt;
			nw++;&lt;br /&gt;
			lw.wait();&lt;br /&gt;
			nw--;&lt;br /&gt;
		}&lt;br /&gt;
		bb[front] = val;				// Il buffer non è pieno, scrivo&lt;br /&gt;
		count++;&lt;br /&gt;
		front = (front + 1) % MAX;&lt;br /&gt;
		lr.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry generic_type read(void){&lt;br /&gt;
		generic_type retval;&lt;br /&gt;
		if(count == 0){				// Il buffer è vuoto&lt;br /&gt;
			if(nr == MAX){			// ci sono gia MAX lettori in attesa&lt;br /&gt;
				exitNull = TRUE;	// quindi riattivio il lettore che e' in attesa da piu' tempo, restituendo NULL&lt;br /&gt;
				lr.signal();&lt;br /&gt;
			}&lt;br /&gt;
			nr++;				// incremento il contatore dei lettori in coda&lt;br /&gt;
			lr.wait();			// metto in attesa il lettore&lt;br /&gt;
							// Riprendo l'esecuzione da dove era stata interrotta&lt;br /&gt;
			nr--;				// decremento il contatore dei lettori in coda&lt;br /&gt;
			if(exitNull){			// Controllo se è una richiesta di uscita forzata&lt;br /&gt;
				exitNull = FALSE;&lt;br /&gt;
				return NULL;&lt;br /&gt;
			}&lt;br /&gt;
		}			&lt;br /&gt;
		count--;				// Il buffer non è vuoto, leggo&lt;br /&gt;
		retval = bb[rear];&lt;br /&gt;
		rear = (rear + 1) % MAX;&lt;br /&gt;
		lw.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 14:39, 18 November 2016 (CET)&amp;lt;br&amp;gt;&lt;br /&gt;
Ho scritto una possibile soluzione dell'esercizio c.1. Iniziare qui una discussione&lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;egrave; uno stack! bounded buffer deve implementare una coda.''' [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 19:29, 21 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Ho implementato la coda. [[User:S.G|S.G]] ([[User talk:S.G|talk]]) 10:12, 22 November 2016 (CET)&lt;br /&gt;
----&lt;br /&gt;
===Soluzione di BAGG===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 42&lt;br /&gt;
&lt;br /&gt;
monitor lwlrbb {&lt;br /&gt;
    generic_type bb[] ;&lt;br /&gt;
    int count, front, rear ; 	/* rispettivamente: numero elementi, dove scrivere nel buffer, dove leggere nel buffer */&lt;br /&gt;
    int nw, nr ; 		/* rispettivamente numero di writer e reader */&lt;br /&gt;
    bool exit ; 		/* server ai reader per sapere se devono ritornare NULL al loro rientro nel monitor  */&lt;br /&gt;
    condition canr, canw ;&lt;br /&gt;
&lt;br /&gt;
    lwlrbb(void) {&lt;br /&gt;
        bb = new generic_type[MAX] ;&lt;br /&gt;
        count = front = rear = nw = nr = exit = 0 ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    entry void write(generic_type val) {&lt;br /&gt;
        if(count == MAX) {			/* se count è MAX non si può scrivere  */&lt;br /&gt;
            if(nw == MAX) {			/* se la coda è piena devo fare spazio */	&lt;br /&gt;
                rear = (rear + 1)%MAX ;         /* rear indica il più vecchio elemento ancora da leggere, lo incremento --&amp;gt; salto l'elemento */&lt;br /&gt;
                count -= 1 ;&lt;br /&gt;
                nw += 1 ;			/* incremento prima perchè anche se la coda è piena ora dopo la signal ci sarà un posto...  */&lt;br /&gt;
                canw.signal() ;			/* ora il primo che aspettava può scrivere --&amp;gt; lo sveglio  */&lt;br /&gt;
                canw.wait() ;&lt;br /&gt;
                nw -= 1 ;&lt;br /&gt;
            } else {				/* se la coda non è piena devo comunque aspettare...  */&lt;br /&gt;
                nw += 1 ;&lt;br /&gt;
                canw.wait() ;&lt;br /&gt;
                nw -=1 ;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
	bb[front] = val ;					&lt;br /&gt;
        front = (front + 1)%MAX ;&lt;br /&gt;
        count += 1 ;&lt;br /&gt;
        canr.signal() ;				/* potrebbe esserci un reader che aspetta --&amp;gt; segnalo che ho scritto e si può leggere  */&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    entry generic_type read(void) {&lt;br /&gt;
        if(count == 0) {			/* se non c'è nulla da leggere allora devo aspettare  */&lt;br /&gt;
            if(nr == MAX) {			/* se la coda è piena setto exit, che i reader controllano per sapere se sono stati svegliati per ritornare NULL  */&lt;br /&gt;
                exit = 1 ;&lt;br /&gt;
                canr.signal() ;		        /* sveglio il condannato...  */&lt;br /&gt;
            } nr += 1 ;				/* mi accodo... */&lt;br /&gt;
            canr.wait() ;&lt;br /&gt;
            nr -= 1 ;&lt;br /&gt;
            if(exit) {				/* se sono il condannato resetto la variabile ed esco...  */&lt;br /&gt;
                 exit = 0 ;&lt;br /&gt;
                 return NULL ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        generic_type r = bb[rear] ;&lt;br /&gt;
        rear = (rear + 1)%MAX ;&lt;br /&gt;
        count -= 1 ;&lt;br /&gt;
        canw.signal() ;				/* ho letto, quindi si è liberato un posto e almeno un writer può scrivere... */&lt;br /&gt;
        return r ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di FedericoB===&lt;br /&gt;
Pseudocodice simil python&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
monitor lwlrbb&lt;br /&gt;
	queue buf&lt;br /&gt;
	contion ok2read, ok2write; int wr=0; int ww=0&lt;br /&gt;
&lt;br /&gt;
proc entry write(val)&lt;br /&gt;
	if (buf.len()) &amp;gt;= BUFSIZE): &lt;br /&gt;
		if (ww&amp;gt;=max): &lt;br /&gt;
			ok2write.signal()&lt;br /&gt;
		else: &lt;br /&gt;
			w++&lt;br /&gt;
			ok2write.wait()&lt;br /&gt;
			w--&lt;br /&gt;
	if (buf.len() &amp;gt;= BUFSIZE):&lt;br /&gt;
		buf.deque()&lt;br /&gt;
		buf.enqueue(val)&lt;br /&gt;
		ok2read.signal()&lt;br /&gt;
&lt;br /&gt;
proc entry read()&lt;br /&gt;
	if (buf.len()==0):&lt;br /&gt;
		if (wr&amp;gt;=max): &lt;br /&gt;
			//il primo lettore deve usire&lt;br /&gt;
			ok2read.signal()&lt;br /&gt;
			wr++&lt;br /&gt;
			ok2read.wait()&lt;br /&gt;
			wr--&lt;br /&gt;
	if (buf.len()&amp;gt;0):&lt;br /&gt;
		retval = buf.dequeue()&lt;br /&gt;
		ok2write.signal()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di sav, correggetemi se sbaglio ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
monitor lwlbb &lt;br /&gt;
{&lt;br /&gt;
      buffer buf, wr  //buf = buffer di elementi e wr buffer di lettori&lt;br /&gt;
      condition oktoread, oktowrite&lt;br /&gt;
   &lt;br /&gt;
  Procedure entry read {&lt;br /&gt;
  &lt;br /&gt;
       if ( wr.len() &amp;lt; MAXLETTORI)&lt;br /&gt;
           if (buf.len() == 0)&lt;br /&gt;
                wr. enqueue(lettore)&lt;br /&gt;
                oktoread.wait(lettore)&lt;br /&gt;
                wr.dequeue(lettore)&lt;br /&gt;
                buf.dequeue()&lt;br /&gt;
           oktoread.signal()&lt;br /&gt;
       wr.dequeue()&lt;br /&gt;
       wr.enqueue(lettore)&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   procedure entry write (val) {        //lo scrittore non resterà mai in attesa perché se non c'è spazio nel buffer toglie &lt;br /&gt;
                                        //il primo elemento inserito e mette il suo nuovo e sblocca un eventuale lettore in attesa&lt;br /&gt;
&lt;br /&gt;
        if (buf.len()&amp;lt; MAXBUFFER)&lt;br /&gt;
                 buf.enqueue(val)&lt;br /&gt;
                 oktoread.signal()&lt;br /&gt;
        buf.dequeue()&lt;br /&gt;
        buf.enqueue(val)&lt;br /&gt;
        oktoread.signal()&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio c.2 ==&lt;br /&gt;
===Soluzione di S.G===&lt;br /&gt;
a) Si consideri la funzione atomica dualshift(a,b) che opera su due operandi di tipo byte passati per indirizzo. L'operazione fa lo shift a&lt;br /&gt;
destra dei due operandi. Il bit piu' significativo di a viene posto a zero, il bit piu' significativo di b diviene quello che all'atto della&lt;br /&gt;
attivazione di dualshift era il bit meno significativo di a.&lt;br /&gt;
es. se a vale 6 e b vale 4 dopo la chiamata di dualshift(a,b) a vale 3 e b 2. Se a vale 5 e b 6 dopo la chiamata dualshift (a,b) a vale 2&lt;br /&gt;
e b vale 131 (128+3).&lt;br /&gt;
La funzione dualshift puo' essere usata al posto della test&amp;amp;set per la sincronizzazione fra processi? Dimostrare la risposta.&lt;br /&gt;
b) Si consideri ora la funzione andor(a,b) che opera su due opera su due parametri di tipo booleano passati per indirizzo e cosi'&lt;br /&gt;
definita:&lt;br /&gt;
andor(a,b)=&amp;lt;c=a or b; b=a and b; a=c&amp;gt;&lt;br /&gt;
Puo' la funzione andor essere usata al posto della test&amp;amp;set per la sincronizzazione fra processi? Dimostrare la risposta.&lt;br /&gt;
Si ricorda che le operazioni di assegnazione di valori costanti a variabili vengono considerati atomici.&lt;br /&gt;
&lt;br /&gt;
Svolgimento&lt;br /&gt;
&lt;br /&gt;
a) Non è possibile utilizzare la funzione atomica dualshift(a,b) in quanto per la definizione di test&amp;amp;set(a,b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
test&amp;amp;set(a,b){&lt;br /&gt;
    a = b;&lt;br /&gt;
    b = X;   // Dove X è un valore costante&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La funzione dualshift dovrebbe memorizzare (in qualche modo) il valore precedente di a (o b), e successivamente settare a (o b) ad un valore costante. Questo non accade perchè la stessa funzione divide per 2 i valori di a e b ogni volta che viene richiamata (caso particolare in cui venga copiato il bit meno significativo di a nel bit più significativo di b). Quindi è impossibile soddisfare la richiesta.&lt;br /&gt;
&lt;br /&gt;
b) La funzione andor(a,b) può essere utilizzata al posto della test&amp;amp;set per la sincronizzazione fra processi.&lt;br /&gt;
Dimostrazione.&lt;br /&gt;
La funzione andor(a,b) è definita come segue:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
andor(a, b){&lt;br /&gt;
	c = a | b;&lt;br /&gt;
	b = b &amp;amp; a;&lt;br /&gt;
	a = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Posto a = 0, non avremo altro che:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
andor(a, b){&lt;br /&gt;
	c = b;&lt;br /&gt;
	b = 0;&lt;br /&gt;
	a = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quindi la funzione andor, non è altro che una semplice test&amp;amp;set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
a = 0;&lt;br /&gt;
b = 1;&lt;br /&gt;
&lt;br /&gt;
Process P {&lt;br /&gt;
	do{&lt;br /&gt;
		andor(a, b);&lt;br /&gt;
	} while(!a);&lt;br /&gt;
	//critical section&lt;br /&gt;
	b = 1;&lt;br /&gt;
	// non-critical section&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 14:39, 18 November 2016 (CET)&amp;lt;br&amp;gt;&lt;br /&gt;
Ho scritto una possibile soluzione dell'esercizio c.2. Iniziare qui una discussione&lt;br /&gt;
&lt;br /&gt;
'''a &amp;amp;egrave; errato, pensateci meglio. Per B la variabile a va indicata come locale al processo P (generico) che deve avere un loop infinito.''' [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 19:25, 21 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Quindi una soluzione del genere potrebbe andar bene? [[User:S.G|S.G]] ([[User talk:S.G|talk]]) 09:23, 22 November 2016 (CET)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
b = 0;&lt;br /&gt;
&lt;br /&gt;
Process P {&lt;br /&gt;
	do{&lt;br /&gt;
		a = 1;&lt;br /&gt;
		dualshift(a, b);&lt;br /&gt;
	} while(b != 128);&lt;br /&gt;
	//critical section&lt;br /&gt;
	b = 0;&lt;br /&gt;
	// non-critical section&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
===Soluzione di FedericoB===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
dualshift(a,b) |xxxxxxxx|yyyyyyyy| -&amp;gt; |0xxxxxxx|xyyyyyyy|&lt;br /&gt;
G=1&lt;br /&gt;
MUTEXIN&lt;br /&gt;
 do:&lt;br /&gt;
   L=0&lt;br /&gt;
   dualshift(G,L)&lt;br /&gt;
 while L==0;&lt;br /&gt;
MUTEXOUT&lt;br /&gt;
G=1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio g.1 ==&lt;br /&gt;
&lt;br /&gt;
a) Sia data la seguente stringa di riferimenti: 123451234123121.&lt;br /&gt;
mostrare il comportamento degli algoritmi MIN e LRU quando operano su una memoria di 3 frame.&lt;br /&gt;
b) Data una memoria di 4 frame contenente la pagina 4 nel frame 1, la pagina 3 nel frame 2, la pagina 2 nel frame 3 e infine la&lt;br /&gt;
pagina 1 nel frame 4. Mostrare una stringa di riferimenti di un programma che usi 5 pagine (esiste la pagina 5 non ancora mappata in&lt;br /&gt;
memoria oltre alle 4 cariate nei frame) e che consenta alla fine dell'esecuzione di avere tutte le pagine nel frame di indice&lt;br /&gt;
corrispondente. La pagina 1 nel frame 1, la pagina 2 nel frame 2 e cosi' via.&lt;br /&gt;
&lt;br /&gt;
Esecuzione algoritmo MIN&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
| 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 1 | 2 | 1 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
|   | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
|   |   | 3 | 4 | 5 | 5 | 5 | 3 | 4 | 4 | 4 | 3 | 3 | 3 | 3 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esecuzione algoritmo LRU&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
| 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 1 | 2 | 1 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
| 1 | 1 | 1 | 4 | 4 | 4 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
|   | 2 | 2 | 2 | 5 | 5 | 5 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
|   |   | 3 | 3 | 3 | 1 | 1 | 1 | 4 | 4 | 4 | 3 | 3 | 3 | 3 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una possibile sequenza utilizzando l'algoritmo con sostituzione FIFO&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
| 4 | 3 | 2 | 1 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 |&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 12:19, 19 November 2016 (CET)&amp;lt;br&amp;gt;&lt;br /&gt;
Ho scritto una possibile soluzione dell'esercizio g.1. Iniziare qui una discussione&lt;br /&gt;
&lt;br /&gt;
'''Cosa significa proporre a novembre le risposte a quesiti relativi a argomenti che spieghero' a marzo 2017?'''[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 19:20, 21 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Mi scuso per l'inconveniente, avendo seguito il corso di SO 2015/2016 ho pensato di creare una sezione PROVE SVOLTE che fosse ben visibile a tutti i corsi sia per gli anni precedenti sia per gli anni successi&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 09:17, 22 November 2016 (CET)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Esercizio g.2 ==&lt;br /&gt;
&lt;br /&gt;
a) Se un sistema ha una RAM molto ampia puo' non essere utile usare la memoria virtuale. In questo caso ha senso egualmente&lt;br /&gt;
usare la paginazione di memoria? Perche'?&lt;br /&gt;
&lt;br /&gt;
b) Perche' i metodi di sincronizzazione tipo test&amp;amp;set (detti anche spinlock) assumono grande rilevanza nella scrittura di sistemi&lt;br /&gt;
operativi multiprocessore?&lt;br /&gt;
&lt;br /&gt;
c) Confrontare gli alogritmi di scheduling roud robin e a priorita' statica. Indicare in quali casi sono da usare algoritmi di tipo round&lt;br /&gt;
robin e quando quelli a priorita' statica.&lt;br /&gt;
&lt;br /&gt;
Svolgimento&lt;br /&gt;
&lt;br /&gt;
a)	Paginazione è un metodo di gestione della memoria che permette che lo spazio degli indirizzi fisici di un processo&lt;br /&gt;
	non sia contiguo, inoltre ha i seguenti vantaggi:&lt;br /&gt;
	- riduce il fenomeno della frammentazione interna&lt;br /&gt;
	- minimizza (elimina) il fenomeno della frammentazione esterna&lt;br /&gt;
&lt;br /&gt;
b)	Perchè permette di risolve il problema della sezione critica in modo relativamente semplice. Infatti l'istruzione&lt;br /&gt;
	test&amp;amp;set è eseguita atomicamente, cioè come un'unita non soggetta a interruzzioni; quindi se si eseguono contemporaneamente&lt;br /&gt;
	due istruzioni test&amp;amp;set, ciascuna su processori diversi, queste vengono eseguite in modo sequenziale in un ordine arbitrario.&lt;br /&gt;
&lt;br /&gt;
c)	Scheduling a priorità statica associa una priorità a ogni processo e si assegna la CPU&lt;br /&gt;
	al processo con priorità più alta; i processi con priorità uguali si ordinano secondo una politica&lt;br /&gt;
	FCFS. Questo algoritmo può essere sia con prelazione sia senza prelazione, inoltre soffre dell'attesa&lt;br /&gt;
	indefinita (starvation). Infatti un flusso costante di processi con priorità maggiore può impedire a &lt;br /&gt;
	un processo con priorità più bassa di accedere alla CPU. E' possibile utilizzare questo algoritmo quando&lt;br /&gt;
	alcuni processi hanno più importanza di altri. es: nel caso di sistemi multimediali, come una smart TV, il&lt;br /&gt;
	processo di riproduzione video è più importante rispetto ad un processo gestore di posta, altrimenti il flusso video&lt;br /&gt;
	potrebbe essere discontinuo.&lt;br /&gt;
	&lt;br /&gt;
	Scheduling circolare (round-robin) è un algoritmo con prelazione in cui ogni processo viene eseguito al massimo&lt;br /&gt;
	per un quanto di tempo. E' bene che il quanto di tempo sia maggiore del tempo necessario al cambio di contesto.&lt;br /&gt;
	Questo algoritmo a differenza dello scheduling a priorità statica non soffre di starvation. E' possibile utilizzare&lt;br /&gt;
	questo algoritmo in sistemi in cui si pretende un finto parallelismo. es: nel caso in cui più studenti accedano ad &lt;br /&gt;
	una determinata macchina del laboratorio.&lt;br /&gt;
&lt;br /&gt;
[[User:S.G|S.G]] ([[User talk:S.G|talk]]) 11:24, 21 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
'''Cosa significa proporre a novembre le risposte a quesiti relativi a argomenti che spieghero' nel secondo semestre?'''[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 19:21, 21 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Mi scuso per l'inconveniente, avendo seguito il corso di SO 2015/2016 ho pensato di creare una sezione PROVE SVOLTE che fosse ben visibile a tutti i corsi sia per gli anni precedenti sia per gli anni successi. [[User:S.G|S.G]] ([[User talk:S.G|talk]]) 09:19, 22 November 2016 (CET)&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.02.09&amp;diff=784</id>
		<title>ProvaTeorica 2012.02.09</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.02.09&amp;diff=784"/>
		<updated>2014-07-14T12:32:29Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Esercizio 1: Il monitor seq da implementare deve fornire due procedure entry:&lt;br /&gt;
procedure entry void enter(void);&lt;br /&gt;
procedure entry void exit(void);&lt;br /&gt;
I processi chiamano i servizi di seq come segue:&lt;br /&gt;
….&lt;br /&gt;
seq.enter();&lt;br /&gt;
// codice controllato da seq&lt;br /&gt;
seq.exit();&lt;br /&gt;
….&lt;br /&gt;
Tutti i processi che ne facciano rischiesta possono entrare nel codice controllato da seq contemporaneamente (questa &lt;br /&gt;
NON e' una sezione critica!). Exit deve garantire che i processi escano dal codice controllato tutti insieme. Per &lt;br /&gt;
esempio se tre processi a,b e c chiamano seq.enter ogni processo non potra' completare la exit se prima tutti gli altri &lt;br /&gt;
due non hanno chiamato la exit. Se nel frattempo altri processi dovessero chiamare la seq.enter occorrera' attendere &lt;br /&gt;
anche questi ultimi.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	int processi=0;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		processi++&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		processi--&lt;br /&gt;
		oktoexit.signal();&lt;br /&gt;
		while(processi!=0)&lt;br /&gt;
		{&lt;br /&gt;
			oktoexit.wait();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	int processi=0;&lt;br /&gt;
        int inattesa=0 ;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		processi++&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
                &lt;br /&gt;
		processi-- ;&lt;br /&gt;
		&lt;br /&gt;
		while(processi!=0)&lt;br /&gt;
		{&lt;br /&gt;
		    inattesa++ ;&lt;br /&gt;
                    oktoexit.wait();&lt;br /&gt;
                    inattesa--;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
                oktoexit.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.02.09&amp;diff=783</id>
		<title>ProvaTeorica 2012.02.09</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.02.09&amp;diff=783"/>
		<updated>2014-07-14T12:30:47Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Esercizio 1: Il monitor seq da implementare deve fornire due procedure entry:&lt;br /&gt;
procedure entry void enter(void);&lt;br /&gt;
procedure entry void exit(void);&lt;br /&gt;
I processi chiamano i servizi di seq come segue:&lt;br /&gt;
….&lt;br /&gt;
seq.enter();&lt;br /&gt;
// codice controllato da seq&lt;br /&gt;
seq.exit();&lt;br /&gt;
….&lt;br /&gt;
Tutti i processi che ne facciano rischiesta possono entrare nel codice controllato da seq contemporaneamente (questa &lt;br /&gt;
NON e' una sezione critica!). Exit deve garantire che i processi escano dal codice controllato tutti insieme. Per &lt;br /&gt;
esempio se tre processi a,b e c chiamano seq.enter ogni processo non potra' completare la exit se prima tutti gli altri &lt;br /&gt;
due non hanno chiamato la exit. Se nel frattempo altri processi dovessero chiamare la seq.enter occorrera' attendere &lt;br /&gt;
anche questi ultimi.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	int processi=0;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		processi++&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		processi--&lt;br /&gt;
		oktoexit.signal();&lt;br /&gt;
		while(processi!=0)&lt;br /&gt;
		{&lt;br /&gt;
			oktoexit.wait();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	int processi=0;&lt;br /&gt;
        int inattesa=0 ;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		processi++&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
                &lt;br /&gt;
		processi-- ;&lt;br /&gt;
		&lt;br /&gt;
		while(processi!=0)&lt;br /&gt;
		{&lt;br /&gt;
		    inattesa++ ;&lt;br /&gt;
                    oktoexit.wait();&lt;br /&gt;
                    inattesa=0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
                oktoexit.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=770</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=770"/>
		<updated>2014-06-01T18:05:38Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
#define ANDATA 0&lt;br /&gt;
#define RITORNO 1 &lt;br /&gt;
condition oktoenterponte, oktoexitponte ;&lt;br /&gt;
int waiting, crossing, medita ;&lt;br /&gt;
&lt;br /&gt;
procedure entry enterponte(ANDATA)&lt;br /&gt;
  {&lt;br /&gt;
		&lt;br /&gt;
	if ( crssing(ritorno) &amp;gt; = 0 || crossing(ANDATA) &amp;gt; maxSantuario || waiting (RITORNO)&amp;gt;0 )     # per evitare deadlock&lt;br /&gt;
										     # deve essere maxSantuario &amp;gt;= maxPonte														&lt;br /&gt;
		waiting (ANDATA)++ ;						     # crossing(ANDATA) &amp;gt;= maxSantuario															&lt;br /&gt;
		oktoenterponte(ANDATA).wait();&lt;br /&gt;
		waiting(ANDATA)-- ;&lt;br /&gt;
	crossing(ANDATA)++ ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
procedure entry exitponte(ANDATA)         # Entra nel santuario&lt;br /&gt;
  {&lt;br /&gt;
    if ( medita == maxSantuario )&lt;br /&gt;
		oktoexitponte(ANDATA).wait() ;&lt;br /&gt;
	 crossing(ANDATA)--;&lt;br /&gt;
	 medita++ ;&lt;br /&gt;
	 if (waiting(RITORNO) &amp;gt; 0 ) &amp;amp;&amp;amp; (crossing(ANDATA)==0)&lt;br /&gt;
		oktoenterponte(RITORNO).signal();&lt;br /&gt;
	 oktoenterponte(ANDATA).signal();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
rocedure entry enterponte(RITORNO)       # Esci dal santuario&lt;br /&gt;
  {&lt;br /&gt;
    if (crossing(ANDATA)&amp;gt;0 || crossing(RTORNO) &amp;gt;= maxPonte)&lt;br /&gt;
	    wiiting(RITORNO)++;&lt;br /&gt;
		oktoenterponte(RITORNO).wait();&lt;br /&gt;
		waiting(RITORNO)--;&lt;br /&gt;
	medita--;&lt;br /&gt;
	crossing(RITORNO)++;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
procedure entry exitponte(RITORNO) &lt;br /&gt;
  {&lt;br /&gt;
	crossing(RITORNO)--;&lt;br /&gt;
	if (waiting(RITORNO)&amp;gt;0) &lt;br /&gt;
		oktoexitponte(RITORNO).signal()&lt;br /&gt;
	oktoenterponte(ANDATA).signal() ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Correggetemi se sbaglio.&lt;br /&gt;
&lt;br /&gt;
 STARVATION : non l'ho individuata. &lt;br /&gt;
             Io penso che se al santuario recitassero tutti il rosario e confessassero molti peccati, allora si. &lt;br /&gt;
 DEADLOCK : se la portata del ponte era piu' grande della portata del santuario si aveva deadlock. &lt;br /&gt;
           L'ho eliminato mettendo in wait se crossing(ANDATA) &amp;gt; maxSantuario&lt;br /&gt;
*/&lt;br /&gt;
save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
&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 fedeli=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 MAXPONTE o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if( (dir==0 &amp;amp;&amp;amp; fedeli==MAXSANTUARIO ) || turn==(1-dir) || visitatori[dir]==MAXPONTE || !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; (MAXPONTE - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // MAXPONTE 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;
if(dir==0){fedeli++;}&lt;br /&gt;
if(dir==1){fedeli--;}&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;
 primo = (dir == 0 &amp;amp;&amp;amp; fedeli &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; ( q.head()==0 || visitatori[0]==0 ))&lt;br /&gt;
 secondo = (dir == 1 &amp;amp;&amp;amp; (q.head()==0 || visitatori[1]==0 )	&lt;br /&gt;
&lt;br /&gt;
	      if(primo || secondo){                                               &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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=769</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=769"/>
		<updated>2014-06-01T18:04:52Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
#define ANDATA 0&lt;br /&gt;
#define RITORNO 1 &lt;br /&gt;
condition oktoenterponte, oktoexitponte ;&lt;br /&gt;
int waiting, crossing, medita ;&lt;br /&gt;
&lt;br /&gt;
procedure entry enterponte(ANDATA)&lt;br /&gt;
  {&lt;br /&gt;
		&lt;br /&gt;
	if ( crssing(ritorno) &amp;gt; = 0 || crossing(ANDATA) &amp;gt;= maxSantuario || waiting (RITORNO)&amp;gt;0 )     # per evitare deadlock&lt;br /&gt;
										     # deve essere maxSantuario &amp;gt;= maxPonte														&lt;br /&gt;
		waiting (ANDATA)++ ;						     # crossing(ANDATA) &amp;gt;= maxSantuario															&lt;br /&gt;
		oktoenterponte(ANDATA).wait();&lt;br /&gt;
		waiting(ANDATA)-- ;&lt;br /&gt;
	crossing(ANDATA)++ ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
procedure entry exitponte(ANDATA)         # Entra nel santuario&lt;br /&gt;
  {&lt;br /&gt;
    if ( medita == maxSantuario )&lt;br /&gt;
		oktoexitponte(ANDATA).wait() ;&lt;br /&gt;
	 crossing(ANDATA)--;&lt;br /&gt;
	 medita++ ;&lt;br /&gt;
	 if (waiting(RITORNO) &amp;gt; 0 ) &amp;amp;&amp;amp; (crossing(ANDATA)==0)&lt;br /&gt;
		oktoenterponte(RITORNO).signal();&lt;br /&gt;
	 oktoenterponte(ANDATA).signal();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
rocedure entry enterponte(RITORNO)       # Esci dal santuario&lt;br /&gt;
  {&lt;br /&gt;
    if (crossing(ANDATA)&amp;gt;0 || crossing(RTORNO) &amp;gt;= maxPonte)&lt;br /&gt;
	    wiiting(RITORNO)++;&lt;br /&gt;
		oktoenterponte(RITORNO).wait();&lt;br /&gt;
		waiting(RITORNO)--;&lt;br /&gt;
	medita--;&lt;br /&gt;
	crossing(RITORNO)++;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
procedure entry exitponte(RITORNO) &lt;br /&gt;
  {&lt;br /&gt;
	crossing(RITORNO)--;&lt;br /&gt;
	if (waiting(RITORNO)&amp;gt;0) &lt;br /&gt;
		oktoexitponte(RITORNO).signal()&lt;br /&gt;
	oktoenterponte(ANDATA).signal() ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Correggetemi se sbaglio.&lt;br /&gt;
&lt;br /&gt;
 STARVATION : non l'ho individuata. &lt;br /&gt;
             Io penso che se al santuario recitassero tutti il rosario e confessassero molti peccati, allora si. &lt;br /&gt;
 DEADLOCK : se la portata del ponte era piu' grande della portata del santuario si aveva deadlock. &lt;br /&gt;
           L'ho eliminato mettendo in wait se crossing(ANDATA) &amp;gt;= maxSantuario&lt;br /&gt;
*/&lt;br /&gt;
save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
&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 fedeli=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 MAXPONTE o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if( (dir==0 &amp;amp;&amp;amp; fedeli==MAXSANTUARIO ) || turn==(1-dir) || visitatori[dir]==MAXPONTE || !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; (MAXPONTE - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // MAXPONTE 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;
if(dir==0){fedeli++;}&lt;br /&gt;
if(dir==1){fedeli--;}&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;
 primo = (dir == 0 &amp;amp;&amp;amp; fedeli &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; ( q.head()==0 || visitatori[0]==0 ))&lt;br /&gt;
 secondo = (dir == 1 &amp;amp;&amp;amp; (q.head()==0 || visitatori[1]==0 )	&lt;br /&gt;
&lt;br /&gt;
	      if(primo || secondo){                                               &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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=768</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=768"/>
		<updated>2014-06-01T18:04:15Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
#define ANDATA 0&lt;br /&gt;
#define RITORNO 1 &lt;br /&gt;
condition oktoenterponte, oktoexitponte ;&lt;br /&gt;
int waiting, crossing, medita ;&lt;br /&gt;
&lt;br /&gt;
procedure entry enterponte(ANDATA)&lt;br /&gt;
  {&lt;br /&gt;
		&lt;br /&gt;
	if ( crssing(ritorno) &amp;gt; = 0 || crossing(ANDATA) &amp;gt;= maxSantuario || waiting (RITORNO)&amp;gt;0 )     # per evitare deadlock&lt;br /&gt;
										     # deve essere maxSantuario &amp;gt;= maxPonte														&lt;br /&gt;
		waiting (ANDATA)++ ;						     # crossing(ANDATA) &amp;gt;= maxSantuario															&lt;br /&gt;
		oktoenterponte(ANDATA).wait();&lt;br /&gt;
		waiting(ANDATA)-- ;&lt;br /&gt;
	crossing(ANDATA)++ ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
procedure entry exitponte(ANDATA)         # Entra nel santuario&lt;br /&gt;
  {&lt;br /&gt;
    if ( medita == maxSantuario )&lt;br /&gt;
		oktoexitponte(ANDATA).wait() ;&lt;br /&gt;
	 crossing(ANDATA)--;&lt;br /&gt;
	 medita++ ;&lt;br /&gt;
	 if (waiting(RITORNO) &amp;gt; 0 ) &amp;amp;&amp;amp; (crossing(ANDATA)==0)&lt;br /&gt;
		oktoenterponte(RITORNO).signal();&lt;br /&gt;
	 oktoenterponte(ANDATA).signal();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
rocedure entry enterponte(RITORNO)       # Esci dal santuario&lt;br /&gt;
  {&lt;br /&gt;
    if (crossing(ANDATA)&amp;gt;0 || crossing(RTORNO) &amp;gt;= maxPonte)&lt;br /&gt;
	    wiiting(RITORNO)++;&lt;br /&gt;
		oktoenterponte(RITORNO).wait();&lt;br /&gt;
		waiting(RITORNO)--;&lt;br /&gt;
	medita--;&lt;br /&gt;
	crossing(RITORNO)++;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
procedure entry exitponte(RITORNO) &lt;br /&gt;
  {&lt;br /&gt;
	crossing(RITORNO)--;&lt;br /&gt;
	if (waiting(RITORNO)&amp;gt;0) &lt;br /&gt;
		oktoexitponte(RITORNO).signal()&lt;br /&gt;
	oktoenterponte(ANDATA).signal() ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Correggetemi se sbaglio.&lt;br /&gt;
&lt;br /&gt;
# STARVATION : non l'ho individuata. &lt;br /&gt;
             Io penso che se al santuario recitassero tutti il rosario e confessassero molti peccati, allora si. &lt;br /&gt;
# DEADLOCK : se la portata del ponte era piu' grande della portata del santuario si aveva deadlock. &lt;br /&gt;
           L'ho eliminato mettendo in wait se crossing(ANDATA) &amp;gt;= maxSantuario&lt;br /&gt;
&lt;br /&gt;
save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
&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 fedeli=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 MAXPONTE o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if( (dir==0 &amp;amp;&amp;amp; fedeli==MAXSANTUARIO ) || turn==(1-dir) || visitatori[dir]==MAXPONTE || !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; (MAXPONTE - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // MAXPONTE 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;
if(dir==0){fedeli++;}&lt;br /&gt;
if(dir==1){fedeli--;}&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;
 primo = (dir == 0 &amp;amp;&amp;amp; fedeli &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; ( q.head()==0 || visitatori[0]==0 ))&lt;br /&gt;
 secondo = (dir == 1 &amp;amp;&amp;amp; (q.head()==0 || visitatori[1]==0 )	&lt;br /&gt;
&lt;br /&gt;
	      if(primo || secondo){                                               &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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=767</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=767"/>
		<updated>2014-06-01T18:03:09Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
#define ANDATA 0&lt;br /&gt;
#define RITORNO 1 &lt;br /&gt;
condition oktoenterponte, oktoexitponte ;&lt;br /&gt;
int waiting, crossing, medita ;&lt;br /&gt;
&lt;br /&gt;
procedure entry enterponte(ANDATA)&lt;br /&gt;
  {&lt;br /&gt;
		&lt;br /&gt;
	if ( crssing(ritorno) &amp;gt; = 0 || crossing(ANDATA) &amp;gt;= maxSantuario || waiting (RITORNO)&amp;gt;0 )     # per evitare deadlock&lt;br /&gt;
										     # deve essere maxSantuario &amp;gt;= maxPonte														&lt;br /&gt;
		waiting (ANDATA)++ ;						     # crossing(ANDATA) &amp;gt;= maxSantuario															&lt;br /&gt;
		oktoenterponte(ANDATA).wait();&lt;br /&gt;
		waiting(ANDATA)-- ;&lt;br /&gt;
	crossing(ANDATA)++ ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
procedure entry exitponte(ANDATA)         # Entra nel santuario&lt;br /&gt;
  {&lt;br /&gt;
    if ( medita == maxSantuario )&lt;br /&gt;
		oktoexitponte(ANDATA).wait() ;&lt;br /&gt;
	 crossing(ANDATA)--;&lt;br /&gt;
	 medita++ ;&lt;br /&gt;
	 if (waiting(RITORNO) &amp;gt; 0 ) &amp;amp;&amp;amp; (crossing(ANDATA)==0)&lt;br /&gt;
		oktoenterponte(RITORNO).signal();&lt;br /&gt;
	 oktoenterponte(ANDATA).signal();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
rocedure entry enterponte(RITORNO)       # Esci dal santuario&lt;br /&gt;
  {&lt;br /&gt;
    if (crossing(ANDATA)&amp;gt;0 || crossing(RTORNO) &amp;gt;= maxPonte)&lt;br /&gt;
	    wiiting(RITORNO)++;&lt;br /&gt;
		oktoenterponte(RITORNO).wait();&lt;br /&gt;
		waiting(RITORNO)--;&lt;br /&gt;
	medita--;&lt;br /&gt;
	crossing(RITORNO)++;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
procedure entry exitponte(RITORNO) &lt;br /&gt;
  {&lt;br /&gt;
	crossing(RITORNO)--;&lt;br /&gt;
	if (waiting(RITORNO)&amp;gt;0) &lt;br /&gt;
		oktoexitponte(RITORNO).signal()&lt;br /&gt;
	oktoenterponte(ANDATA).signal() ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Correggetemi se sbaglio.&lt;br /&gt;
&lt;br /&gt;
STARVATION : non l'ho individuata. &lt;br /&gt;
             Io penso che se al santuario recitassero tutti il rosario e confessassero molti peccati, allora si. &lt;br /&gt;
DEADLOCK : se la portata del ponte era piu' grande della portata del santuario si aveva deadlock. &lt;br /&gt;
           L'ho eliminato mettendo in wait se crossing(ANDATA) &amp;gt;= maxSantuario&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
save&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;
&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 fedeli=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 MAXPONTE o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if( (dir==0 &amp;amp;&amp;amp; fedeli==MAXSANTUARIO ) || turn==(1-dir) || visitatori[dir]==MAXPONTE || !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; (MAXPONTE - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // MAXPONTE 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;
if(dir==0){fedeli++;}&lt;br /&gt;
if(dir==1){fedeli--;}&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;
 primo = (dir == 0 &amp;amp;&amp;amp; fedeli &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; ( q.head()==0 || visitatori[0]==0 ))&lt;br /&gt;
 secondo = (dir == 1 &amp;amp;&amp;amp; (q.head()==0 || visitatori[1]==0 )	&lt;br /&gt;
&lt;br /&gt;
	      if(primo || secondo){                                               &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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=766</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=766"/>
		<updated>2014-06-01T18:02:41Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
#define ANDATA 0&lt;br /&gt;
#define RITORNO 1 &lt;br /&gt;
condition oktoenterponte, oktoexitponte ;&lt;br /&gt;
int waiting, crossing, medita ;&lt;br /&gt;
&lt;br /&gt;
procedure entry enterponte(ANDATA)&lt;br /&gt;
  {&lt;br /&gt;
		&lt;br /&gt;
	if ( crssing(ritorno) &amp;gt; = 0 || crossing(ANDATA) &amp;gt;= maxSantuario || waiting (RITORNO)&amp;gt;0 )     # per evitare deadlock&lt;br /&gt;
										     # deve essere maxSantuario &amp;gt;= maxPonte														&lt;br /&gt;
		waiting (ANDATA)++ ;						     # crossing(ANDATA) &amp;gt;= maxSantuario															&lt;br /&gt;
		oktoenterponte(ANDATA).wait();&lt;br /&gt;
		waiting(ANDATA)-- ;&lt;br /&gt;
	crossing(ANDATA)++ ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
procedure entry exitponte(ANDATA)         # Entra nel santuario&lt;br /&gt;
  {&lt;br /&gt;
    if ( medita == maxSantuario )&lt;br /&gt;
		oktoexitponte(ANDATA).wait() ;&lt;br /&gt;
	 crossing(ANDATA)--;&lt;br /&gt;
	 medita++ ;&lt;br /&gt;
	 if (waiting(RITORNO) &amp;gt; 0 ) &amp;amp;&amp;amp; (crossing(ANDATA)==0)&lt;br /&gt;
		oktoenterponte(RITORNO).signal();&lt;br /&gt;
	 oktoenterponte(ANDATA).signal();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
rocedure entry enterponte(RITORNO)       # Esci dal santuario&lt;br /&gt;
  {&lt;br /&gt;
    if (crossing(ANDATA)&amp;gt;0 || crossing(RTORNO) &amp;gt;= maxPonte)&lt;br /&gt;
	    wiiting(RITORNO)++;&lt;br /&gt;
		oktoenterponte(RITORNO).wait();&lt;br /&gt;
		waiting(RITORNO)--;&lt;br /&gt;
	medita--;&lt;br /&gt;
	crossing(RITORNO)++;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
procedure entry exitponte(RITORNO) &lt;br /&gt;
  {&lt;br /&gt;
	crossing(RITORNO)--;&lt;br /&gt;
	if (waiting(RITORNO)&amp;gt;0) &lt;br /&gt;
		oktoexitponte(RITORNO).signal()&lt;br /&gt;
	oktoenterponte(ANDATA).signal() ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Correggetemi se sbaglio.&lt;br /&gt;
&lt;br /&gt;
STARVATION : non l'ho individuata. &lt;br /&gt;
             Io penso che se al santuario recitassero tutti il rosario e confessassero molti peccati, allora si. &lt;br /&gt;
DEADLOCK : se la portata del ponte era piu' grande della portata del santuario si aveva deadlock. &lt;br /&gt;
           L'ho eliminato mettendo in wait se crossing(ANDATA) &amp;gt;= maxSantuario&lt;br /&gt;
&lt;br /&gt;
save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
&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 fedeli=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 MAXPONTE o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if( (dir==0 &amp;amp;&amp;amp; fedeli==MAXSANTUARIO ) || turn==(1-dir) || visitatori[dir]==MAXPONTE || !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; (MAXPONTE - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // MAXPONTE 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;
if(dir==0){fedeli++;}&lt;br /&gt;
if(dir==1){fedeli--;}&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;
 primo = (dir == 0 &amp;amp;&amp;amp; fedeli &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; ( q.head()==0 || visitatori[0]==0 ))&lt;br /&gt;
 secondo = (dir == 1 &amp;amp;&amp;amp; (q.head()==0 || visitatori[1]==0 )	&lt;br /&gt;
&lt;br /&gt;
	      if(primo || secondo){                                               &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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=765</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=765"/>
		<updated>2014-06-01T18:01:39Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
#define ANDATA 0&lt;br /&gt;
#define RITORNO 1 &lt;br /&gt;
condition oktoenterponte, oktoexitponte ;&lt;br /&gt;
int waiting, crossing, medita ;&lt;br /&gt;
&lt;br /&gt;
procedure entry enterponte(ANDATA)&lt;br /&gt;
  {&lt;br /&gt;
		&lt;br /&gt;
	if ( crssing(ritorno) &amp;gt; = 0 || crossing(ANDATA) &amp;gt;= maxSantuario || waiting (RITORNO)&amp;gt;0 )     # per evitare deadlock&lt;br /&gt;
										     # deve essere maxSantuario &amp;gt;= maxPonte														&lt;br /&gt;
		waiting (ANDATA)++ ;						     # crossing(ANDATA) &amp;gt;= maxSantuario															&lt;br /&gt;
		oktoenterponte(ANDATA).wait();&lt;br /&gt;
		waiting(ANDATA)-- ;&lt;br /&gt;
	crossing(ANDATA)++ ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
procedure entry exitponte(ANDATA)         # Entra nel santuario&lt;br /&gt;
  {&lt;br /&gt;
    if ( medita == maxSantuario )&lt;br /&gt;
		oktoexitponte(ANDATA).wait() ;&lt;br /&gt;
	 crossing(ANDATA)--;&lt;br /&gt;
	 medita++ ;&lt;br /&gt;
	 if (waiting(RITORNO) &amp;gt; 0 ) &amp;amp;&amp;amp; (crossing(ANDATA)==0)&lt;br /&gt;
		oktoenterponte(RITORNO).signal();&lt;br /&gt;
	 oktoenterponte(ANDATA).signal();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
rocedure entry enterponte(RITORNO)       # Esci dal santuario&lt;br /&gt;
  {&lt;br /&gt;
    if (crossing(ANDATA)&amp;gt;0 || crossing(RTORNO) &amp;gt;= maxPonte)&lt;br /&gt;
	    wiiting(RITORNO)++;&lt;br /&gt;
		oktoenterponte(RITORNO).wait();&lt;br /&gt;
		waiting(RITORNO)--;&lt;br /&gt;
	medita--;&lt;br /&gt;
	crossing(RITORNO)++;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
procedure entry exitponte(RITORNO) &lt;br /&gt;
  {&lt;br /&gt;
	crossing(RITORNO)--;&lt;br /&gt;
	if (waiting(RITORNO)&amp;gt;0) &lt;br /&gt;
		oktoexitponte(RITORNO).signal()&lt;br /&gt;
	oktoenterponte(ANDATA).signal() ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Correggetemi se sbaglio.&lt;br /&gt;
&lt;br /&gt;
STARVATION : non l'ho individuata. &lt;br /&gt;
             Io penso che se al santuario recitassero tutti il rosario e confessassero molti peccati, allora si. &lt;br /&gt;
DEADLOCK : se la portata del ponte era piu' grande della portata del santuario si aveva deadlock. &lt;br /&gt;
           L'ho eliminato mettendo in wait se crossing(ANDATA) &amp;gt;= maxSantuario&lt;br /&gt;
&lt;br /&gt;
save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
&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 fedeli=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 MAXPONTE o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if( (dir==0 &amp;amp;&amp;amp; fedeli==MAXSANTUARIO ) || turn==(1-dir) || visitatori[dir]==MAXPONTE || !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; (MAXPONTE - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // MAXPONTE 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;
if(dir==0){fedeli++;}&lt;br /&gt;
if(dir==1){fedeli--;}&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;
 primo = (dir == 0 &amp;amp;&amp;amp; fedeli &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; ( q.head()==0 || visitatori[0]==0 ))&lt;br /&gt;
 secondo = (dir == 1 &amp;amp;&amp;amp; (q.head()==0 || visitatori[1]==0 )	&lt;br /&gt;
&lt;br /&gt;
	      if(primo || secondo){                                               &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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.05.24&amp;diff=764</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=764"/>
		<updated>2014-06-01T18:00:03Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor santuario&lt;br /&gt;
{&lt;br /&gt;
#define ANDATA 0&lt;br /&gt;
#define RITORNO 1 &lt;br /&gt;
condition oktoenterponte, oktoexitponte ;&lt;br /&gt;
int waiting, crossing, medita ;&lt;br /&gt;
&lt;br /&gt;
procedure entry enterponte(ANDATA)&lt;br /&gt;
  {&lt;br /&gt;
		&lt;br /&gt;
	if ( crssing(ritorno) &amp;gt; = 0 || crossing(ANDATA) &amp;gt;= maxSantuario || waiting (RITORNO)&amp;gt;0 )     # per evitare deadlock&lt;br /&gt;
																													  # maxSantuario &amp;gt;= maxPonte&lt;br /&gt;
		waiting (ANDATA)++ ;																						# crossing(ANDATA) &amp;gt;= maxSantuario&lt;br /&gt;
		oktoenterponte(ANDATA).wait();&lt;br /&gt;
		waiting(ANDATA)-- ;&lt;br /&gt;
	crossing(ANDATA)++ ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
procedure entry exitponte(ANDATA)         # Entra nel santuario&lt;br /&gt;
  {&lt;br /&gt;
    if ( medita == maxSantuario )&lt;br /&gt;
		oktoexitponte(ANDATA).wait() ;&lt;br /&gt;
	 crossing(ANDATA)--;&lt;br /&gt;
	 medita++ ;&lt;br /&gt;
	 if (waiting(RITORNO) &amp;gt; 0 ) &amp;amp;&amp;amp; (crossing(ANDATA)==0)&lt;br /&gt;
		oktoenterponte(RITORNO).signal();&lt;br /&gt;
	 oktoenterponte(ANDATA).signal();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
rocedure entry enterponte(RITORNO)       # Esci dal santuario&lt;br /&gt;
  {&lt;br /&gt;
    if (crossing(ANDATA)&amp;gt;0 || crossing(RTORNO) &amp;gt;= maxPonte)&lt;br /&gt;
	    wiiting(RITORNO)++;&lt;br /&gt;
		oktoenterponte(RITORNO).wait();&lt;br /&gt;
		waiting(RITORNO)--;&lt;br /&gt;
	medita--;&lt;br /&gt;
	crossing(RITORNO)++;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
procedure entry exitponte(RITORNO) &lt;br /&gt;
  {&lt;br /&gt;
	crossing(RITORNO)--;&lt;br /&gt;
	if (waiting(RITORNO)&amp;gt;0) &lt;br /&gt;
		oktoexitponte(RITORNO).signal()&lt;br /&gt;
	oktoenterponte(ANDATA).signal() ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Correggetemi se sbaglio.&lt;br /&gt;
&lt;br /&gt;
STARVATION : non l'ho individuata. &lt;br /&gt;
             Io penso che se al santuario recitassero tutti il rosario e confessassero molti peccati, allora si. &lt;br /&gt;
DEADLOCK : se la portata del ponte era piu' grande della portata del santuario si aveva deadlock. &lt;br /&gt;
           L'ho eliminato mettendo in wait se crossing(ANDATA) &amp;gt;= maxSantuario&lt;br /&gt;
&lt;br /&gt;
save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
&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 fedeli=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 MAXPONTE o&lt;br /&gt;
 la coda non è vuota aspetta */&lt;br /&gt;
	if( (dir==0 &amp;amp;&amp;amp; fedeli==MAXSANTUARIO ) || turn==(1-dir) || visitatori[dir]==MAXPONTE || !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; (MAXPONTE - 1) ){  // questa condizione &lt;br /&gt;
                        i++;&lt;br /&gt;
			q.dequeue();		   // mi serve per far passare &lt;br /&gt;
			okpassa.signal();	   // MAXPONTE 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;
if(dir==0){fedeli++;}&lt;br /&gt;
if(dir==1){fedeli--;}&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;
 primo = (dir == 0 &amp;amp;&amp;amp; fedeli &amp;lt; MAXSANTUARIO) &amp;amp;&amp;amp; ( q.head()==0 || visitatori[0]==0 ))&lt;br /&gt;
 secondo = (dir == 1 &amp;amp;&amp;amp; (q.head()==0 || visitatori[1]==0 )	&lt;br /&gt;
&lt;br /&gt;
	      if(primo || secondo){                                               &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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.02.22&amp;diff=763</id>
		<title>ProvaTeorica 2014.02.22</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.02.22&amp;diff=763"/>
		<updated>2014-05-30T16:29:17Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Testo: [http://www.cs.unibo.it/~renzo/so/compiti/2014.02.21.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
Esercizio c.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor bbwl {&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktolog;&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	int logging = 0;&lt;br /&gt;
	queue q;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry write (eltype elem) {&lt;br /&gt;
	if (q.length() == MAXELEM || logging)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
	q.enqueue (elem);&lt;br /&gt;
	logging = 1;&lt;br /&gt;
	oktolog.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry eltype log() {&lt;br /&gt;
	if (q.length == 0)&lt;br /&gt;
		oktolog.wait();&lt;br /&gt;
	eltype tmp = q.top();&lt;br /&gt;
	logging = 0;&lt;br /&gt;
	oktoread.signal();&lt;br /&gt;
	return tmp;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry eltype read() {&lt;br /&gt;
	if (q.length == 0 || logging)&lt;br /&gt;
		oktoread.wait();&lt;br /&gt;
	eltype tmp = q.dequeue();&lt;br /&gt;
	oktowrite.signal();&lt;br /&gt;
	return tmp;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio c.1&lt;br /&gt;
 questa è la mia interpretazione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
condition oktowrite, oktoread, oktolog ;&lt;br /&gt;
queue buffer = MAXELEM ;&lt;br /&gt;
queue Llogger ;&lt;br /&gt;
&lt;br /&gt;
monitor bbwl&lt;br /&gt;
{&lt;br /&gt;
 procedure entry write (altype elem)&lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length &amp;gt;= MAXELEM)&lt;br /&gt;
		oktorite.wait() ;&lt;br /&gt;
	 buffer.enqueue(elem);&lt;br /&gt;
     oktolog.signal () ;	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
procedur entry logger()                 # logger deve tenere traccia di tutti i pacchetti transitati mettendoli in una sua memoria.&lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length == 0)&lt;br /&gt;
		oktolog.wait();&lt;br /&gt;
	 Llogger.enqueue(buffer.front())    # restituisci il valore in testa di buffer e inseriscilo in coda a Llogger&lt;br /&gt;
	 ok toread.signal() ;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 procedure entry read() &lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length == 0)&lt;br /&gt;
		oktoread.wait();&lt;br /&gt;
	 buffer.dequeue()                   # restituisci il valore in testa di buffer e rimuovilo.&lt;br /&gt;
	 oktowrite.signal() ;&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
save&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio c.2&lt;br /&gt;
&lt;br /&gt;
alpha(x,y): &amp;lt;x=4, y=sqrt(x)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
il valore che viene salvato in y è sempre 2, quindi non va bene.&lt;br /&gt;
&lt;br /&gt;
bravo(x,y): &amp;lt;y=sqrt(x), x=4&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xi yi xf yf&lt;br /&gt;
0  0  4  0&lt;br /&gt;
0  1  4  1&lt;br /&gt;
1  0  4  1&lt;br /&gt;
1  1  4  1&lt;br /&gt;
&lt;br /&gt;
il valore iniziale di x viene salvato in y, quindi va bene.&lt;br /&gt;
&lt;br /&gt;
charlie(x,y): &amp;lt;y=sqrt(x), x=4*y&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anche questo va bene, per le stesse ragioni di bravo.&lt;br /&gt;
&lt;br /&gt;
delta(z,t): &amp;lt;z=z xor t, t=z xor t&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zi ti zf tf&lt;br /&gt;
0  0  0  0&lt;br /&gt;
0  1  1  0&lt;br /&gt;
1  0  1  1&lt;br /&gt;
1  1  0  1&lt;br /&gt;
&lt;br /&gt;
Il valore iniziale di z viene salvato in t, quindi va bene.&lt;br /&gt;
&lt;br /&gt;
Esercizio g.1&lt;br /&gt;
&lt;br /&gt;
Sia n=3 il numero di pagine mantenute in memoria&lt;br /&gt;
&lt;br /&gt;
a) 123456789123456789...&lt;br /&gt;
&lt;br /&gt;
MIN = MINNUM&lt;br /&gt;
 11144777&lt;br /&gt;
  2225588&lt;br /&gt;
    333669&lt;br /&gt;
&lt;br /&gt;
b) 145231231231231...&lt;br /&gt;
&lt;br /&gt;
MINNUM&lt;br /&gt;
&lt;br /&gt;
 111232123&lt;br /&gt;
   44444444&lt;br /&gt;
     5555555&lt;br /&gt;
&lt;br /&gt;
MIN&lt;br /&gt;
 111111111&lt;br /&gt;
   44222222&lt;br /&gt;
     5333333&lt;br /&gt;
&lt;br /&gt;
Alessandro&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.02.22&amp;diff=762</id>
		<title>ProvaTeorica 2014.02.22</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.02.22&amp;diff=762"/>
		<updated>2014-05-30T16:10:41Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Testo: [http://www.cs.unibo.it/~renzo/so/compiti/2014.02.21.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
Esercizio c.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor bbwl {&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktolog;&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	int logging = 0;&lt;br /&gt;
	queue q;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry write (eltype elem) {&lt;br /&gt;
	if (q.length() == MAXELEM || logging)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
	q.enqueue (elem);&lt;br /&gt;
	logging = 1;&lt;br /&gt;
	oktolog.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry eltype log() {&lt;br /&gt;
	if (q.length == 0)&lt;br /&gt;
		oktolog.wait();&lt;br /&gt;
	eltype tmp = q.top();&lt;br /&gt;
	logging = 0;&lt;br /&gt;
	oktoread.signal();&lt;br /&gt;
	return tmp;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry eltype read() {&lt;br /&gt;
	if (q.length == 0 || logging)&lt;br /&gt;
		oktoread.wait();&lt;br /&gt;
	eltype tmp = q.dequeue();&lt;br /&gt;
	oktowrite.signal();&lt;br /&gt;
	return tmp;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio c.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
condition oktowrite, oktoread, oktolog ;&lt;br /&gt;
queue buffer = MAXELEM ;&lt;br /&gt;
queue Llogger ;&lt;br /&gt;
&lt;br /&gt;
monitor bbwl&lt;br /&gt;
{&lt;br /&gt;
 procedure entry write (altype elem)&lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length &amp;gt;= MAXELEM)&lt;br /&gt;
		oktorite.wait() ;&lt;br /&gt;
	 buffer.enqueue(elem);&lt;br /&gt;
     oktolog.signal () ;	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
procedur entry logger()                 # logger deve tenere traccia di tutti i pacchetti transitati mettendoli in una sua memoria.&lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length == 0)&lt;br /&gt;
		oktolog.wait();&lt;br /&gt;
	 Llogger.enqueue(buffer.front())    # restituisci il valore in testa di buffer e inseriscilo in coda a Llogger&lt;br /&gt;
	 ok toread.signal() ;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 procedure entry read() &lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length == 0)&lt;br /&gt;
		oktoread.wait();&lt;br /&gt;
	 buffer.dequeue()                   # restituisci il valore in testa di buffer e rimuovilo.&lt;br /&gt;
	 oktowrite.signal() ;&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
save&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio c.2&lt;br /&gt;
&lt;br /&gt;
alpha(x,y): &amp;lt;x=4, y=sqrt(x)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
il valore che viene salvato in y è sempre 2, quindi non va bene.&lt;br /&gt;
&lt;br /&gt;
bravo(x,y): &amp;lt;y=sqrt(x), x=4&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xi yi xf yf&lt;br /&gt;
0  0  4  0&lt;br /&gt;
0  1  4  1&lt;br /&gt;
1  0  4  1&lt;br /&gt;
1  1  4  1&lt;br /&gt;
&lt;br /&gt;
il valore iniziale di x viene salvato in y, quindi va bene.&lt;br /&gt;
&lt;br /&gt;
charlie(x,y): &amp;lt;y=sqrt(x), x=4*y&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anche questo va bene, per le stesse ragioni di bravo.&lt;br /&gt;
&lt;br /&gt;
delta(z,t): &amp;lt;z=z xor t, t=z xor t&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zi ti zf tf&lt;br /&gt;
0  0  0  0&lt;br /&gt;
0  1  1  0&lt;br /&gt;
1  0  1  1&lt;br /&gt;
1  1  0  1&lt;br /&gt;
&lt;br /&gt;
Il valore iniziale di z viene salvato in t, quindi va bene.&lt;br /&gt;
&lt;br /&gt;
Esercizio g.1&lt;br /&gt;
&lt;br /&gt;
Sia n=3 il numero di pagine mantenute in memoria&lt;br /&gt;
&lt;br /&gt;
a) 123456789123456789...&lt;br /&gt;
&lt;br /&gt;
MIN = MINNUM&lt;br /&gt;
 11144777&lt;br /&gt;
  2225588&lt;br /&gt;
    333669&lt;br /&gt;
&lt;br /&gt;
b) 145231231231231...&lt;br /&gt;
&lt;br /&gt;
MINNUM&lt;br /&gt;
&lt;br /&gt;
 111232123&lt;br /&gt;
   44444444&lt;br /&gt;
     5555555&lt;br /&gt;
&lt;br /&gt;
MIN&lt;br /&gt;
 111111111&lt;br /&gt;
   44222222&lt;br /&gt;
     5333333&lt;br /&gt;
&lt;br /&gt;
Alessandro&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.02.22&amp;diff=761</id>
		<title>ProvaTeorica 2014.02.22</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2014.02.22&amp;diff=761"/>
		<updated>2014-05-30T16:09:49Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Testo: [http://www.cs.unibo.it/~renzo/so/compiti/2014.02.21.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
Esercizio c.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor bbwl {&lt;br /&gt;
	condition oktowrite;&lt;br /&gt;
	condition oktolog;&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	int logging = 0;&lt;br /&gt;
	queue q;&lt;br /&gt;
	&lt;br /&gt;
	procedure entry write (eltype elem) {&lt;br /&gt;
	if (q.length() == MAXELEM || logging)&lt;br /&gt;
			oktowrite.wait();&lt;br /&gt;
	q.enqueue (elem);&lt;br /&gt;
	logging = 1;&lt;br /&gt;
	oktolog.signal();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry eltype log() {&lt;br /&gt;
	if (q.length == 0)&lt;br /&gt;
		oktolog.wait();&lt;br /&gt;
	eltype tmp = q.top();&lt;br /&gt;
	logging = 0;&lt;br /&gt;
	oktoread.signal();&lt;br /&gt;
	return tmp;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry eltype read() {&lt;br /&gt;
	if (q.length == 0 || logging)&lt;br /&gt;
		oktoread.wait();&lt;br /&gt;
	eltype tmp = q.dequeue();&lt;br /&gt;
	oktowrite.signal();&lt;br /&gt;
	return tmp;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio c.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
condition oktowrite, oktoread, oktolog ;&lt;br /&gt;
queue buffer = MAXELEM ;&lt;br /&gt;
queue Llogger ;&lt;br /&gt;
&lt;br /&gt;
monitor bbwl&lt;br /&gt;
{&lt;br /&gt;
 procedure entry write (altype elem)&lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length &amp;gt;= MAXELEM)&lt;br /&gt;
		oktorite.wait() ;&lt;br /&gt;
	 buffer.enqueue(elem);&lt;br /&gt;
     oktolog.signal () ;	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
procedur entry logger()                 # logger deve tenere traccia di tutti i pacchetti transitati mettendoli in una sua memoria.&lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length == 0)&lt;br /&gt;
		oktolog.wait();&lt;br /&gt;
	 Llogger.enqueue(buffer.front())    # restituisci il valore in testa di buffer e inseriscilo in coda a Llogger&lt;br /&gt;
	 ok toread.signal() ;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 procedure entry read() &lt;br /&gt;
 {&lt;br /&gt;
	if (buffer.length == 0)&lt;br /&gt;
		oktoread.wait();&lt;br /&gt;
	 buffer.dequeue()                   # restituisci il valore in testa di buffer e rimuovilo.&lt;br /&gt;
	 oktowrite.signal() ;&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio c.2&lt;br /&gt;
&lt;br /&gt;
alpha(x,y): &amp;lt;x=4, y=sqrt(x)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
il valore che viene salvato in y è sempre 2, quindi non va bene.&lt;br /&gt;
&lt;br /&gt;
bravo(x,y): &amp;lt;y=sqrt(x), x=4&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xi yi xf yf&lt;br /&gt;
0  0  4  0&lt;br /&gt;
0  1  4  1&lt;br /&gt;
1  0  4  1&lt;br /&gt;
1  1  4  1&lt;br /&gt;
&lt;br /&gt;
il valore iniziale di x viene salvato in y, quindi va bene.&lt;br /&gt;
&lt;br /&gt;
charlie(x,y): &amp;lt;y=sqrt(x), x=4*y&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anche questo va bene, per le stesse ragioni di bravo.&lt;br /&gt;
&lt;br /&gt;
delta(z,t): &amp;lt;z=z xor t, t=z xor t&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zi ti zf tf&lt;br /&gt;
0  0  0  0&lt;br /&gt;
0  1  1  0&lt;br /&gt;
1  0  1  1&lt;br /&gt;
1  1  0  1&lt;br /&gt;
&lt;br /&gt;
Il valore iniziale di z viene salvato in t, quindi va bene.&lt;br /&gt;
&lt;br /&gt;
Esercizio g.1&lt;br /&gt;
&lt;br /&gt;
Sia n=3 il numero di pagine mantenute in memoria&lt;br /&gt;
&lt;br /&gt;
a) 123456789123456789...&lt;br /&gt;
&lt;br /&gt;
MIN = MINNUM&lt;br /&gt;
 11144777&lt;br /&gt;
  2225588&lt;br /&gt;
    333669&lt;br /&gt;
&lt;br /&gt;
b) 145231231231231...&lt;br /&gt;
&lt;br /&gt;
MINNUM&lt;br /&gt;
&lt;br /&gt;
 111232123&lt;br /&gt;
   44444444&lt;br /&gt;
     5555555&lt;br /&gt;
&lt;br /&gt;
MIN&lt;br /&gt;
 111111111&lt;br /&gt;
   44222222&lt;br /&gt;
     5333333&lt;br /&gt;
&lt;br /&gt;
Alessandro&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=User:Save&amp;diff=760</id>
		<title>User:Save</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=User:Save&amp;diff=760"/>
		<updated>2014-05-28T17:01:21Z</updated>

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== :-D ==&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=User:Save&amp;diff=759</id>
		<title>User:Save</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=User:Save&amp;diff=759"/>
		<updated>2014-05-28T17:01:06Z</updated>

		<summary type="html">&lt;p&gt;Save: Created page with &amp;quot;:-D&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:-D&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2013.06.21&amp;diff=758</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=758"/>
		<updated>2014-05-28T16:13:17Z</updated>

		<summary type="html">&lt;p&gt;Save: &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;
&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio c.1 &amp;lt;/h2&amp;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 nvie&lt;br /&gt;
{&lt;br /&gt;
	condition oktoread;&lt;br /&gt;
	queue buffer[N]; &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	procedure entry put(int n, generic object)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
                           if (buffer[n].length &amp;lt; NELEM)&lt;br /&gt;
				buffer[n].enqueue(object);&lt;br /&gt;
 &lt;br /&gt;
		           oktoread.signal();&lt;br /&gt;
 &lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry generic get(generic *object)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
               int count=0;&lt;br /&gt;
&lt;br /&gt;
			for (int i=0;i&amp;lt;N;i++)&lt;br /&gt;
                        {   &lt;br /&gt;
                            if (buffer[i].length&amp;gt;0)&lt;br /&gt;
                                  count++;&lt;br /&gt;
                            return None ;&lt;br /&gt;
                        }&lt;br /&gt;
			for (int j=0;j&amp;lt;N;j++)&lt;br /&gt;
                        {   if (count&amp;gt;=N/2)&lt;br /&gt;
                                (buffer[j].dequeue(*object) ;&lt;br /&gt;
                            oktoread.wait();&lt;br /&gt;
                        }&lt;br /&gt;
       }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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>Save</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.07.19&amp;diff=757</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=757"/>
		<updated>2014-05-28T15:40:14Z</updated>

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

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

		<summary type="html">&lt;p&gt;Save: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Esercizio 1: Il monitor seq da implementare deve fornire due procedure entry:&lt;br /&gt;
procedure entry void enter(void);&lt;br /&gt;
procedure entry void exit(void);&lt;br /&gt;
I processi chiamano i servizi di seq come segue:&lt;br /&gt;
….&lt;br /&gt;
seq.enter();&lt;br /&gt;
// codice controllato da seq&lt;br /&gt;
seq.exit();&lt;br /&gt;
….&lt;br /&gt;
Tutti i processi che ne facciano rischiesta possono entrare nel codice controllato da seq contemporaneamente (questa &lt;br /&gt;
NON e' una sezione critica!). Exit deve garantire che i processi escano dal codice controllato tutti insieme. Per &lt;br /&gt;
esempio se tre processi a,b e c chiamano seq.enter ogni processo non potra' completare la exit se prima tutti gli altri &lt;br /&gt;
due non hanno chiamato la exit. Se nel frattempo altri processi dovessero chiamare la seq.enter occorrera' attendere &lt;br /&gt;
anche questi ultimi.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	int processi=0;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		processi++&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
		processi--&lt;br /&gt;
		oktoexit.signal();&lt;br /&gt;
		while(processi!=0)&lt;br /&gt;
		{&lt;br /&gt;
			oktoexit.wait();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-stefano92&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor seq&lt;br /&gt;
{&lt;br /&gt;
	int processi=0;&lt;br /&gt;
	condition oktoexit;&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter()&lt;br /&gt;
	{&lt;br /&gt;
		processi++&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit()&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
                int inattesa=0 ;&lt;br /&gt;
		processi-- ;&lt;br /&gt;
		&lt;br /&gt;
		while(processi!=0)&lt;br /&gt;
		{&lt;br /&gt;
		    inattesa++ ;&lt;br /&gt;
                    oktoexit.wait();&lt;br /&gt;
                    inattesa=0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
                oktoexit.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Save</name></author>
	</entry>
</feed>