Difference between revisions of "Prove svolte e soluzioni proposte"
Jump to navigation
Jump to search
Mattiabiondi (talk | contribs) |
Mattiabiondi (talk | contribs) |
||
Line 3: | Line 3: | ||
== Esame 17/07/2018 == | == Esame 17/07/2018 == | ||
=== Esercizio c.1 === | === Esercizio c.1 === | ||
− | + | <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