Compito di Sistemi Operativi, Prof. Mancini - 2 luglio 1998
1. (punti: -1,4)
Il tempo di permanenza di un lavoro (job) e' definito come il tempo che intercorre fra l'immissione di un lavoro in un archivio di ingresso e la stampa dell'archivio di uscita prodotto con l'esecuzione. In un sistema multiprogrammato:
La primitiva hV (hardware V):
Un processo P richiede una risorsa che non puo' essere immediatamente assegnata, la richiesta di P rimane pendente:
L'insieme di lavoro (working set) WS(t,d ) di un processo P al tempo virtuale t e' definito come:
Illustrare in al piu' 60 parole il costrutto monitor.
6. Considerare un insieme di cinque processi
P1, P2, P3, P4, P5 con i seguenti tempi di arrivo e tempi di esecuzione
in millisecondi:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assegnare questo insieme di processi ad un processore in base alla politica Round Robin considerando un quanto di tempo di 3 millisecondi.
b (punti: 2)
Calcolare il valor medio del tempo di attesa dei processi.
c (punti: 2)
Calcolare il throughput medio, cioe' il numero di processi completati
nell'unita' di tempo;
S = 3 6 1 9 3 1 0 5 3 4 6 1 5 4 1 3 9 1 6 3
Illustrare il comportamento dell'algoritmo ottimo di sostituzione delle pagine per una memoria fisica di 5 blocchi. Calcolare il numero di page fault che si verificano.
b (punti: 3)
Illustrare il comportamento dell'algoritmo LRU di sostituzione delle pagine per una memoria fisica di 5 blocchi. Calcolare il numero di page fault che si verificano.
Utilizzare le primitive P e V definite sui semafori per risolvere il problema dei filosofi a cena evitando lo stallo. In particolare realizzare il ProtocolloPerMangiare ed il ProtocolloPerPensare.
9. (punti: 8)
Estendere il comando grep di Unix realizzando un Perl script efficiente
che puo' ricevere dalla linea di comando anche l'opzione -l, un pattern
ed una sequenza di file. Nel caso in cui venga specificata l'opzione -l
il comando restituisce in STOUT i nomi dei file che contengono pattern
piuttosto che le linee di file che contengono il pattern passato come argomento.
Si minimizzi il numero di test condizionali nel ciclo principale del programma.
Risultati della prova
1. b,f 2. e 3. a,e 4. d
5.
Il monitor consiste in un insieme di variabili permanenti, che sono le componenti del dato comune condiviso tra i processi, di un insieme di procedure interne che realizzano le operazioni ammissibili su dato comune, e di un programma d’inizializzazione. L’esecuzione delle procedure interne avviene in mutua esclusione. (Maestrini p.285, 47 parole)
6.
a) Algoritmo Round Robin
con quanto = 3 millisecondi:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b) media tempo di attesa dei
processi: 112/5
c) throughput medio: 5/44
7.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
Numero di page fault: 5+3
b. Algoritmo
LRU
(pag. 469 del Maestrini):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
Numero di page fault: 5+6
8. Si veda Maestrini Tab. 6.12, p. 273
#include "prototypes.h" #define N 5 #define SINISTRA (i-1)%N #define DESTRA (i+1)%N #define PENSA 0 #define AFFAMATO 1 #define MANGIA 2 typedef int semaphore; int stato[N]; semaphore mutex = 1; /* mutua esclusione */ semaphore filosofi[N]; /* Un semaforo per filosofo */ void filosofo(int i) { while(true) /* un filosofo fa solo questo.. */ { pensa(); /* non pensare troppo.. */ prendi_forchette(i); /* allora hai proprio fame! */ mangia(); /* yum -yum spaghetti al pesto.. */ posa_forchette(i); /* era proprio tempo!*/ } } void prendi_forchette(int i) { P(&mutex); stato[i] = AFFAMATO; test(i); V(&mutex); P(&filosofo[i]); } void posa_forchette(int i) { P(&mutex); stato[i] = PENSA; test(DESTRA(i)); /* sveglia i vicini.. */ test(SINISTRA(i)); V(&mutex); } void test(int i) { if (stato[i] == AFFAMATO && stato[SINISTRA[i]] != MANGIA && stato[DESTRA[i]] != MANGIA) { stato[i] = MANGIA; /* ‘se magna’ */ V(filosofo[i]); } }
9.
#!/usr/bin/perl $Flag = shift @ARGV if ($ARGV[0]=='-l'); $Pattern = shift @ARGV; foreach (@ARGV) { if ( defined $Flag ) # Qui stampa i nomi di file { while(<>) { if (/$Pattern/o) { print $ARGV; # parametro corrente last; } } } else # Stampa le righe { while(<>) { print $_ if (/$Pattern/o); } } }Notare che in un ciclo
foreach (@ARGV) { while(<>) {...} ...}l'interprete perl apre automaticamente tutti i files i cui nomi sono stati passati da riga di comando, senza dover specificare esplicitamente l'istruzione open.
Le soluzioni adottate in questo script sono rivolte all'efficienza, e non alla chiarezza dello script (come richiesto).
- 2 luglio 1998 -
Si ringraziano i volenterosi studenti Alessandro Cagnetti e Daniele Giabbai