Esempi di domande ‘tipo provetta’ su Unix/Korn shell
Descrivere il funzionamento, lo scopo e le caratteristiche principali delle chiamate di
sistema nei sistemi operativi.
Le chiamate di sistema rappresentano un particolare servizio che i programmi utente
richiedono al Sistema Operativo. Una chiamata di sistema e’ svolta da una procedura
contenuta nel nucleo del S.O. Il software del nucleo esegue in una modalita’ tale che ha accesso
a tutte le parti del S.O., mentre i programmi utente girano in una modalita’ tale che solo alcune
istruzioni sono eseguibili. Il passaggio tra le due modalita’ e’ realizzato dagli interrupt. Gli
interrupt software, in particolare, sono quelli usati dal programma utente per trasferire il
controllo al S.O.
Descrivere i compiti del nucleo di un sistema operativo
Una definizione esatta dipende dal tipo di S.O. In alcuni S.O. il nucleo svolge molte funzioni di
gestione dei componenti del S.O. In altri il nucleo e’ molto leggero e svolge solo alcuni servizi,
come il passaggio di messaggi o la comunicazione. Sicuramente in tutti i S.O. il nucleo gestisce
gli interrupt.
Scrivere il comando Unix per cancellare tutti i file che cominciano con un numero,
proseguono con due trattini (-), poi con un backslash (\), seguito da un carattere qualsiasi e
finiscono con un carattere che non sia maiuscolo.
ls [0-9]\-\-\\?[!A-Z] oppure ls [0-9]'--\'?[!A-Z]
Si consideri la seguente gerarchia di directory (pippo, java, script sono directory) presenti
in /path:
pippo
|
-----------------------------|
|
java
script
Sapendo che i ‘file mode’ di pippo sono ‘drwxr-x—x’, di java ‘dr-x------‘, e di script sono
‘drwxr-xrwx’, e che tutte le directory appartengono all’utente ‘Gianni’, e al gruppo ‘staff’,
rispondere alle seguenti domande:
puo’ un utente (diverso da Gianni) del gruppo ‘user’ dare i seguenti comandi ? :
cd /path/pippo
ls –l
puo’ un utente (diverso da Gianni) del gruppo ‘staff’ dare i seguenti comandi ? :
cd /path/pippo/java
ls –l
puo’ un utente (diverso da Gianni) del gruppo ‘user’ dare i seguenti comandi ? :
cd /path/pippo/script
who > temp
Il significato dei bit di protezione delle directory e’ il seguente:
ls
cd
R
Si
No
W
No
No
X
no
Si
Quindi: cd/path/pippo
 Si
ls –l
 No
cd /path/pippo/java  No
ls –l
 No
cd /path/pippo/script  Si
who > temp  Si
Scrivere uno script con menu’ in Korn Shell che chieda all’utente con che terminale vuole
lavorare ed assegni la variabile d’ambiente TERM ai seguenti valori: vt100, vt102, vt220
(TERM=vt100 etc.) se l’utente ha scritto che vuole lavorare con un terminale DEC
VT100, DEC VT102 o DEC VT220 rispettivamente.
PS3="con quale terminale vuoi lavorare?"
temp=$TERM
select var in "DEC VT100" "DEC VT102" "DEC
do
case $var in
"DEC VT100") TERM=vt100
print "$temp e' stato
"DEC VT102") TERM=vt102
print "$temp e' stato
"DEV VT220") TERM=vt220
print "$temp e' stato
"esci") exit;;
esac
done
VT220" esci
cambiato in $TERM";;
cambiato in $TERM";;
cambiato in $TERM";;
Descrivere brevemente il Process Control Block di un Sistema Operativo e le informazioni
in esso contenute.
Il Process Control Block (PCB) di un sistema operativo e' utilizzato per memorizzare le
informazioni che descrivono un processo: ogni processo ha una PCB associata.
Le informazioni contenute nel PCB associato ad un processo includono:
- identificatori del processo, del processo padre e dell'utente che sta eseguendo il processo
- stato della CPU: registri, stack ...
- informazioni sul controllo del processo:
informazioni per la schedulazione,
stato corrente del processo,
tempi di esecuzione,
informazioni sulle IPC,
privilegi,
gestione e allocazione memoria,
uso delle risorse
Descrivere le funzioni generali del nucleo di un Sistema Operativo (non microkernel).
In generale, le funzioni del nucleo di un sistema operativo non microkernel (si pensi a Unix S5)
sono
- gestione interrupt
- creazione/distruzione processi
- context switch
- schedulazione
- sincronizzazione
- inter process communication (IPC)
- gestione PCB
- gestione del file system
Descrivere alcune code d’attesa presenti in un Sistema Operativo.
Le code d'attesa piu' tipiche sono: la code d'attesa dei processi pronti per l'esecuzione, la coda
d'attesa dei processi che aspettano la terminazione di una operazione di I/O e le code d'attesa
che un semaforo diventi libero.
Si consideri il codice eseguibile di un Sistema Operativo.
a. Cosa succede se un utente lo esegue come processo d’utente senza prendere i
dovuti accorgimenti?
b. A cosa potrebbe servire?
Il codice di un S.O. contiene molte istruzioni privilegiate. Si consideri ad esempio il codice
eseguibile di Linux. Se si facesse eseguire a livello utente, le istruzioni privilegiate del codice
eseguibile farebbero terminare l'esecuzione. Comunque, eseguire il codice su un sistema
operativo a livello utente potrebbe essere utile per correggere o sviluppare il sistema stesso.
Bisognerebbe eliminare tutte le istruzioni privilegiate,oppure catturarle mediante una macchina
virtuale.
Si rappresenti un diagramma semplificato di transizione degli stati di un processo in
esecuzione in un Sistema Operativo. Descrivere alcuni casi in cui si realizzano le
transizioni che coinvolgono lo stato di WAIT (d’attesa o bloccato).
Pronto
in mem.
creato
run
terminato
attesa
Un processo puo' andare in stato d'attesa se richiede una operazione di I/O. Puo' uscirne se
l'operazione e' terminata. Può anche andare in stato d'attesa se viene chiamata la sleep() e
puo' uscirne se la sleep termina. Anche i semafori mettono in stato di wait un processo.
Si supponga che un sistema abbia accreditato l’utente Giorgio, con UID =100 e GID=120, e
l’utente Giulio, con UID=110 e GID=120.
Nella home directory di Giulio c’è il file data.txt, di proprietà di Giulio, ed i file
data1.txt e data2.txt, entrambi di proprietà di Giorgio.
mycat è un programma eseguibile, scritto e compilato da Giorgio, che si comporta in modo
simile al comando di Unix cat, e che si trova nella home directory di Giulio.
Si supponga che gli 11 bit meno significativi del file mode (SUID|SGID|protezioni) siano
codificati in base 8 nel seguente modo:
data.txt
data1.txt
data2.txt
mycat
 440
 1700
 2400
 2770
