c1 Monitor con Semafori

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();
}

}

c2 Message Passing

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)
}

g1 Scheduling

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