Il Sistema Unix • • • • • • • • • Breve storia Principi di progetto Interfaccia per il programmatore Interfaccia utente Gestione dei processi Gestione della memoria File System Sistema di I/O Comunicazione fra processi Operating System Concepts 21.1 Silberschatz and Galvin1999 Breve storia • • • • Sviluppato inizialmente, a partire dal 1969, da Ken Thompson e Dennis Ritchie del gruppo di ricerca dei Bell Laboratories. Incorporò caratteristiche di altri sistemi operativi (es. MULTICS). La terza versione, scritta in C, fu sviluppata ai Bell Labs appositamente per supportare UNIX. La più significativa delle versioni UNIX non-Bell fu sviluppata alla University of California at Berkeley (Berkeley Software Distributions). – 4BSD UNIX è il risultato di un finanziamento DARPA per lo sviluppo di uno standard UNIX ad uso governativo. – Sviluppato per il VAX, 4.3BSD è una delle versioni più importanti e ne è stato fatto il porting su varie piattaforme. Vari progetti di standardizzazione hanno tentato di consolidare le varianti di UNIX, per ottenere un’unica interfaccia di programmazione verso il sistema. Operating System Concepts 21.2 Silberschatz and Galvin1999 Storia delle versioni UNIX Operating System Concepts 21.3 Silberschatz and Galvin1999 Vantaggi principali di UNIX • • • • Scritto in linguaggio ad alto livello. Distribuito sotto forma di sorgenti. Fornisce le primitive di un sistema operativo potente su di una piattaforma economica. Piccola dimensione, modulare, progetto “pulito”. Operating System Concepts 21.4 Silberschatz and Galvin1999 Principi di progetto di UNIX • • Progettato per realizzare il time–sharing. Possiede un’interfaccia utente (shell) semplice da usare e standard, che può essere facilmente sostituita e personalizzata. • • File system con directory a più livelli, strutturate ad albero. • Supporta processi multipli; un processo può creare facilmente altri processi. • I file sono supportati dal kernel come sequenze di byte senza struttura. Sistema altamente interattivo, fornisce facilities per lo sviluppo di programmi. Operating System Concepts 21.5 Silberschatz and Galvin1999 Interfaccia del programmatore Come molti sistemi operativi, UNIX consiste di due parti separate: • • Kernel: tutto ciò che si trova sotto l’interfaccia delle system-call e sopra l’hardware fisico. – Fornisce il file system, lo scheduling della CPU, la gestione della memoria ed altre funzioni di SO, tramite le chiamate di sistema. Programmi di sistema: impiegano le chiamate di sistema, supportate dal kernel, per fornire funzioni utili, come compilazione e manipolazione di file. Operating System Concepts 21.6 Silberschatz and Galvin1999 Struttura a strati di 4.3BSD UNIX Operating System Concepts 21.7 Silberschatz and Galvin1999 System Call • Le chiamate di sistema definiscono l’interfaccia del programmatore verso UNIX. • L’insieme dei programmi di sistema comunemente disponibili definisce l’interfaccia utente. • • Le interfaccie del programmatore ed utente definiscono il contesto che deve essere supportato dal kernel. Si hanno, approssimativamente, tre categorie di chiamate di sistema in UNIX: – Manipolazione di file (le stesse chiamate di sistema supportano anche la manipolazione dei dispositivi). – Controllo dei processi. – Manipolazione dell’informazione. Operating System Concepts 21.8 Silberschatz and Galvin1999 Manipolazione di file • • • • • Un file è una sequenza di byte; il kernel non impone ai file nessuna struttura. I file sono raccolti in directory, organizzate ad albero. Le directory sono file che contengono informazioni su come reperire altri file. Path name (nome di percorso): identifica un file specificando un cammino che, attraverso la struttura a directory, raggiunge il file. – Un path name assoluto inizia nella radice del file system. – Un path name relativo inizia nella directory corrente. System call per la manipolazione di file: create, open, read, write, close, unlink, trunc. Operating System Concepts 21.9 Silberschatz and Galvin1999 Struttura delle directory in UNIX Operating System Concepts 21.10 Silberschatz and Galvin1999 Controllo dei processi — 1 • • • Un processo è un programma in esecuzione, identificato univocamente dall’identificatore di processo (un intero). System call per il controllo dei processi: – fork crea un nuovo processo – execve viene impiegata dopo una fork per rimpiazzare la memoria virtuale di uno dei due processi (generalmente il “figlio”) con un nuovo programma – exit termina un processo – Un “padre” può attendere (wait) la terminazione di un processo “figlio”; wait fornisce il process id (pid) del figlio terminato, così da renderne nota l’identità al padre – wait3 consente al padre di produrre statistiche sulla performance dei figli Processo zombie: processo terminato dopo il padre. Operating System Concepts 21.11 Silberschatz and Galvin1999 System call di gestione dei processi Operating System Concepts 21.12 Silberschatz and Galvin1999 Controllo dei processi — 2 • • • I processi comunicano fra loro attraverso pipe, code di byte che sono accessibili tramite un descrittore di file. Tutti i processi utente sono figli di un unico processo, init. init crea un processo getty, che inizializza i parametri della linea del terminale e attende il login name dell’utente per passarlo al processo login. – Login confronta l’user identifier per verificarne i diritti di accesso al sistema. – esegue una shell che crea sottoprocessi per ciascun comando utente. Operating System Concepts 21.13 Silberschatz and Galvin1999 Segnali • • • Strumenti per gestire condizioni eccezionali. Simili alle interruzioni software. Il segnale di interrupt, SIGINT, viene impiegato per interrompere un comando prima che sia completato (in genere prodotto da un ^C). L’impiego di segnali è stato recentemente esteso e non è più relativo esclusivamente ad eventi eccezionali. – Inizio ed interruzione di processi on demand. – SIGWINCH informa un processo che la finestra nella quale verrà visualizzato l’output da esso prodotto ha cambiato dimensioni. – Invio di dati urgenti attraverso connessione di rete. Operating System Concepts 21.14 Silberschatz and Galvin1999 Gruppi di processi — 1 • Un insieme di processi correlati che concorrono alla realizzazione di un task comune. • In ogni istante, un unico gruppo di processi può utilizzare un certo terminale di I/O. – Il processo (unico) in foreground si svolge sotto gli occhi dall’utente al terminale. – I processi in background realizzano il loro compito senza interagire direttamente con l’utente. • L’accesso al terminale è controllato da signal di gruppo di processi. Operating System Concepts 21.15 Silberschatz and Galvin1999 Gruppi di processi — 2 • Ciascun processo eredita il proprio terminale di controllo dal processo padre. – Se il gruppo di processi associato ad un terminale di controllo coincide con il gruppo di un dato processo, quel processo si trova in foreground e gli è concesso di eseguire l’I/O. – SIGTTIN o SIGTTOU “congela” un processo background che tentasse di produrre output; se il processo viene portato in foreground, SIGCONT indica che l’I/O richiesto può ora essere eseguito. – SIGSTOP congela un processo foreground. Operating System Concepts 21.16 Silberschatz and Galvin1999 Manipolazione dell’informazione • • Chiamate di sistema per impostare e restituire il valore di un timer getitmer/setitmer o l’ora corrente gettimeofday/settimeofday. I processi possono richiedere: – il loro identificatore di processo: getpid – il loro identificatore di gruppo: getgid – il nome della macchina su cui sono in esecuzione: gethostname Operating System Concepts 21.17 Silberschatz and Galvin1999 Routine di libreria • • • L’interfaccia delle chiamate di sistema in UNIX viene supportata ed ampliata da una notevole collezione di routine di libreria. I file header forniscono la definizione di strutture dati complesse impiegate nelle chiamate di sistema. Librerie addizionali sono fornite per funzioni matematiche, accesso alla rete, conversioni di dati, ecc. Operating System Concepts 21.18 Silberschatz and Galvin1999 Interfaccia utente • • • Programmatori ed utenti interagiscono prevalentemente con programmi di sistema già esistenti: Le chiamate di sistema richieste sono incorporate nel programma e non devono essere conosciute dall’utente. I programmi di sistema più comuni sono orientati alla gestione di file e directory. – Directory: mkdir, rmdir, cd, pwd – File: ls, cp, mv, rm Altri programmi sono relativi a editor (e.g., emacs, vi) formattatori di testo (e.g., troff, TEX), e altro. Operating System Concepts 21.19 Silberschatz and Galvin1999 Shell e comandi • • • Shell o interprete dei comandi – il processo utente che esegue i programmi. • • Il comando tipico è il nome di un file binario eseguibile. • • Viene chiamata shell perché “ingloba” il kernel. La shell indica che è pronta ad accettare un nuovo comando visualizzando un prompt e l’utente introduce comandi su una singola linea. La shell naviga attraverso il percorso di ricerca per trovare il file relativo al comando, che viene in seguito caricato ed eseguito. Le directory /bin e /usr/bin sono quasi sempre nel percorso di ricerca. Un tipico cammino di ricerca in un sistema BSD è: ( ./home/prof/avi/bin /usr/local/bin /usr/ucb/bin/usr/bin ) • La shell normalmente sospende la propria esecuzione fino al termine del comando. Operating System Concepts 21.20 Silberschatz and Galvin1999 Standard I/O • • • La maggior parte dei processi, quando iniziano la loro esecuzione, si aspettano di poter disporre di tre descrittori di file aperti: – standard input – il processo può leggere cosa viene scritto dall’utente – standard output – il processo può inviare l’output sullo schermo dell’utente – standard error – uscita dell’errore Molti programmi possono anche utilizzare file (piuttosto che un terminale) per lo standard input e lo standard output. Redirezione dell’I/O: Le shell più comuni dispongono di una semplice sintassi per cambiare i file aperti per l’I/O standard di un processo. Operating System Concepts 21.21 Silberschatz and Galvin1999 Redirezione dell’I/O standard Comando Significato del comando % ls > filea dirige l’output di ls sul file filea % pr < filea > fileb input da filea e output su fileb % lpr < fileb input da fileb %% make program > & errs salva sia lo standard output che lo standard error su un file Operating System Concepts 21.22 Silberschatz and Galvin1999 Pipeline, Filtri, e Shell Script • I singoli comandi possono essere “accodati” per mezzo di una barra verticale | (pipe). In questo modo, l’output del comando a sinistra della pipe costituisce l’input per il comando alla sua destra. % ls | pr | lpr • Filtro – un comando che passa il proprio standard input allo standard output, compiendo qualche elaborazione (es. pr). • • Programmare una nuova shell personalizzata, con sintassi e semantica diverse, cambia la visione dell’utente, ma non modifica il kernel o l’interfaccia del programmatore. X Window è un’interfaccia utente a icone molto diffusa sui sistemi UNIX. Operating System Concepts 21.23 Silberschatz and Galvin1999 Gestione dei processi • La rappresentazione dei processi è il principale problema di progetto di un sistema operativo. • UNIX si distingue dagli altri sistemi operativi per la semplicità con cui processi multipli possono essere creati e manipolati. • I processi vengono raprresentati in UNIX per mezzo di vari blocchi di controllo (control blocks). – I blocchi di controllo associati ad un processo vengono memorizzati nel kernel. – L’informazione contenuta nei blocchi di controllo viene utilizzata dal kernel per controllare i processi ed effettuare lo scheduling della CPU. Operating System Concepts 21.24 Silberschatz and Galvin1999 Process Control Block — 1 • • • Ai processi viene associata una struttura dati elementare chiamata struttura del processo (process structure). – identificatore di processo (unico) – informazioni per lo scheduling (e.g., priorità) – puntatori ad altri control block Lo spazio degli indirizzi virtuale di un processo utente è suddiviso in una sezione testo (codice del programma), una sezione dati ed uno stack. Ogni processo che condivide la sezione testo ha un puntatore dalla propria struttura di processo ad una struttura di testo, che... – è sempre residente nella memoria principale; – memorizza quanti processi condividono il segmento di testo; – memorizza dove è reperibile su disco (quando viene effettuato lo swap) la tabella delle pagine per la sezione testo. Operating System Concepts 21.25 Silberschatz and Galvin1999 Process Control Block — 2 • • La tabella delle pagine memorizza informazioni per la mappatura fra la memoria virtuale del processo e la memoria fisica Le informazioni sul processo, necessarie solo quando esso risiede in memoria principale, sono mantenute nella struttura utente (o u structure) che… – è mappata a sola lettura nello spazio degli indirizzi virtuale dell’utente; – è scrivibile dal kernel; – mantiene informazioni sulla directory corrente e la tabella dei file aperti. Operating System Concepts 21.26 Silberschatz and Galvin1999 Segmento dati di sistema • • Il lavoro ordinario viene normalmente eseguito in modo utente (user mode); le system call sono effettuate in modo sistema (system mode). Le fasi sistema ed utente di un processo non vengono mai eseguite simultaneamente. • Lo stack del kernel (anziché lo stack utente) viene impiegato per un processo eseguito in modo sistema. • Lo stack del kernel e l’ u structure costituiscono insieme il segmento dati di sistema per il processo. Operating System Concepts 21.27 Silberschatz and Galvin1999 Localizzazione delle parti di un processo Operating System Concepts 21.28 Silberschatz and Galvin1999 Allocazione di una nuova struttura di processo — 1 • • fork alloca una nuova struttura di processo per il processo figlio e copia la struttura utente. – Viene costruita una nuova tabella delle pagine. – Viene allocata nuova memoria per il segmento dati e lo stack del processo figlio. – Copiando la struttura utente si conservano i descrittori dei file aperti, gli identificatori di utente e di gruppo, la manipolazione dei segnali, etc. vfork non copia i dati e lo stack al nuovo processo; il nuovo processo semplicemente condivide la tabella delle pagine del processo padre. – Una nuova struttura utente ed una nuova struttura di processo vengono comunque create. – Viene comunemente utilizzata dalla shell per eseguire un comando ed attendere il suo completamento. Operating System Concepts 21.29 Silberschatz and Galvin1999 Allocazione di una nuova struttura di processo — 2 • • • Il processo padre impiega vfork per produrre un processo figlio; il figlio impiega execve per cambiare il proprio spazio degli indirizzi virtuale. Impiegare vfork per un processo padre oneroso equivale ad un notevole risparmio di CPU time, ma può essere pericoloso dato che ogni cambiamento in memoria avviene in entrambi i processi, fino a che non viene eseguita una execve. execve non crea un nuovo processo o struttura utente, piuttosto il testo ed i dati del processo (padre) vengono rimpiazzati. Operating System Concepts 21.30 Silberschatz and Galvin1999 Scheduling della CPU • • • • • Ciascun processo ha associata una propria piorità di scheduling; numeri più alti indicano priorità più basse. La presenza di feedback negativo nello scheduling della CPU diminuisce il rischio che un processo ne prenda possesso in modo esclusivo. Tecniche di invecchiamento (aging) dei processi vengono impiegate per impedire l’attesa indefinita (starvation). Quando un processo decide di rilasciare la CPU, si pone in stato di sleep per un evento. Quando tale evento accade, il processo di sistema che lo gestisce chiama wakeup con l’indirizzo corrispondente all’evento, e tutti i processi che si trovano in stato di sleep allo stesso indirizzo vengono spostati nella coda ready per essere eseguiti. Operating System Concepts 21.31 Silberschatz and Galvin1999