Scrivere il monitor semdata che implementi un semaforo con dato. Questa astrazione prevede due operazioni: datatype dP(void); void dV(datatype data); Non è previsto assegmento di valore iniziale nel costruttore, l'invariante è lo stesso dei semafori (con init = 0): ndP <= ndV (dove ndP e ndV rappresentano rispettivamente il numero di operazioni dP e dV completate. I dati passati come parametro alla dV devono essere memorizzati in ordine LIFO. L'operazione nP restituisce il valore più recente fra quelli memorizzati (e lo cancella dalla struttura dati).
🐰Soluzione
Monitor semdata {
Stack<datatype> s;
condition c;
datatype dP(void) { // pop
if (s.isEmpty())
c.wait();
return s.pop()
}
void dV(datatype data) { // push
s.push(data);
c.signal();
}
}
Dato un servizio di message passing asincrono implementare un servizio di message passing sincrono con selezione ordinata che ha la seguente interfaccia: void snsend(msgtype msg, pid_t dest); msgtype snrecv(pid_t sender, int n); La funzione snrecv deve restituire l'n-mo messaggio proveniente dal mittente specificato (che può essere any). Se n == 0 restituisce l'ultimo messaggio. Esempi: m = snrecv(tizio, 1): restituisce il primo messaggio da tizio (attende se non ve ne sono) m = snrecv(ANY, 42): restituisce il 42-mo messaggio da chiunque (attende se ci sono meno di 42 messaggi in attesa di essere ricevuti) m = snrecv(caio, 0): restituisce l'ultimo messaggio ricevuto da Caio (attende se non ci sono messaggi pendenti da Caio) m = snrecv(ANY, 0): restituisce l'ultimo messaggio ricevuto, indipendentemente dal mittente.
🐰Soluzione
// db -> struttura dati con i messaggi
List<pid, msg_t> db;
void snsend(msgtype msg, pid_t dest){
asend(<msg, getpid()>, dest);
arecv(dest);
}
msgtype snrecv(pid_t sender, int n){
while(true)
(s,m) = arecv(sender);
db.add(s,m);
(s,m) = NULL;
forall entry in db
if (entry.pid == sender || sender == ANY)
count++;
if(n == 0)
(s,m) = entry;
if (count == n && n != 0)
(s,m) == entry;
break;
count = 0;
if ((s,m) != NULL && n == 0)
return (s,m)
}
Considerare i seguenti processi gestiti mediante uno scheduler preemptive a priorità statica su una macchina biprocessore SMP: P1: cpu 4 ms; I-O 4 ms; cpu 2 ms P2: cpu 2 ms; I-O 4 ms; cpu 5 ms P3: cpu 5 ms; I-O 3 ms; cpu 3 ms P4: cpu 10 ms; I-O 1 ms l'Input-Output avviene su un'unica unità. Per il processo P1 ha priorità minima seguito da P2, P3 e P4 in sequenza crescente, le richieste di I/O sono gestite in ordine FIFO. Calcolare il tempo necessario a completare l'esecuzione dei 4 processi. Indicare con chiarezza i punti dello schedule nei quali avviene la preemption.
🐰Soluzione
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CPU 1 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | ||||
CPU 2 | 3 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | |||
I/O | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 4 | 1 | 1 | 1 | 1 | |||||||
preem | → | ← |