6
SISTEMI OPERATIVI ... febbraio 2012 Cognome: Nome: Matricola: 1. Ricordate che non potete usare calcolatrici o materiale didattico. 2. Ricordate che potete consegnare al massimo tre prove scritte per anno accademico. ESERCIZI RELATIVI ALLA PARTE DI TEORIA DEL CORSO (15 punti) ESERCIZIO 1 (4 punti) – Scheduling della CPU (1.1) Indicare, fra tutti quelli studiati, un algoritmo di scheduling della CPU preemptive (con prelazione) e un algoritmo di scheduling della CPU non preemptive (senza prelazione), spiegando cosa li rende tali e i rispettivi vantaggi: Algo. Preemptive: Round Robin È preemptive perché: quando scade il suo quanto di tempo, viene effettuata la prelazione della CPU al processo in esecuzione, il quale cambia stato e diventa ready, venendo posizionato in coda alla coda ready. Vantaggi: Non presenta il problema della starvation ed è particolarmente adatto alla realizzazione di sistemi in time-sharing, in quanto suddivide il tempo di CPU equamente fra i diversi processi. Algo. Non-preemptive: FIFO Non è preemptive perché: I processi accedono alla CPU nello stesso ordine di cui sono posizionati in coda ready. Quando un processo ottiene la CPU la mantiene fino al termine del suo burst di CPU, indipendentemente dalla sua durata. Vantaggi: Questo meccanismo non richiede l'implementazione di algoritmi particolari per il mantenimento di ordinamenti specifici della coda ready, inoltre non è affetto da starvation. (1.2) Si consideri il diagramma delle transizioni di stato dei processi: un processo nello stato waiting può transire nello stato running ? No. Dovrà comunque attraversare lo stato ready. (1.3) Si considerino i seguenti processi, tutti in coda ready (il numero d'ordine del processo indica la posizione in coda, P1 è in testa alla coda, seguito da P2, ecc.), e le relative stime di durata dei prossimi burst di CPU. Si calcoli il tempo medio di attesa nel caso in cui l'algoritmo di scheduling utilizzato sia il round-robin (è necessario riportare il diagramma di Gantt): 1

Esercizi di Sistemi Operativi 1

Embed Size (px)

DESCRIPTION

Esercizi di Sistemi Operativi 1

Citation preview

Page 1: Esercizi di Sistemi Operativi 1

SISTEMI OPERATIVI... febbraio 2012

Cognome: Nome: Matricola:

1. Ricordate che non potete usare calcolatrici o materiale didattico.

2. Ricordate che potete consegnare al massimo tre prove scritte per anno accademico.

ESERCIZI RELATIVI ALLA PARTE DI TEORIA DEL CORSO (15 punti)

ESERCIZIO 1 (4 punti) – Scheduling della CPU(1.1) Indicare, fra tutti quelli studiati, un algoritmo di scheduling della CPU preemptive (con prelazione) e un algoritmo di scheduling della CPU non preemptive (senza prelazione), spiegando cosa li rende tali e i rispettivi vantaggi:

Algo. Preemptive: Round RobinÈ preemptive perché:quando scade il suo quanto di tempo, viene effettuata la prelazione della CPU al processo in esecuzione, il quale cambia stato e diventa ready, venendo posizionato in coda alla coda ready.

Vantaggi:Non presenta il problema della starvation ed è particolarmente adatto alla realizzazione di sistemi in time-sharing, in quanto suddivide il tempo di CPU equamente fra i diversi processi.

Algo. Non-preemptive: FIFONon è preemptive perché:I processi accedono alla CPU nello stesso ordine di cui sono posizionati in coda ready. Quando un processo ottiene la CPU la mantiene fino al termine del suo burst di CPU, indipendentemente dalla sua durata.

Vantaggi:Questo meccanismo non richiede l'implementazione di algoritmi particolari per il mantenimento di ordinamenti specifici della coda ready, inoltre non è affetto da starvation.

(1.2) Si consideri il diagramma delle transizioni di stato dei processi: un processo nello stato waiting può transire nello stato running?No. Dovrà comunque attraversare lo stato ready.

