Compito di Sistemi Operativi, Prof. Mancini - 28 gennaio 1998
1. (punti: -1.5, 4)
L'organizzazione del sistema operativo basato sul modello orientato alle procedure:
Il costrutto di sincronizzazione chiamato monitor:
La primitiva hP (hardware P):
Un file system Fj e' montato su un direttorio Di del file system Fi del sistema Unix:
5. (punti: -0.5, 5.4)
Un processo del sistema Unix chiude l'archivio /users/studenti/file1
che a suo tempo era stato regolarmente aperto. L'operazione ha successo.
Quali delle seguenti strutture dati sono state sicuramente modificate
e quali sono rimaste sicuramente invariate durante l'esecuzione
di questo comando? (Indicare M per sicuramente modificate, I
per sicuramente Invariate).
Struttura dati | Modificata/Invariata |
a) il super-block | |
b) l'i-node bitmap | |
c) la block bitmap | |
d) l'i-node di "file1" | |
e) la tabella FILP | |
f) la tabella degli i-node | |
g) la tabella dei processi | |
h) il root-directory | |
i) il direttorio "studenti" |
6. Considerare un insieme di cinque processi
P1, P2, P3, P4, P5
con i seguenti tempi di arrivo e tempi di esecuzione in millisecondi:
Processo | Tempo di arrivo | Tempo di esecuzione |
P1 |
|
|
P2 |
|
|
P3 |
|
|
P4 |
|
|
P5 |
|
|
7. Considerare la seguente stringa di riferimenti di un processo alla memoria in un sistema con memoria virtuale:
S = 1 0 3 5 6 1 9 19 5 18 9 15 1 3 5 1 6 19 9 3
8. (punti: 10)
Lungo una strada a due corsie e doppio senso di marcia, che procede
in direzione nord-sud, vi e' un ponte ad una sola corsia, percorribile
a senso unico alternato. Il ponte ha la capacita' di n automobili. Le automobili
dirette verso nord (verso sud) possono attraversare il ponte solo se non
e' attraversato da nessuna automobile diretta verso sud (verso nord). Scrivere
il programma dei due generici processi "automobile diretta verso nord"
e "automobile diretta verso sud" utilizzando il meccanismo dei semafori.
Discutere le proprieta' della soluzione proposta (assenza di stallo, starvation,
ecc.).
9. (punti: 6)
La funzione "contextGrep" visualizza insieme ad ogni linea trovata dall'operazione di grep anche la linea precedente e quella successiva. Scrivere un Perl script che esegue tale funzione in tempo lineare e spazio costante.
Risultati della prova
1. b
2. d,f
3. f
4. c
5.
Struttura dati | Modificata/Invariata |
a) il super- block | I |
b) l'i- node bitmap | I |
c) la block bitmap | I |
d) l'i- node di "file1" | I |
e) la tabella FILP | M |
f) la tabella degli i- node | |
g) la tabella dei processi | M |
h) il root- directory | I |
i) il direttorio "studenti" | I |
6.
P1 |
P2 |
P2 |
P5 |
P3 |
P3 |
P5 |
P4 |
P1 |
0-4 |
4-7 |
7-8 |
8-9 |
9-11 |
11-15 |
15-22 |
22-29 |
29-41 |
Tempo medio di turnaround = 84/5
7.
(a) Algoritmo Second Chance
(pag 473 del Maestrini):
|
TurnoMS e' inizializzato
a 4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Numero di page fault: 5+10
(b) Algoritmo ottimo:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
Numero di page fault: 5+6
8.
Occorre: 1) implementare due liste di "attesa", una per le automobili provenineti da nord e l'altra per le automobili provenienti da sud, ed implementarle sfruttando i semafori privati (ciascuna automobile deve essere dotata di semaforo privato); 2) realizzare la mutua esclusione per l'accesso alle variabili che governano il ponte e le liste di "attesa". Il tutto con queste modalita':
#define boolean int #define false 0 #define true !false boolean SulPonteDaSud=false; int AutomobiliSulPonte=0; /****************** DA NORD ******************/ void AccessoAutomobiliProvenientiDaNord() { int i; i=DeterminaProprioIndice(); P(mutex); /* Ottiene la mutua esclusione */ if ( SulPonteDaSud || !Vuota(ListaAttesaDaSud) || AutomobiliSulPonte==N ) { Push(ListaAttesaDaNord,i); /* l'automobile va messa in lista d'attesa */ } else { SulPonteDaNord=true; AutomobiliSulPonte++; PrivV(i); /* Questa chiamata elide la PrivP: NON vogliamo che "l'automobile" si addormenti ... zzz */ } V(mutex); /* Rilascia la mutua esclusione */ PrivP; /* Addormenta "l'automobile" (il processo)? Si se una delle condizioni qui sopra e' verificata */ } /******************/ void UscitaAutomobiliProvenientiDaNord() { int j; P(mutex); /* Ottiene la mutua esclusione */ AutomobiliSulPonte--; if (AutomobiliSulPonte==0) /* se e' l'ultima automobile... */ { /* ...allora si deve controllare che ce non ne siano dall'altra parte */ if ( Vuota(ListaAttesaDaSud) ) { /* "sveglia" al piu' N automobili in attesa da nord */ while ( !Vuota(ListaAttesaDaNord) && AutomobiliSulPonte<N ) { AutomobiliSulPonte++; j=Pop(ListaAttesaDaNord); PrivV(j); } } else { /* "sveglia" al piu' N automobili in attesa da sud */ SulPonteDaNord=false; SulPonteDaSud=true; while ( !Vuota(ListaAttesaDaSud) && AutomobiliSulPonte<N ) { AutomobiliSulPonte++; j=Pop(ListaAttesaDaSud); PrivV(j); } } } else { if ( Vuota(ListaAttesaDaSud) && !Vuota(ListaAttesaDaNord) ) { AutomobiliSulPonte++; j=Pop(ListaAttesaDaNord); PrivV(j); } else { SulPonteDaNord=false; } } V(mutex); /* Rilascia la mutua esclusione */ } /****************** DA SUD ******************/ void AccessoAutomobiliProvenientiDaSud() { int i; i=DeterminaProprioIndice(); P(mutex); /* Ottiene la mutua esclusione */ if ( SulPonteDaNord || !Vuota(ListaAttesaDaNord) || AutomobiliSulPonte==N ) { Push(ListaAttesaDaSud,i); /* l'automobile va messa in lista d'attesa */ } else { SulPonteDaSud=true; AutomobiliSulPonte++; PrivV(i); /* Questa chiamata elide la PrivP: NON vogliamo che "l'automobile" si addormenti ... zzz */ } V(mutex); /* Rilascia la mutua esclusione */ PrivP; /* Addormenta "l'automobile" (il processo)? Si se una delle condizioni qui sopra e' verificata */ } /******************/ void UscitaAutomobiliProvenientiDaSud() { int j; P(mutex); /* Ottiene la mutua esclusione */ AutomobiliSulPonte--; if (AutomobiliSulPonte==0) /* se e' l'ultima automobile... */ { /* ...allora si deve controllare che ce non ne siano dall'altra parte */ if ( Vuota(ListaAttesaDaNord) ) { /* "sveglia" al piu' N automobili in attesa da sud */ while ( !Vuota(ListaAttesaDaSud) && AutomobiliSulPonte<N ) { AutomobiliSulPonte++; j=Pop(ListaAttesaDaSud); PrivV(j); } } else { /* "sveglia" al piu' N automobili in attesa da nord */ SulPonteDaSud=false; SulPonteDaNord=true; while ( !Vuota(ListaAttesaDaNord) && AutomobiliSulPonte<N ) { AutomobiliSulPonte++; j=Pop(ListaAttesaDaNord); PrivV(j); } } } else { if ( Vuota(ListaAttesaDaNord) && !Vuota(ListaAttesaDaSud) ) { AutomobiliSulPonte++; j=Pop(ListaAttesaDaSud); PrivV(j); } else { SulPonteDaSud=false; } } V(mutex); /* Rilascia la mutua esclusione */ }
9.
#!/usr/bin/perl die "Errore tra i parametri." if (scalar @ARGV != 2); $StampaRigaSuccessiva = 0; $RigaPrecedente = ""; $Pattern = $ARGV[0]; open(FILEIN, $ARGV[1]) || die $!; while (<FILEIN>) { if ($StampaRigaSuccessiva) { print $_; $StampaRigaSuccessiva = 0; } if (/$Pattern/o) { print $RigaPrecedente, $_; $StampaRigaSuccessiva = 1; } $RigaPrecedente = $_; }
- 28 gennaio 1998 -
Si ringraziano i volenterosi studenti Alessandro Cagnetti, Daniele Giabbai, Mauro Sozio e Ivo (?).