Può Giulio eseguire il programma mycat data.txt data1.txt data2.txt ? Se no,
cosa può fare Giulio per eseguire correttamente il suo programma?
Se mycat è un programma eseguibile che si comporta come il comando cat di Unix, allora la
sintassi mycat <file1> <file2> <file3> è corretta.
Per quanto riguarda le protezioni:
Riassumendo la situazione degli ID e degli 11 bit di protezione (come detto nel testo divisi
in SUID|SGID|rwd|rwd|rwd) dei tre file si ha:




data.txt
 00|100|100|000 cioè permesso di lettura per proprietario e
gruppo, file di Giulio, gruppo 120
data1.txt  01|111|000|000 cioè il proprietario può fare tutto, gli
altri non possono fare niente, il file è di Giorgio ma
il gruppo è lo stesso di Giulio
data2.txt  10|100|000|000 cioè il file è di Giorgio, ma solo il
proprietario può leggerlo. Inoltre il file e’ dello
stesso gruppo di Giulio
mycat
 10|111|111|000 cioè il file è di Giorgio, ma ha il set
user ID settato. Sia il proprietario che il gruppo può
eseguirlo.
da cui si evince che:
Il processo mycat ha il real uid di Giulio e il real gid pari a 120. Inoltre il suo setuid è
settato. Quando viene eseguito il suo effective uid diventa quello di Giorgio mentre il suo
effective gid è 120.
Quando mycat tenta di leggere data.txt, vede che l’effective uid di mycat non coincide con il
proprietario del file e quindi i bit di protezione da considerare sono quelli del gruppo, cioè
puo’ leggere il file data.txt.
Quando mycat tenta di leggere data1.txt vede che l’effective uid coincide con quello del file,
e quindi le protezioni da considerare sono quelle del propprietario, che consentono la
lettura.
Infine mycat può leggere data2.txt.
Lo stesso utente Giulio realizza i seguenti comandi di Unix:
ln data.txt newdata.txt
ln –s newdata.txt newdatas.txt
Cosa succede se Giulio esegue i seguenti comandi? (descrivere brevemente l’azione di ogni
comando; naturalmente si suppone che data1.txt sia leggibile).
cat newdata.txt
cat newdatas.txt
rm newdata.txt
cat newdatas.txt
cat data1.txt > newdata.txt
cat newdatas.txt
Innanzitutto vediamo i due comandi iniziali. Il primo, ln data.txt newdata.txt ,
realizza un link hard al file data.txt, introducendo un nuovo elemento nella directory che si
chiama newdata.txt e che punta allo stesso inode. Il file newdata.txt è indistinguibile da data.txt.
Il secondo comando, ln –s newdata.txt newdatas.txt, crea un file con un altro
inode che punta al file appena creato mediante un link simbolico, newdata.txt.
Ovviamente cat newdata.txt e cat newdatas.txt mostrano il contenuto dello
stesso file, cioè del file data.txt. Il comando rm newdata.txt rimuove il file
riducendo il numero di link. Il comando cat newdatas.txt dà errore non perché il file
non esista, ma perché punta ad un file inesistente (newdatas.txt punta sempre al file
newdata.txt).
Il comando cat data1.txt > newdata.txt o dà errore perché il file data1.txt
non è leggibile (si veda il punto precedente) oppure, se il problema di protezione è stato risolto,
crea il nuovo file newdata.txt mediante redirezione.
Nel primo caso il comando cat newdatas.txt dà errore perché il file non esiste. Nel
secondo caso il comando cat newdatas.txt visualizza il contenuto del file appena
ricreato, cioè il contenuto di data1.txt.