(1.3) Si considerino i seguenti processi, tutti in coda ready (il numero d'ordine del processo indica la posizione in coda, P1 è in testa alla coda, seguito da P2, ecc.), e le relative stime di durata dei prossimi burst di CPU. Si calcoli il tempo medio di attesa nel caso in cui l'algoritmo di scheduling utilizzato sia il round-robin (è necessario riportare il diagramma di Gantt):

1

Page 2: Esercizi di Sistemi Operativi 1

P DP1 8P2 6P3 12P4 2

Quanto == 4

t_P1 = 0+(14-4) = 10t_P2 = 4+(18-8) = 14t_P3 = 8+(20-12)+0 = 16t_P4 = 12

tma = (10+14+16+12)/4 = 52/4 = 13

ESERCIZIO 2 (2 punti) - Thread(2.1) Spiegare la differenza fra thread kernel e thread utente:I thread sono detti kernel quando sono riconosciuti come unità computazionali dal sistema operativo, il quale ne possiede una rappresentazione e applica opportuni meccanismi per la loro gestione. I thread sono detti kernel quando sono realizzati a livello di programmazione tramite opportune librerie (es. POSIX) ma non sono né riconosciuti né gestiti dal sistema operativo, il quale vede come unità minima di computazione il processo.

(2.2) Che cosa si intende per upcall?Nei sistemi operativi a thread, che implementano lo schema molti-a-molti, una upcall è uno strumento tramite il quale il sistema operativo informa un processo che uno dei thread ai quali è stato assegnato un LWP ha compiuto un'operazione con effetti sostensivi (esempio operazione di I/O) quindi l'LWP può essere assegnato a un altro eventuale thread nello stato ready.

ESERCIZIO 3 (5 punti) – RAM e Memoria Virtuale(3.1) Illustrare il meccanismo di traduzione di un indirizzo logico in un indirizzo fisico nel caso in cui la RAM sia gestita tramite paginazione e il sistema mantenga una tabella delle pagine invertita:

Si veda lo schema studiato a lezione.

(3.2) Si consideri un sistema operativo che adotta un meccanismo di memoria virtuale e si spieghi l'algoritmo di selezione della pagina vittima noto come LRU:LRU associa a ogni pagina caricata in un frame di RAM un marcatore temporale, che viene inizializzato a tempo di caricamento in RAM della pagina e viene aggiornato ogni volta che il processo effettua un accesso alla pagina in questione. In caso di page fault viene scelta come vittima la pagina col marcatore più basso, cioè quella utilizzata meno di recente.

2

P1 P2 P3 P4 P1 P2 P3 P3

0 4 8 12 14 18 20 24 28

Page 3: Esercizi di Sistemi Operativi 1

(3.3) Si consideri un sistema in cui LRU è approssimata tramite bit di riferimento e registri a scorrimento a quattro bit. Supponendo che, dopo la sequenza di di accessi a pagine riportata nel seguito, un processo produca un page fault, quale pagina sarà scelta come vittima? Calcolare il risultato illustrando l'evoluzione del contenuto dei registri durante l'esecuzione del processo.

Sequenza: 1, 1, 2, 1, 1, 3, 2, 3, 3, 2, 3, 1

Partenza:

11 2 11 3 2 33 2 3 11 0000 1100 0110 1101 0110 0011 0000 0000 0000 10002 0000 0000 1000 0010 0001 1000 0010 1001 0100 00103 0000 0000 0000 0000 1000 0100 1101 0110 1011 0101

>> La pagina scelta come vittima è la numero: 2

>> perché: il contenuto del suo registro codifica il timestamp più basso.

ESERCIZIO 4 (4 punti) – File System(4.1) Spiegare che cosa si intende per journaling del file system, per quale motivo è stato introdotto, quali sono i suoi vantaggi e svantaggi:Il journaling è un meccanismo finalizzato a rendere più veloce e sicuro il recovery del file system in caso di crash del sistema. Viene mantenuto in memoria secondaria un journal, nel quale verranno segnate tutte le modifiche effettuate dai processi ai diversi file prima che queste vengano attuate. In questo modo, in caso di crash è possibile limitare la verifica del file system alle sole porzioni di file modificate negli ultimi minuti. Le modifiche che si trovano nel journal ma non trovano riscontro nei file vengono effettuate, quelle che non erano rimaste segnate nel journal non richiedono interventi. VANTAGGI: rapidità del recovery del file system, la cui durata diventa indipendente dalla dimensione del file system gestito. SVANTAGGI: rallentamenti nelle scritture dovuti alla necessità di mantenere il journal aggiornato.

(4.2) Spiegare, aiutandosi con un disegno, com'è fatta e a che cosa serve una FAT (File Allocation Table):

Per il disegno si vedano le slide.

La FAT è una tabella (un array) avente tanti elementi quanti blocchi di memoria contiene un file system (l'indice permette di focalizzarsi sulla cella corrispondente a uno specifico blocco). Per ogni blocco indica se è guasto, se è non in uso oppure se appartiene a un file. In quest'ultimo caso il contenuto della cella sarà, in genere, un riferimento al blocco successivo contenente dati del file realizzando così una lista concatenata. Il primo elemento di una lista concatenata siffatta sarà direttamente riferito dall'inode del file. Le informazioni contenute nella FAT consentono di accedere ai blocchi dati dei vari file.

3

Page 4: Esercizi di Sistemi Operativi 1

ESERCIZI RELATIVI ALLA PARTE DI UNIX (6 punti)

ESERCIZIO 1 (2 punti)(1.1) Che cosa si intende per real user id di un processo? È un identificatore di utente associato a un processo: identifica l'utente che ha avviato l'esecuzione di quel processo.

(1.2) Che cosa si intende per effective user id di un processo?Anche questo è un identificatore di utente associato a un processo: se il suid è settato sarà uguale all'utente proprietario del file eseguibile (la cui esecuzione ha dato luogo al processo), se non è settato sarà identico al real user id.

ESERCIZIO 2 (2 punti)

Dato il seguente makefile:

funz1.o: funz1.cgcc -c funz.c

main.o: main.c funz.hgcc -c main.c

prog: main.o funz.ogcc -o prog main.o funz.o

(2.1) In quali circostanze verrà ricostruito l'eseguibile prog?Prog sarà ricostruito quando non esiste (es. È stato cancellato) oppure quando main.o oppure funz.o risultano aggiornati più recentemente di prog stesso, cioè quando almeno uno dei due main.c, funz.h è stato aggiornato più recentemente del target a cui è associato oppure quando, esternamente al makefile, funz.o è stato rigenerato.

(2.2) Quali condizioni devono valere affinché venga eseguita la linea di compilazione relativa alla seconda regola?La seconda regola (main.o) scatta se main.c oppure funz.h è più recente di main.o oppure quando main.o non esiste.

ESERCIZIO 3 (2 punti)

(3.1) Spiegare il funzionamento della system call msgget:si vedano le slide.

(3.2) La seguente invocazione di msgrcv è corretta? Se sì spiegarne il funzionamento, se no spiegarne il motivo (NB: l'assenza della motivazione rende sbagliata la risposta):

ris = msgrcv(qid, &mm, 0, 0, 0);

4

Page 5: Esercizi di Sistemi Operativi 1

[X] NO (è errata). Il motivo è: sebbene sintatticamente l'invocazione sia corretta, il terzo parametro è il numero di byte di cui dovrebbe essere costituito il messaggio. Si tratta di un dato di un tipo fondamentale o derivato, quindi la dimensione da esso occupata non può essere pari a zero.

ESERCIZI RELATIVI ALLA PARTE DI C (6 punti)

ESERCIZIO 1 (2 punti)

Si implementi la funzione con prototipo

int binary_search(int array[], int n, int what);

binary_search è una funzione che implementa la ricerca binaria del valore what nell’array array che si suppone ordinato per valori crescenti e restituisce la posizione. Restituisce –1 se non lo trova. n è la dimensione dell’array array.

int binary_search (int array[], int n, int what) {

int i = 0, j = n, k; while (i<j) {

k = (i+j)/2;if (array[k] < what) i=k+1;else if (array[k] > what) j=k-1;else return k;

} return -1;

}

ESERCIZIO 2 (2 punti)

Si implementi la funzione con prototipo

node * creaLista(int N, int value)

che crea una lista di N elementi di tipo node, e li inizializza al valore value e restituisce il puntatore alla testa della lista

La struttura node è definita come segue:

typedef node* link;typedef struct node {

int value;link next;

} node;

node * creaLista(int N, int value) {

5

Page 6: Esercizi di Sistemi Operativi 1

node * head = NULL;if (N > 0) {

head = (node *) malloc(sizeof(node));head->value = value;head->next = creaLista(N-1, value);

}return head;

}

ESERCIZIO 3 (2 punti)

Data la struttura node, implementare la funzione con prototipo

float average(link head);

average è una funzione che calcola la media dei valori nel campo value della lista. Se la lista è vuota, la funzione restituisce 0.

Funzione da implementare

float average(link head) {

float sum = 0.0, n = 0; while (head != NULL) {

sum += head->value;n++;head = head->next;

} if (n>0) return sum/n; else return 0.0;

}

6