<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Prove_scritte_2015</id>
	<title>Prove scritte 2015 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Prove_scritte_2015"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prove_scritte_2015&amp;action=history"/>
	<updated>2026-05-04T22:32:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prove_scritte_2015&amp;diff=2577&amp;oldid=prev</id>
		<title>Acsor: Created page with &quot;== Esame 14/02/2015 == [http://www.cs.unibo.it/~renzo/so/compiti/2015.02.14.tot.pdf 2015.02.14.tot.pdf] === Esercizio c.1 (da controllare) === &lt;source lang=&quot;c&quot;&gt; monitor altcol...&quot;</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prove_scritte_2015&amp;diff=2577&amp;oldid=prev"/>
		<updated>2020-08-30T08:05:53Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;== Esame 14/02/2015 == [http://www.cs.unibo.it/~renzo/so/compiti/2015.02.14.tot.pdf 2015.02.14.tot.pdf] === Esercizio c.1 (da controllare) === &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; monitor altcol...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Esame 14/02/2015 ==&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/compiti/2015.02.14.tot.pdf 2015.02.14.tot.pdf]&lt;br /&gt;
=== Esercizio c.1 (da controllare) ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
monitor altcolbb {&lt;br /&gt;
&lt;br /&gt;
  generic_type valueBuf[MAX];&lt;br /&gt;
  int front = rear = 0;&lt;br /&gt;
&lt;br /&gt;
  bool isFull = false;&lt;br /&gt;
&lt;br /&gt;
  condition ok2write[2]; //gli indici sono i colori (red=0, blue=1)&lt;br /&gt;
&lt;br /&gt;
  lastColor = None;&lt;br /&gt;
&lt;br /&gt;
  entry void write(color_t color, generic_type val) {&lt;br /&gt;
&lt;br /&gt;
    if (front == rear)&lt;br /&gt;
        if(isFull)&lt;br /&gt;
          ok2write[color].wait();&lt;br /&gt;
    else&lt;br /&gt;
      if (lastColor == color)&lt;br /&gt;
        ok2write[color].wait();&lt;br /&gt;
              &lt;br /&gt;
    valueBuf[front] = val;&lt;br /&gt;
    front = (front+1) % MAX;&lt;br /&gt;
    lastColor = color;&lt;br /&gt;
&lt;br /&gt;
    if (front == rear)&lt;br /&gt;
      isFull = true;&lt;br /&gt;
    else&lt;br /&gt;
      ok2write[1-color].signal();&lt;br /&gt;
&lt;br /&gt;
    ok2read.signal();&lt;br /&gt;
        &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  entry generic_type read(void) {&lt;br /&gt;
&lt;br /&gt;
    if (rear == front)&lt;br /&gt;
      if (!isFull)&lt;br /&gt;
        ok2read.wait();&lt;br /&gt;
&lt;br /&gt;
    generic_type tmpValue = valueBuf[rear];&lt;br /&gt;
    &lt;br /&gt;
    rear = (rear + 1) % MAX;&lt;br /&gt;
    if (rear == front)&lt;br /&gt;
      isFull = false;&lt;br /&gt;
      color_t tmpColor = lastColor;&lt;br /&gt;
      lastColor = None;&lt;br /&gt;
      ok2write[tmpColor].signal();  //quando un lettore legge l'ultimo elemento&lt;br /&gt;
                                    //dal buffer, ci possono solo essere scrittori&lt;br /&gt;
                                    //in attesa che abbiano lo stesso colore&lt;br /&gt;
                                    //dell'ultimo elemento.&lt;br /&gt;
    else&lt;br /&gt;
      ok2write[1-lastColor].signal();&lt;br /&gt;
      &lt;br /&gt;
    return tmpValue;&lt;br /&gt;
      &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esercizio c.1 (da controllare) ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX n&lt;br /&gt;
&lt;br /&gt;
condition ok2read;&lt;br /&gt;
condition ok2write;&lt;br /&gt;
condition ok2red;&lt;br /&gt;
condition ok2blue;&lt;br /&gt;
&lt;br /&gt;
queue buffer;&lt;br /&gt;
&lt;br /&gt;
Procedure entry: void write(color_t color, generic_type val)&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.lenght() &amp;gt;= MAX)&lt;br /&gt;
        ok2write.wait();&lt;br /&gt;
    if((&amp;lt;color&amp;gt; == buffer.last()) == color)&lt;br /&gt;
    {&lt;br /&gt;
        if(color == red)&lt;br /&gt;
            ok2red.wait();&lt;br /&gt;
        else&lt;br /&gt;
            ok2blue.wait();&lt;br /&gt;
    }&lt;br /&gt;
    buffer.enqueue(&amp;lt;color, val&amp;gt;);&lt;br /&gt;
    ok2read.signal();&lt;br /&gt;
    if(buffer.lenght() &amp;lt; MAX)&lt;br /&gt;
    {&lt;br /&gt;
        if(color == red)&lt;br /&gt;
            ok2blue.signal();&lt;br /&gt;
        else&lt;br /&gt;
            ok2red.signal();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Procedure entry: generic_type read(void)&lt;br /&gt;
{&lt;br /&gt;
    generic_type val;&lt;br /&gt;
    if(buffer.lenght == 0)&lt;br /&gt;
        ok2read.wait();&lt;br /&gt;
    &amp;lt;val&amp;gt; = buffer.dequeue();&lt;br /&gt;
    ok2write.signal()&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Esercizio c.2 (da controllare) ===&lt;br /&gt;
&lt;br /&gt;
* Verificato dall'utente ? in data ?&lt;br /&gt;
&lt;br /&gt;
Il programma dispone di una mutex per l'accesso protetto alla variabile n, e dei due semafori s1 ed s2 per regolare l'alternanza tra i thread A e AB. Sulla base di essi, e del fatto che entrambi i thread eseguono 2 cicli, è possibile affermare (verificare) che&lt;br /&gt;
&lt;br /&gt;
* L'alternanza dei due thread è A-AB-A-AB o&lt;br /&gt;
* L'alternanza dei due thread è AB-A-AB-A&lt;br /&gt;
&lt;br /&gt;
Infatti se il thread A svolgesse due cicli consecutivamente, invocherebbe s1.P() due volte senza fare mai ricorso a s1.V() (ragionamento analogo per AB); pertanto è necessario attendere l'intervento dell'altro thread in attesa di una chiamata su s1.V().&lt;br /&gt;
&lt;br /&gt;
Per concludere, i possibili valori di n al termine del programma saranno, in corrispondenza delle due diramazioni elencate sopra&lt;br /&gt;
&lt;br /&gt;
* n = 12&lt;br /&gt;
* n = 5&lt;br /&gt;
&lt;br /&gt;
=== Esercizio g.1 ===&lt;br /&gt;
&lt;br /&gt;
* Verificato dall'utente [[User:Acsor|Acsor]] in data 23/08/2020. Ritengo sia: corretto&lt;br /&gt;
* Verificato dall'utente ? in data ?&lt;br /&gt;
&lt;br /&gt;
==== Punto a) ====&lt;br /&gt;
MIN:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Stringa di riferimenti: 0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0&lt;br /&gt;
               Frame 1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&lt;br /&gt;
               Frame 2:   1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&lt;br /&gt;
               Frame 3:     2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2&lt;br /&gt;
               Frame 4:       3 4 5 5 5 5 3 4 4 4 4 3 3 3 3 3 3 3&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FIFO:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Stringa di riferimenti: 0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0&lt;br /&gt;
               Frame 1: 0 0 0 0 4 4 4 4 2 2 2 2 1 1 1 1 1 1 1 1 1&lt;br /&gt;
               Frame 2:   1 1 1 1 5 5 5 5 3 3 3 3 2 2 2 2 2 2 2 2&lt;br /&gt;
               Frame 3:     2 2 2 2 0 0 0 0 4 4 4 4 3 3 3 3 3 3 3&lt;br /&gt;
               Frame 4:       3 3 3 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Punto b) ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Stringa di riferimenti: 0 1 2 3 4 0 1 2 3 0 1 4 2 0 3 4 1 2 3 4&lt;br /&gt;
               Frame 1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1&lt;br /&gt;
               Frame 2:   1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2&lt;br /&gt;
               Frame 3:     2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3&lt;br /&gt;
               Frame 4:       3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Esercizio g.2 (da controllare) ===&lt;br /&gt;
&lt;br /&gt;
* Verificato dall'utente ? in data ?&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# Frammentazione interna: allocazioni di pagine la cui dimensione è strettamente maggiore di quella effettivamente richiesta.  Frammentazione esterna: nessuno. Infatti ogni spazio (pagina) allocato e liberato è prima o poi riallocato.&lt;br /&gt;
# Se non viene utilizzato un sistema di caching, una lettura diretta a più blocchi di un file di grandi dimensioni richiede: la lettura della FAT, solitamente posta all'inizio di un [[Glossario#Volume|volume]] (e dunque, su dischi rotazionali, in una traccia differente da quella attuale o da quella del blocco da leggere); la lettura del blocco stesso, e dunque lo spostamento della testina nella traccia e nel settore di interesse&lt;br /&gt;
# Uno scheduling a priorità statica può essere utile ad un processo interattivo, dove è necessario mantenersi all'interno di date soglie temporali o semplicemente svolgere un dato compito con meno ritardo possibile; esempi concreti: un processo che faccia streaming video; un processo appartenente ad un server il cui obiettivo primario è soddisfare le richieste dei propri client il prima possibile, ma dove può anche essere svolta qualche attività dai processi locali (es. programmi applicativi). In uno scheduling a priorità statica, se la presenza di processi ad alte priorità è costante, possono verificarsi indesiderati fenomeni di ''starvation'' nei confronti di processi meno prioritari.&lt;br /&gt;
# ''Domanda puramente nozionistica, la cui risposta può essere ricavata consultando note, lucidi o libri di testo.''&lt;br /&gt;
&lt;br /&gt;
== Esame 20/01/2015 ==&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/compiti/2015.01.20.tot.pdf 2015.01.20.tot.pdf]&lt;br /&gt;
&lt;br /&gt;
=== Esercizio c.1 (da controllare) ===&lt;br /&gt;
&lt;br /&gt;
* Controllato dall'utente [[User:Acsor|Acsor]] in data 21/08/2020&lt;br /&gt;
* Controllato dall'utente ? in data ?&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX n&lt;br /&gt;
&lt;br /&gt;
condition ok2read;&lt;br /&gt;
condition ok2write;&lt;br /&gt;
&lt;br /&gt;
queue buffer;&lt;br /&gt;
int waiting_write = 0;&lt;br /&gt;
int waiting_read = 0;&lt;br /&gt;
&lt;br /&gt;
Procedure entry: void write(generic_type val) {&lt;br /&gt;
    if (buffer.lenght() &amp;gt;= MAX) {&lt;br /&gt;
        if (waiting_write &amp;gt;= MAX) {&lt;br /&gt;
            buffer.dequeue(); // il valore va perso&lt;br /&gt;
            ok2write.signal();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        waiting_write++;&lt;br /&gt;
        ok2write.wait();&lt;br /&gt;
        waiting_write--;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    buffer.enqueue(val);&lt;br /&gt;
    ok2read.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Procedure entry: generic_type read(void) {&lt;br /&gt;
    generic_type val;&lt;br /&gt;
&lt;br /&gt;
    if (buffer.lenght() == 0) {&lt;br /&gt;
        if (waiting_read &amp;gt;= MAX)&lt;br /&gt;
            ok2read.signal();&lt;br /&gt;
&lt;br /&gt;
        waiting_read++;&lt;br /&gt;
        ok2read.wait();&lt;br /&gt;
        waiting_read--:&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    val = buffer.length() == 0 ? NULL: buffer.dequeue();&lt;br /&gt;
    ok2write.signal();&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Esercizio g.1 ===&lt;br /&gt;
&lt;br /&gt;
* Controllato e corretto dall'utente [[User:Acsor|Acsor]] in data 21/08/2020&lt;br /&gt;
&lt;br /&gt;
==== Punto a) ====&lt;br /&gt;
===== Algoritmo MIN =====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Stringa di riferimenti: 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1&lt;br /&gt;
               Frame 1: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&lt;br /&gt;
               Frame 2:   2 2 2 2 2 2 2 2 2 2 2 2 2 2&lt;br /&gt;
               Frame 3:     3 4 5 5 5 3 4 4 4 3 3 3 3&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Algoritmo LRU =====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Stringa di riferimenti: 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1&lt;br /&gt;
               Frame 1: 1 1 1 4 4 4 2 2 2 1 1 1 1 1 1&lt;br /&gt;
               Frame 2:   2 2 2 5 5 5 3 3 3 2 2 2 2 2&lt;br /&gt;
               Frame 3:     3 3 3 1 1 1 4 4 4 3 3 3 3&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Punto b) ====&lt;br /&gt;
&lt;br /&gt;
Poiché non è specificato quale dei due algoritmi precedenti applicare, sono state considerate soluzioni per ognuno di essi&lt;br /&gt;
&lt;br /&gt;
===== Algoritmo MIN (da controllare) =====&lt;br /&gt;
(È possibile ottenere una stringa più breve?)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
4 3 2 1 5 3 2 1 4 5 3 2 1 3 2 4 5 1 2 4 3 1 5 4 2 1 3 4   &lt;br /&gt;
-------------------------------------------------------&lt;br /&gt;
4|4|4|4|5|  5  |5|  5  |1|  1  |1|  1  |1|  1  |   1   &lt;br /&gt;
 |3|3|3|3|  3  |3|  3  |3|  3  |5|  5  |5|  5  |   2   &lt;br /&gt;
 | |2|2|2|  2  |2|  2  |2|  2  |2|  2  |3|  3  |   3   &lt;br /&gt;
 | | |1|1|  1  |4|  4  |4|  4  |4|  4  |4|  4  |   4   &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Algoritmo LRU =====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Stringa di riferimenti: 4 3 2 1 5 3 2 4 1 5 4 3 1 2&lt;br /&gt;
               Frame 1: 4 4 4 4 5 5 5 5 1 1 1 1 1 1&lt;br /&gt;
               Frame 2:   3 3 3 3 3 3 3 3 5 5 5 5 2&lt;br /&gt;
               Frame 3:     2 2 2 2 2 2 2 2 2 3 3 3&lt;br /&gt;
               Frame 4:       1 1 1 1 4 4 4 4 4 4 4&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Acsor</name></author>
	</entry>
</feed>