Il sistema operativo è un programma, o meglio, un insieme di programmi, scritto allo scopo di rendere disponibili all’uso le risorse di calcolo e i dispositivi collegati al computer.
Il sistema operativo può essere di 2 tipi: aperto e proprietario.
Il primo è costruito in modo da poter operare con una molteplicità di dispositivi, anche con processori e schede madri diversi. (Window, Linux)
Il secondo, invece, è scritto per essere eseguito su un insieme ristretto e ben specifico di macchine. Il vantaggio dei sistemi proprietari è che sono ottimizzati per uno specifico hardware, quindi hanno in genere una maggiore efficienza. (Mac OS X )
Si parla di grado di portabilità del sistema operativo, intendendo la sua attitudine ad essere eseguito su macchine diverse: tale grado è tanto maggiore quanto è minore il costo delle modifiche da riportare. Nei sistemi aperti questo grado è chiaramente maggiore che in quelli proprietari.
La struttura formale di un sistema operativo è gerarchica: questo significa che i programmi che lo compongono si collocano a livelli diversi, si servono di programmi che stanno a livelli sottostanti e servono i programmi dei livelli superiori.
All’interno di ogni livello i programmi scritti per risolvere un problema vengono raggruppati in moduli. La procedura standard per mezzo della quale il modulo mette a disposizione i servizi è detta primitiva.
Questi moduli forniscono risorse e servizi al livello superiore, semplicemente usando una chiamata di funzione, senza conoscere i dettagli del procedimento con cui tali servizi vengono gestiti e ottenuti.
In questo modo la complessità dei problemi viene nascosta, e si procede scomponendo le operazioni complessi in sotto-problemi.
Ogni livello deve essere in grado di nascondere ai livelli superiori lo strato sottostante, e gestire lui stesso le eventuali chiamate ai livelli inferiori provenienti da quelli superiori. In questo modo ogni livello fornisce una macchina virtuale dotata di certe funzionalità, e protegge l'accesso a certe altre.
Il primo vantaggio di questa struttura gerarchizzata, è quello di garantire un buon grado di portabilità del sistema: infatti l'unico livello a contatto con l'hardware è il primo (nucleo), quindi – in teoria – è sufficiente riscrivere o ricompilare il nucleo per far girare il sistema su un'altra macchina.
Un altro vantaggio è quello di scomporre lo studio delle problematiche da affrontare in maniera sistematica: per entrare nel dettaglio delle funzioni svolte dal sistema operativo, si utilizza questo modello che consente di mettere a fuoco i principali meccanismi di interazione tra le varie parti che lo costituiscono e di queste con l’esterno.
La schematizzazione usata è, come abbiamo detto, di tipo gerarchico e viene detta a macchine virtuali. Una macchina virtuale è un oggetto costituito da una macchina in grado di eseguire un certo insieme di operazioni, e da un modulo che fornisce un’interpretazione logica di tali operazioni: l’insieme costituisce una nuova macchina in grado di eseguire operazioni logiche.
Il modello onion skin (buccia di cipolla) rappresenta il sistema operativo come una successione di strati costruiti sopra un nocciolo costituito dalla macchina hardware, ciascun dei quali rappresenta un livello di macchina virtuale.
Nucleo (kernel) è la parte che viene caricata in memoria al momento dell'avvio del computer e rimane residente per tutta la durata della sessione di lavoro fino allo spegnimento.
Gestione della memoria (RAM). Dopo il caricamento del nucleo, che avviene in modalità reale (stato supervisor), viene caricata la gestione della memoria, che consente al processore di lavorare in modalità protetta (stato problem o user) cioè di utilizzare i registri di confine (boundary register) per limitare l'accesso di ogni processo solo alla propria area di memoria.
Gestione delle periferiche. Comprende i driver delle periferiche installate; l'esecuzione dei driver avviene in modalità protetta, il che significa che vengono caricati solo all'occorrenza, e girano nello spazio utente, e non nello spazio di sistema.
File system. Effettua la gestione dello spazio su disco, e fornisce allo strato successivo le primitive per la creazione di file e cartelle, copia, spostamento, cancellazione dati e apertura di files.
Interprete dei comandi (shell). Consente l'accesso alle memorie di massa, e ad alcune funzionalità del sistema (gestione dei processi, stato della memoria) relative agli strati più interni, tramite un linguaggio di comandi. Negli ambienti multi-utente, esiste una istanza dell'interprete per ogni utente che si collega al sistema.
Interfaccia grafica. (File manager, Window manager, Desktop manager) Consente di compiere le operazioni di cui sopra senza conoscere il linguaggio di comandi, agendo con il mouse sulle icone e le finestre del desktop. Lo fa ricorrendo alle primitive (=comandi) fornite dall'interprete.
Applicativi. Possono fornire le funzionalità più svariate, ed è anche possibile programmare il sistema in modo che un'applicativo sia l'unica interfaccia finale accessibile all'utente, in modo da presentare una macchina vistuale specifica per un determinato lavoro (es: sportello bancario)
Il nucleo è la parte del sistema operativo più vicino all’hardware, ed è strettamente dipendente dall’hardware.
Il nucleo teoricamente dovrebbe comprendere solo le procedure necessarie all'esecuzione dei programmi utente. L'esecuzione di un programma genera un processo, che a sua volta può scomporsi in diversi thread: il nucleo si occupa della gestione dei thread e dei criteri con cui essi possono sfruttare il processore. (microkernel)
Spesso pero' nel nucleo viene incluso anche lo strato successivo, perchè anche questo è residente in memoria per tutta la durata dell'attività della macchina. (macrokernel o kernel monolitico)
Nonostante la teoria indichi tale prassi come svantaggiosa, alcuni sistemi (Linux) includono nel nucleo anche i driver per la gestione delle periferiche.
Le funzioni fondamentali del nucleo sono:
Avvio e terminazione dei processi
Assegnazione della (o delle) CPU ai diversi processi
Ottimizzazione dello sfruttamento del processore, evitando i tempi morti
Ottimizzazione dei tempi di risposta
Sincronizzazione tra i processi
Sincronizzazione dei processi con l’ambiente esterno.
La questione della sincronizzazione, in un ambiente multiprogrammato, è fondamentale, e avviene tramite il meccanismo delle interruzioni. Una interruzione è un evento che per essere gestito prevede la sospensione del programma attivo a favore di una chiamata al Sistema Operativo
Si possono distinguere 3 tipi fondamentali di interruzione:
Interrupt asincroni, generati solo dall’hardware, che servono a segnalare alla CPU eventi non correlati al suo orologio interno, come la fine di una stampa o di una scrittura su disco
Interrupt sincroni generati dall’hardware, che segnalano eventi accaduti in relazioni all’orologio interno (tipicamente, la fine del tempo assegnato a un certo processo)
Interrupt sincroni provocati via software, usati per accedere a routine particolari, o per la comunicazione tra processi.
La gestione della
memoria, secondo livello del modello macchine virtuali, simula
l’esistenza di una pluralità di unità di memoria centrale,
ciascuna associata ad una dei processi virtuali generati dal nucleo,
mascherando ai livelli successivi la limitazione fisica della memoria
centrale reale.
Le problematiche gestite da questo livello sono:
Allocazione dello spazio fisico di memoria per ciascun processo
Liberazione delle aree di memoria non più utilizzate
Protezione delle aree dallo sconfinamento
Gestione della memoria virtuale e del page swapping
Il terzo livello del modello macchine virtuali, consente di definire i dispositivi periferici come dispositivi virtuali. In questo modo l’utente può utilizzare le periferiche senza preoccuparsi delle caratteristiche fisiche e delle operazioni fisiche che vengono eseguite per svolgere la funzione logica richiesta. Questo compito è demandato ai driver delle varie periferiche, che ricevono i comandi di input o di output e provvedono a tradurli nelle necessarie istruzioni a basso livello per il completamento dell'operazione.
I principali compiti di questo strato sono:
nascondere i dettagli dell'utilizzo di una determinata periferica
assegnare le periferiche ai processi che ne hanno bisogno
liberare le periferiche quando il processo non le usa più
evitare i conflitti generati dalle richieste contemporanee, per mezzo dei semafori
ottimizzare i tempi di utilizzo di ciascuna periferica
velocizzare i tempi di risposta
Tutto ciò che viene registrato su memoria di massa prende il nome di file. Il file system consente di riferirsi alle informazioni registrate in termini di identificatori piuttosto che di indirizzi fisici, adoperando allo scopo le directories (cartello o folder) che contengo per ciascun file alcuni dati significativi.
La directory di livello più elevato è detta root (radice). La struttura ad albero risulta composta da nodi non terminali (le directories) e nodi terminali (foglie) che sono i file veri e propri.
La prima operazione richiesta dal file system è la formattazione del disco, che consiste nella sua suddivisione in blocchi e nella creazione delle mappe necessarie a gestire gli spazi liberi e quelli occupati
Allocare lo spazio fisico per il salvataggio di file
Liberare lo spazio quando i file vengono cancellati
Evitare la sovrapposizione delle informazioni
Identificare il proprietario di un file o di una cartella
Fornire meccanismi di protezione delle informazioni (permessi)
E' il primo strato esterno accessibile all'utente finale, per questo detto anche shell (guscio).
Si tratta di un programma che riceve in ingresso le richieste di esecuzione di operazioni, espresse usando il linguaggio comandi. Una componente importante degli interpreti è l’analizzatore sintattico, un programma che verifica la correttezza formale delle richieste dell’utente, e provvede a richiamare la funzione opportuna.
![]() |
![]() |