Author: monica

Compito di Sistemi Operativi
30 Giugno 2010

Esercizio 1 (6 punti)
Un sistema gestisce il processore con politica Round Robin con quanto di tempo di 5msec. Nel sistema sono presenti 4 processi (A,B,C,D) e un semaforo di mutua esclusione mutex. Al tempo t viene messo in esecuzione il processo A, mentre la coda pronti contiene i processi D→C→B e il semaforo mutex ha valore 0 e coda vuota. 
Si descriva quale è il processo in esecuzione e la composizione della coda pronti nell’intervallo di tempo da t a t+20, nel corso del quale si verificano i seguenti eventi: 
1)	il processo in esecuzione si sospende al tempo t+8 sul semaforo mutex; 
2)	il processo in esecuzione si sospende al tempo t+14 sul semaforo mutex; 
3)	il processo in esecuzione esegue una signal(mutex) al tempo t+16.
Suggerimento: Costruire una tabella con colonne Tempo, In esecuzione, Coda pronti, Sospesi.

Esercizio 2 (7 punti)
Analizzare il seguente codice C e descriverne brevemente (con una frase) il compito svolto:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define N 5

void child(int i, int pp[2])
{
	double res = 1.0;
	int j;
	for(j=0; j<i; j++) 
	    res = res*2;
	write(pp[1], &res ,sizeof(double));
	exit (0);
}

int main ()
{
	int i, ch;
	double sum = 0.0;
	double ret = 0.0;
	int p[N][2];

	// Crea N pipe
	for(i=0; i<N; i++)
	    pipe(p[i]);

	for(i=0; i<N; i++) 
	{
	    ch = fork();
	    if(ch == 0)
		 child(i, p[i]);
	}

	for(i=0; i<N; i++) 
	{
	    read(p[i][0], &ret, sizeof(double));
	    printf("Child %d: %lf\n", i, ret);
	    sum += ret;
	}
	printf ("Sum: %lf\n", sum);
	return 0;
}

Nota: read e write sono funzioni di lettura/scrittura da/su file. I tre parametri che le caratterizzano rappresentano rispettivamente il file handle, il puntatore alla memoria in cui salvare/da cui estrarre informazione, la dimensione in byte di detta memoria. L’istruzione pipe(int fd[2]) crea una pipe e associa i file descriptor fd[0] e fd[1] alla pipe, rispettivamente come file descriptor di lettura e scrittura. 
Esercizio 3 (4 punti)
Un sistema con cinque processi, A, B, C, D, E, e quattro tipi di risorse, R_1, R_2, R_3, R_4, rispettivamente di molteplicità [5, 4, 7, 3], adotta nei confronti dello stallo la politica di prevenzione dinamica tramite l’algoritmo del banchiere. Ad un dato istante di tempo t tutti i processi sono attivi e si è raggiunto lo stato mostrato nelle tabelle seguenti:
                            
Determinare se il sistema è in stato sicuro e se una richiesta ulteriore da parte del processo A di una risorsa di tipo R_1 può essere immediatamente soddisfatta.

Esercizio 4 (6 punti)
Un disco è costituito da 4 facce (numerate da 0 a 3), 50 cilindri (numerati da 0 a 49) e 20 settori per traccia (numerati da 0 a 19). Ogni settore contiene 1024 byte. A livello logico i blocchi del disco corrispondono a settori e sono individuati con indici di blocco, interi compresi nell’intervallo [0, capacità_in_blocchi − 1]. Gli indici di blocco sono definiti secondo la sequenza faccia, cilindro, settore (ad esempio, il blocco 22 corrisponde al settore 2 della faccia 1 del cilindro 0). 
Si stabilisca: 
1)	la capacità del disco, in numero di blocchi e di byte; 
2)	l’indice di blocco corrispondente all’indirizzo fisico (f,c,s), con f=2, c=39, s=10; 
3)	la terna corrispondente al blocco 1525.

Esercizio 5 (12 punti)
1)	Modificare il programma dell’Esercizio 2 in modo che utilizzi memoria condivisa e semafori al posto delle pipe (usare esclusivamente l’interfaccia Posix). (6 punti)
2)	Quali sono le differenze ed i vantaggi dei due approcci? (1 punti)
3)	Se invece delle pipe si usassero dei comuni file per scambiare i dati cosa altro si dovrebbe aggiungere? (3 punti)
4)	In che modo su Linux l’utilizzo dei file invece che delle pipe potrebbe penalizzare la performance? (2 punti)