Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
INTERFACCIA UTENTE
Per facilitare l’utilizzo del Sistema di Calcolo, il Sistema Operativo fornisce un interfaccia che si può
presentare in diversi modi:
- Fino a qualche tempo fa l’interfaccia utilizzata era il CLI (Common Level Interface) e prevedeva
l’utilizzo di stringhe che codificano i comandi inseriti dall’utente tramite una console.
- Attualmente si utilizzano interfacce denominate GUI (Graphical User Interface) che permettono
all’utente, tramite l’utilizzo di finestre, bottoni, menu e quant’altro correlati ad un puntatore
(mouse) che ne regola lo stato, di comandare le operazioni di INPUT/OUTPUT ed espletare i
servizi forniti dal Sistema Operativo.
ESECUZIONE DI UN PROGRAMMA
Il Sistema Operativo deve poter eseguire e terminare un programma.
OPERAZIONI DI INPUT/OUTPUT
Il Sistema Operativo deve controllare le operazioni di I/O richieste da un programma in modo da
rendere efficiente e protetto i dispositivi relativi e lo stesso Sistema Operativo. Infatti, solitamente,
l’utente non può controllare i dispositivi I/O e il Sistema Operativo tramite l’utilizzo di driver fa da
tramite.
PROTEZIONE E SICUREZZA
Il Sistema Operativo deve essere in grado di controllare le informazioni da accessi non autorizzati
ed inoltre la protezione riguarda anche le errate esecuzioni di processi che potrebbero danneggiare
il Sistema Operativo.
Tra queste operazioni ci sono una moltitudine di chiamate di sistema: alcune che servono a
controllare anche altre tipologie di errore ( spazio su disco insufficiente, errore nella scrittura del
file) ed altre che effettuano operazioni intermedie necessarie.
Lo scopo di quest’esempio è chiaro: anche operazioni semplici prevedono un uso costante del
Sistema Operativo.
I programmatori per richiamare le System Call hanno uno strumento intermedio chiamato API
(Application Programming Interfaces) che consiste in librerie che facilitano questa serie di compiti
rognosi offrendo un’insieme di funzioni e procedure comuni.
Tra le interfacce più diffuse troviamo la API Win32 per i sistemi Windows, POSIX per Unix, Linux e
Mac e le API per Java eseguite su una macchina virtuale.
Un esempio di funzione è la funzione createProcess() di Win32 che serve a generare un
nuovo processo ed invoca il metodo NTCreateProcess() che è una System Call.
Per leggere un file in Sistemi Windows utilizzando le API di Win32 avremo un metodo:
Dove, come parametri, avremo un file da cui leggere (HANDLE file), un buffer da cui leggere I
dati che provengono dal file (LPVOID buffer), il numero di byte da trasferire dal file al buffer
(DWORD bytesToRead), il numero di byte che sono già stati letti fino a quel momento (LPWORD
bytesRead) e un indicatore che evidenzia l’uso dello spooling (LPOVERLAPPED ovl).
abort
Serve per terminare in modo anomalo un programma. Avviene quando il programma non è
stato eseguito correttamente in base alle politiche del Sistema Operativo. Solitamente causa un
segnale di eccezione e spesso il Sistema Operativo registra in un file il contenuto della memoria
(dump) oppure elenca ogni istruzione nel momento in cui viene eseguita (trace).
Successivamente segnala l’evento con un messaggio di errore. Solitamente è presente anche
un debugger che è incaricato di ricercare e correggere gli errori che si sono verificati. Il
debugger rileva le eccezioni che la CPU ha segnalato dopo ogni istruzione tramite una modalità
di esecuzione denominata esecuzione a passo singolo (single sleep). Gli errori sono spesso
indicati e graduati in base ad un livello assegnato definito tramite un parametro.
CARICAMENTO ED ESECUZIONE
load
Serve per caricare in memoria un programma.
execute
Serve per eseguire un programma. Quando viene richiesta l’esecuzione di un programma
successivamente alla sua esecuzione bisogna stabilire a quale processo restituire il controllo.
Nel caso in cui si volesse restituire il controllo ad un programma già esistente bisognerebbe
creare un immagine in memoria del programma da richiamare.
CREAZIONE DI UN PROCESSO
create process o submit job
Nel caso in cui si voglia eseguire uno o più programmi in modo concorrente si crea un nuovo
processo in multiprogrammazione tramite una di queste due chiamate.
TERMINAZIONE DI UN PROCESSO
terminate process
Nel caso in cui si riscontra che un processo appartenente ad un programma è inutile o non
corretto si utilizza questa istruzione.
Caricamento del Programma in memoria riscrivendo anche la maggior parte della memoria che
il programma occupa
Impostazione del contatore di programma alla prima istruzione del programma da eseguire
Esecuzione del programma
1. Un errore causa un eccezione
Esistono ulteriori chiamate di Sistema che, a volte, sono sostituite da API e riguardano ad esempio
lo spostamento e la copia di un file:
move
copy
relaease
Dopo l’uso il dispositivo deve essere rilasciato al fine di renderlo disponibile per altri utenti o
programmi. Analogo alla funzione close per i file.
read
write
reposition
Utilità di Sistema
Questi programmi sono programmi che risolvono ed eseguono problemi ed operazioni comuni
(elaboratore di testi, fogli di cacolo, disegno,videogiochi…).
UTENTI
KERNEL
HARDWARE
Altri strati
Strato 0 - Hardware
2.13 Microkernel
Man mano che passò il tempo si arrivò agli anni ’80 dove un’università degli Stati Uniti decise di
togliere molte funzionalità dei kernel per darle ai processi utenti. Questa evoluzione prevedeva un
kernel sviluppato in moduli secondo un orientamento a microkernel dove tutti i componenti
non essenziali del kernel vennero rimossi dallo stesso e la loro gestione venne affidata a
programmi di sistema e di utente. Così facendo il kernel gestiva solo i processi in esecuzione,
la memoria e la comunicazione tra programmi client e servizi in esecuzione nello spazio
utente tramite scambio di messaggi.
Questo comportò una più semplice manutenzione del kernel e più affidabilità dato che gli errori su
servizi, prima gestiti dal kernel, non compromettono il resto del sistema operativo.
Il problema del mikrokernel risulta sempre quello derivato da cali di prestazioni dovuti alla
gestione di servizi aggiuntivi da parte di processi utente.
2.14 Moduli
Attualmente i sistemi operativi vengono progettati secondo tecniche di programmazione ad
oggetti che prevedono un kernel composto da un insieme di componenti fondamentali (e
solamente essenziali) e moduli che lo integrano in fase di avvio o dinamicamente. Questa
strategia è comune nelle implementazioni attuali di UNIX, Solaris, Linux e Mac OS X. La struttura di
Solaris si presenta nel seguente modo:
Il Sistema finale ha ogni parte del kernel con una propria interfaccia e ciò lo fa assomigliare ad
un sistema a strati. È molto più flessibile dei Sistemi a strati perché ogni modulo ha la
possibilità di comunicare con gli altri moduli. Il Modulo centrale gestisce i moduli essenziali
come nei sistemi a microkernel migliorando l’efficienza tramite la comunicazione dei moduli che
avviene senza invocare le funzionalità di trasmissione dei messaggi.