2. Componenti di un sistema operativo
Interprete dei comandi
Elemento principale di interfaccia tra SO e utente è l'interprete dei comandi (shell), che ha il compito di prendere i comandi specificati dall’utente e di eseguirli. Esso può fornire diversi tipi di interfaccia utente, come CLI, GUI, o batch.
- Command Line Interface (CLI): I comandi sono inseriti in forma testuale in un interprete (o shell), che li legge e li esegue. A seconda dell'implementazione l'interprete può essere un processo separato o eseguito dal kernel stesso. Il codice di ogni comando può essere parte dell'interprete stesso o fare riferimento
ad un file separato che specifica il codice (shell script). Questo permette un'elevata possibilità di customizzazione. - Graphical User Interface (GUI): Classica implementazione a desktop, interagibile con mouse e tastiera. Generalmete più user friendly, cala il livello di prestazioni e di specificità delle operazioni.
System Calls e API
Fra SO e i comandi dettati da un utente si interpongono system call e API(Application Program Interface).
Una system call è un meccanismo usato a livello utente per richiedere un servizio a livello kernel e permettono di eseguire operazioni riservate, quali l'accesso all'hardware o alla memoria. Le system call sono specifiche di ogni SO, alcuni esempi sono open(), read(), write(), wait().
Per quanto riguarda le API, queste, a seconda del SO, invocano le system call e restituiscono i risultati all'utente, aggiungendo un ulteriore livello di astrazione. Le API non fanno quindi parte del kernel. Un esempio di API è l'app del meteo nel nostro cellulare. Essa mette in comunicazione il nostro cellulare con i server del meteo.
Le 2 API piú comuni sono Win32 API (insieme di API usate su Windows) e POSIX (Portable Operating System Interface for Unix, insieme di API usate su tutte le versioni di UNIX).
Implementazione delle System Calls
Tipicamente, viene associato un numero ad ogni system call. È compito poi dell’interfaccia alle chiamate di sistema di mantenere una tabella che associa del codice (le system calls vere e proprie) ad ogni numero. L’interfaccia invoca la system call nel kernel del SO e poi ritorna lo stato della system call e gli eventuali valori di ritorno. In questo modo il chiamante non ha necessitá di conoscere nulla di come la system call è implementata.
In breve, quando viene invocata una system call. accadono i seguenti eventi:
- La system call viene invocata dal programma utente
- Si passa dalla modalità utente (user mode) alla modalità kernel (kernel mode). Questa operazione è detta trap.
- Viene usata la tabella per chiamare la system call corretta
- Si passa dalla modalità kernel alla modalità utente ritornando il risultato.
Ma quando invoco la system call come fa il sistema operativo a passare i parametri al processo che si occupa di eseguirla?
Si possono passare principalmente in 3 modi:
- Passare i parametri (della system call) tramite registri
- Passare i parametri tramite lo stack del programma
- Lo stack è FIFO (First In First Out), quindi i parametri vengono salvati uno sopra l'altro
- Quando non servono più, questi non vengono cancellati (sarebbe uno spreco di tempo), ma vengono sovrascritti da nuovi parametri
- Memorizzare i parametri in una tabella in memoria
- L’indirizzo della tabella è passato in un registro o nello stack