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.