Difference between revisions of "Prove svolte e soluzioni proposte"

From Sistemi Operativi
Jump to navigation Jump to search
Line 3: Line 3:
 
== Esame 17/07/2018 ==
 
== Esame 17/07/2018 ==
 
=== Esercizio c.1 ===
 
=== Esercizio c.1 ===
<source lang="c">
+
<source lang="c">
 
/* Monitor Delirum: */
 
/* Monitor Delirum: */
  
Condition: Ok2Load;
+
// Condition: Ok2Load;
Condition: Ok2Pour[]; // Un elemento per Type
+
// Condition: Ok2Pour[]; // Un elemento per Type
 
int availableBeer[]; // Un elemento per Type  
 
int availableBeer[]; // Un elemento per Type  
 
Queue requests[]; // Un elemento per Type
 
Queue requests[]; // Un elemento per Type
Line 47: Line 47:
 
     }
 
     }
  
     if (requests[t].Length > 0) //serve per evitare che a causa di un magazziniere lento si accodino cosi tante richieste che mentre si sta caricando si svuota subito il fusto
+
     if (requests[t].Length > 0) // serve per evitare che a causa di un magazziniere lento si accodino cosi tante richieste che mentre si sta caricando si svuota subito il fusto
 
     {
 
     {
 
         pendingRequests.Enqueue(t);
 
         pendingRequests.Enqueue(t);
Line 53: Line 53:
 
     }
 
     }
 
}
 
}
  </source>
+
</source>
 +
<br>
 +
== Esame 16/07/2014 ==
 +
=== Esercizio c.1 ===
 +
<source lang="c">
 +
/* Monitor Bounded Buffer: (non richiesto dall'esercizio) */
 +
queue q;
 +
condition oktoread; // q.length() > 0
 +
condition oktowrite; // q.length() < MAX
 +
 
 +
procedure entry type read():
 +
    if (q.length() == 0) oktoread.wait(); // controllo
 +
    retval = q.dequeue(); // cambio lo stato
 +
    // abilito coloro che possono essere abilitati dal cambiamento di stato
 +
    oktowrite.signal()
 +
    return retval;
 +
 
 +
procedure entry void write(type elem):
 +
    if (q.length() >= MAX) oktowrite.wait(); //controllo
 +
    q.enqueue(elem); // cambio lo stato
 +
    oktoread.signal(); // abilito chi può essere abilitato
 +
 
 +
/* NOTE:
 +
  * procedure entry ==> dichiarazione di funzioni (senza vedere l'implementazione
 +
* dall'esterno)
 +
*/
 +
</source>
 +
<br>
 +
<source lang="c">
 +
/* Min-Max Monitor Bounded Buffer: */
 +
 
 +
Queue Q;
 +
 
 +
// Condition: OKTOREAD: Q.Length > MIN
 +
// Condition: OKTOWRITE: Q.Length < MAX
 +
 
 +
procedure entry: Type Read():
 +
{
 +
    if (Q.Length <= MIN) OKTOREAD.Wait(); // Controllo
 +
    retval = Q.Dequeue(); // Cambio di stato
 +
    OKTOWRITE.Signal(); // Abilito chi vuole scrivere
 +
    return retval; // Qui sono sicuro perchè ne ho eliminato uno prima
 +
}
 +
 
 +
procedure entry: void Write(Type elem):
 +
{
 +
    if (Q.Length >= MAX) OKTOWRITE.Wait() // Controllo
 +
    Q.Enqueue(elem); // Cambio di stato
 +
    if (Q.Length > MIN) OKTOREAD.Signal(); // Abilito chi vuole leggere
 +
}
 +
</source>
 +
<br>
 +
=== Esercizio c.2 ===
 +
 
 +
<br>
 +
=== Esercizio g.1 ===

Revision as of 17:18, 11 April 2019

Questa pagina serve a raccogliere prove d'esame svolte (che possono essere utili alla preparazione) e soluzioni proposte a tali prove da sottoporre a peer-review.

Esame 17/07/2018

Esercizio c.1

/* Monitor Delirum: */

// Condition: Ok2Load;
// Condition: Ok2Pour[]; // Un elemento per Type
int availableBeer[]; // Un elemento per Type 
Queue requests[]; // Un elemento per Type
Queue pendingRequests;

Procedure entry: void Pour(Type t, Quantity c)
{
    if (c > availableBeer[t]) // Richiesta maggiore della birra disponibile
    {
        c -= availableBeer[t];
        availableBeer[t] = 0;              
        requests[t].Enqueue(c);
        if (requests[t].Length == 1) // Risveglio un magazziniere solo se è la prima richiesta di questo tipo di birra
        {
            pendingRequests.Enqueue(t);
            Ok2Load().Signal();
        }
        Ok2Pour[t].Wait();
        requests[t].Dequeue(); // Quando ho ottenuto la birra che voglio, elimino la mia richiesta
    }
    availableBeer[t] -= c;
}

Procedure entry: Type isEmpty()
{
    if (pendingRequests.Length == 0)
    {
        Ok2Load.Wait();
    }
    return pendingRequests.Dequeue();
}

Procedure entry: Loaded(Type t, Capacity c)
{
    availableBeer[t] += c;
    while (requests[t].Length > 0 && availableBeer[t] > requests[t].head())
    {
        Ok2Pour[t].Signal();
    }

    if (requests[t].Length > 0) // serve per evitare che a causa di un magazziniere lento si accodino cosi tante richieste che mentre si sta caricando si svuota subito il fusto
    {
        pendingRequests.Enqueue(t);
        Ok2Load.Signal();
    }
}


Esame 16/07/2014

Esercizio c.1

/* Monitor Bounded Buffer: (non richiesto dall'esercizio) */
queue q;
condition oktoread; // q.length() > 0
condition oktowrite; // q.length() < MAX

procedure entry type read():
    if (q.length() == 0) oktoread.wait(); // controllo
    retval = q.dequeue(); // cambio lo stato
    // abilito coloro che possono essere abilitati dal cambiamento di stato
    oktowrite.signal() 
    return retval;

procedure entry void write(type elem):
    if (q.length() >= MAX) oktowrite.wait(); //controllo
    q.enqueue(elem); // cambio lo stato
    oktoread.signal(); // abilito chi può essere abilitato

/* NOTE:
 * procedure entry ==> dichiarazione di funzioni (senza vedere l'implementazione 
 * dall'esterno)
 */


/* Min-Max Monitor Bounded Buffer: */

Queue Q;

// Condition: OKTOREAD: Q.Length > MIN
// Condition: OKTOWRITE: Q.Length < MAX

procedure entry: Type Read():
{
    if (Q.Length <= MIN) OKTOREAD.Wait(); // Controllo
    retval = Q.Dequeue(); // Cambio di stato
    OKTOWRITE.Signal(); // Abilito chi vuole scrivere
    return retval; // Qui sono sicuro perchè ne ho eliminato uno prima
}

procedure entry: void Write(Type elem):
{
    if (Q.Length >= MAX) OKTOWRITE.Wait() // Controllo
    Q.Enqueue(elem); // Cambio di stato
    if (Q.Length > MIN) OKTOREAD.Signal(); // Abilito chi vuole leggere
}


Esercizio c.2


Esercizio g.1