Difference between revisions of "Prove svolte e soluzioni proposte"

From Sistemi Operativi
Jump to navigation Jump to search
m
Line 1: Line 1:
 
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.
 
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 ===
 +
<source lang="c">
 +
/* 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();
 +
    }
 +
}
 +
</source>

Revision as of 17:09, 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();
    }
}