Prova scritta di Sistemi Operativi, Prof. Mancini - 30 Settembre 1998
1. (punti: -1,4)
Si consideri il meccanismo primitivo receive per lo scambio di messaggi:
Quali fra le seguenti affermazioni sono corrette:
Ad ogni processo del sistema operativo Unix viene associata logicamente una quadrupla (proprietario reale, gruppo reale, proprietario effettivo, gruppo effettivo):
Nel sistema operativo Unix un utente richiede l'esecuzione dell'archivio a.out:
Illustrare in al piu' 60 parole il concetto di insieme di lavoro (working set) WS(t,d ) di un processo.
6. Considerare un insieme di cinque processi
P1, P2, P3, P4, P5
con i seguenti tempi di arrivo 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 4 5 2 6 4 3 7 5 0 6 1 6 2 5 4 0 7 1 3
Risolvere utilizzando un monitor il problema dei processi lettori e scrittori, adottando una politica che eviti l'attesa indefinita.
9. (punti: 8)
Realizzare un Perl script efficiente che riceve dalla linea di comando un pattern ed una sequenza di file e che restituisce come risultato un file di tutte le linee che NON contengono il pattern passato come argomento.
Risultati della prova
1. a,b,c,h
2. c
3. e
4. f
5.
Si definisce insieme di lavoro WS(t,d) di un processo Pi
al tempo virtuale t l'insieme delle pagine riferite da Pi
nell'intervallo di tempo virtuale (t-d,t]. Il tempo virtuale del generico
processo Pi e' definito uguale a zero alla generazione del processo
e avanza con un incremento unitario a ogni riferimento alla memoria eseguito
da Pi (si veda Maestrini).
6.
a) Algoritmo Round Robin
con quanto = 4 millisecondi:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b) media tempo di attesa dei
processi: 118/5
c) throughput medio: 5/45
7.
a) Algoritmo Second Chance
(pag 473 del Maestrini):
|
TurnoMS e' inizializzato a 4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Numero di page fault: 16
b) Algoritmo LRU (pag
469 del Maestrini):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Numero di page fault: 17
8.
Qui sono riportate le generiche procedure Lettore e Scrittore.
void Lettore() { monitor.OttieniPermessoInLettura(); Lettura(); monitor.RilasciaPermessoInLettura(); } void Scrittore() { monitor.OttieniPermessoInScrittura(); Scrittura(); monitor.RilasciaPermessoInScrittura(); }Monitor: variabili permanenti
condition L, S; boolean Scrittori=False; int ContatoreLettori=0, ContatoreLettoriNelMonitor=0, ContatoreScrittoriNelMonitor=0;Monitor: procedure interne
Monitor::OttieniPermessoInLettura() { ContatoreLettori++; If ( ContatoreScrittoriNelMonitor == 0 || Scrittori ) { ContatoreLettoriNelMonitor++; wait(L); ContatoreLettoriNelMonitor--; } signal(L); } Monitor::RilasciaPermessoInLettura() { ContatoreLettori--; If ( ContatoreLettori == ContatoreLettoriNelMonitor ) signal(S); } Monitor::OttieniPermessoInScrittura() { ContatoreScrittori++; If ( ( ContatoreLettori == ContatoreLettoriNelMonitor ) || Scrittori ) { ContatoreScrittoriNelMonitor++; wait(S); ContatoreScrittoriNelMonitor--; } Scrittori=True; } Monitor::RilasciaPermessoInScrittura() { ContatoreScrittori--; Scrittori=False; If (ContatoreLettori != 0) signal(L); else signal(S); }
9.
#!/usr/bin/perl die "Argomenti insufficienti!" if ( scalar(@ARGV) < 2 ); $Pattern = shift @ARGV; open(OUT,"Output") || die $!; foreach (@ARGV) { while (<>) { print OUT $_ 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).
Lo script e' stato testato con il Perl 5.004 in ambiente Linux.
- 30 Settembre 1998 -
Si ringraziano i volenterosi studenti Alessandro
Cagnetti e Daniele
Giabbai