Difference between revisions of "Prove scritte 2023"
SpookyWiki (talk | contribs) |
SpookyWiki (talk | contribs) |
||
Line 1: | Line 1: | ||
= Parziale 2023/01/20 = | = Parziale 2023/01/20 = | ||
+ | |||
+ | == Esercizio c1 == | ||
+ | |||
+ | Scrivere il monitor fullbuf che abbia le seguenti procedure entry: | ||
+ | void add(int value) | ||
+ | int get(void) | ||
+ | Le prime MAX chiamate della procedure entry add devono bloccare i processi chiamanti. In seguito deve sempre valere Na >= MAX indicando con Na il numero di processi bloccati in attesa di completare la funzione add. | ||
+ | La funzione get deve attendere che Na > MAX, restituire la somma algebrica dei parametri value delle chiamate add in sospeso e riattivare il primo processo in attesa di completare la add (se la get richiede che Na > MAX, la get può riattivare un processo e al completamento della get si rimarrà garantito che Na >= MAX) | ||
+ | |||
+ | === Soluzione proposta 1 (da controllare)=== | ||
+ | Proposta da [[User: SpookyWiki |SpookyWiki]] ([[User talk:SpookyWiki|talk]]) 17:39, 17 May 2023 (CEST) | ||
+ | |||
+ | <syntaxhighlight lang=C> | ||
+ | monitor fullbuf { | ||
+ | int MAX; //numero massimo di proc che devono essere bloccati sul buffer | ||
+ | int Na; | ||
+ | int mem; | ||
+ | |||
+ | condition wait4get; | ||
+ | condition wait4add; | ||
+ | |||
+ | fullbuf(int max) { | ||
+ | MAX = max; | ||
+ | Na = 0; | ||
+ | mem = 0; | ||
+ | } | ||
+ | |||
+ | procedure entry void add(int value) { | ||
+ | Na++; //mi segnalo in attesa | ||
+ | |||
+ | if( Na > MAX ) { //se ci sono abbastanza processi in attesa | ||
+ | wait4add.signal(); //attivo la get | ||
+ | |||
+ | wait4get.wait(); //mi metto effettivamente in attesa | ||
+ | mem = value; //metto a disposizione il mio valore | ||
+ | } | ||
+ | |||
+ | procedure entry int get(void) { | ||
+ | if ( !(Na > MAX) ) //se non ci sono abbastanza get in attesa | ||
+ | wait4add.wait(); //mi metto in attesa | ||
+ | |||
+ | int result = 0; | ||
+ | |||
+ | while( Na > MAX ) { //finchè c'è un surplus di add in attesa | ||
+ | wait4get.signal(); //riattivo il primo add in attesa | ||
+ | result += mem; //prendo il suo valore | ||
+ | Na--; | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
== Esercizio c2 == | == Esercizio c2 == |
Revision as of 16:39, 17 May 2023
Parziale 2023/01/20
Esercizio c1
Scrivere il monitor fullbuf che abbia le seguenti procedure entry:
void add(int value) int get(void)
Le prime MAX chiamate della procedure entry add devono bloccare i processi chiamanti. In seguito deve sempre valere Na >= MAX indicando con Na il numero di processi bloccati in attesa di completare la funzione add. La funzione get deve attendere che Na > MAX, restituire la somma algebrica dei parametri value delle chiamate add in sospeso e riattivare il primo processo in attesa di completare la add (se la get richiede che Na > MAX, la get può riattivare un processo e al completamento della get si rimarrà garantito che Na >= MAX)
Soluzione proposta 1 (da controllare)
Proposta da SpookyWiki (talk) 17:39, 17 May 2023 (CEST)
monitor fullbuf {
int MAX; //numero massimo di proc che devono essere bloccati sul buffer
int Na;
int mem;
condition wait4get;
condition wait4add;
fullbuf(int max) {
MAX = max;
Na = 0;
mem = 0;
}
procedure entry void add(int value) {
Na++; //mi segnalo in attesa
if( Na > MAX ) { //se ci sono abbastanza processi in attesa
wait4add.signal(); //attivo la get
wait4get.wait(); //mi metto effettivamente in attesa
mem = value; //metto a disposizione il mio valore
}
procedure entry int get(void) {
if ( !(Na > MAX) ) //se non ci sono abbastanza get in attesa
wait4add.wait(); //mi metto in attesa
int result = 0;
while( Na > MAX ) { //finchè c'è un surplus di add in attesa
wait4get.signal(); //riattivo il primo add in attesa
result += mem; //prendo il suo valore
Na--;
}
return result;
}
}
Esercizio c2
Dato un servizio di message passing asincrono implementare un servizio di message passing sincrono a scambio che prevede una sola chiamata:
T xchange(T msg, pid_t dest)
dove T è un tipo generico (potrebbe essere int, string, struct mystruct). Il parametro dest non può essere ANY. Quando il processo P chiama xchange(m1, Q) e il processo Q chiama xchange(m2, P) entrambi i processi vengono riattivati, la xchange chiamata da P restituirà m2 mentre la xchange di Q restituirà m1.
Soluzione proposta 1
Proposta da SpookyWiki (talk) 16:55, 17 May 2023 (CEST)
T xchange(T msg, pid_t dest) {
asend(msg, dest);
return arecv(dest);
}