Difference between revisions of "Prove scritte 2022"

From Sistemi Operativi
Jump to navigation Jump to search
(→‎Esercizio c1: ho sbagliato data dell'esame, ora sposto)
Line 2: Line 2:
  
 
== Esercizio c1 ==
 
== Esercizio c1 ==
 
=== Consegna ===
 
Esercizio c.1: Scrivere il monitor delayvalue con una sola procedure entry:
 
  int delay(int value);
 
Il monitor deve sospendere i primi NDELAY processi che chiamano la delay. Le successive chiamate di delay
 
devono mantenere costante il numero di processi sospesi, ogni successiva chiamata devo riattivare il primo
 
processo in attesa prima di sospendersi, la delay ritorna il valore passato come parametro dal processo che
 
ne ha riattivato l'esecuzione. e.g. se NDELAY è 2:
 
  P1: delay(44) -> P1 si sospende
 
  P2: delay(40) -> P2 si sospende
 
  P3: delay(42) -> P1 si riattiva e ritorna 42, P3 si sospende
 
  P4: delay(22) -> P2 si riattiva e ritorna 22, P4 si sospende
 
 
=== Soluzione proposta 1 ===
 
Soluzione proposta da [https://so.v2.cs.unibo.it/wiki/index.php/User:Flecart Flecart], da controllare
 
 
<syntaxhighlight lang=C>
 
 
// variabile definita altrove.
 
extern int NDELAY;
 
 
class Monitor {
 
    Queue<condition> stopped;
 
    int curr_value;
 
    Monitor {
 
        stopped = Queue<condition>();
 
        curr_value = 0;
 
    }
 
 
    int delay(int value) {
 
        curr_value = value;
 
        if (stopped.size() == NDELAY) {
 
            condition first = stopped.dequeue();
 
            first.signal();
 
        }
 
        condition c = new condition();
 
        stopped.enqueue(c);
 
        c.wait();   
 
 
        return curr_value;
 
    }
 
}
 
 
</syntaxhighlight>
 
  
 
== Esercizio c2 ==
 
== Esercizio c2 ==

Revision as of 15:12, 11 December 2022

Prova 2022/06/01

Esercizio c1

Esercizio c2

Consegna

Esercizio c.2: Un servizio di message passing asincrono non fifo (nfasend/nfarecv) consegna in tempo finito tutti i messaggi spediti ma non è garantito che i messaggi vengano ricevuti nell'ordine nel quale sono stati spediti.

 void nfasend(msg_t msg, pid_t dest)
 msg_t nfarecv(pid_t sender)

Dato un servizio di message passing asincrono non fifo scrivere una libreria che implementi il servizio di message passing asincrono fifo:

 void asend(msg_t msg, pid_t dest)
 msg_t arecv(pid_t sender)

Nota: sia il servizio dato (non fifo) sia quello da implementare (fifo) consentono la ricezione solo da mittente specificato (non supportano ANY/*).

Soluzione proposta 1

void nfasend(msg_t msg, pid_t dest);
msg_t nfarecv(pid_t sender);


// array di grandezza di massimi numero di processi, inizializzato a 0
// utilizzato per contare il numero di messaggi inviati a un certo processo.
int num_sender[MAX_PROC];

//RICORDA che ogni sender ha il suo num_sender[...]

void asend(msg_t msg, pid_t dest) {
	src = getpid();
	nfasend(<msg, num_send[dest]>, dest);
	num_sender[dest]++;
}

// molto simile a num_sender, ma è utilizzato per contare il numero di messaggi ricevuti, in ordine.
int num_receiver[MAX_PROC];
// array heap ordinato sul int (per ogni heap in cima c'è il messaggio col minimo int).
min_heap<msg, int> messages[MAX_PROC];

//RICORDA che ogni receiver ha il suo proprio num_receiver[...] e messages[...]

msg_t arecv(pid_t sender) {
	p = getpid();
	
	if (messages[sender].size() > 0 && messages[sender].top() == num_receiver[sender]) {
		(msg, num_mess) = messages[sender].removeTop();
		num_receiver[sender]++;
		return msg;
	}

	(msg, num_mess) = nfarecv(sender);

	while (num_mess != num_receiver[sender]) {
		messages[sender].insert(msg, num_mess);
		(msg, num_mess) = nfarecv(sender);
	}

	num_receiver[sender]++;
	return msg;	
}