i sistemi operativi

cosa sono i sistemi operativi

Un sistema operativo (abbreviato in SO, in inglese OS), in informatica, è un software di base, detto anche piattaforma operativa (composto normalmente da più sottosistemi o componenti software: kernel, scheduler, file system, gestore della memoria, gestore delle periferiche, interfaccia utente e spooler di stampa) che gestisce le risorse hardware e software della macchina, fornendo servizi di base ai software applicativi; tra i sistemi operativi per computer desktop si citano Microsoft Windows, MacOS, le distribuzioni Linux, sistemi Unix-like, BSD e Chrome OS, mentre per i dispositivi mobili, quali smartphone e tablet, vi sono iOS Android, HarmonyOS, Windows Phone, Sailfish OS, Symbian OS e KaiOS. Per il mondo server abbiamo Windows Server, IBM i, varie distribuzioni specifiche Linux, MacOS Server.

come funziona un sistema operativo?

Un sistema operativo è un insieme di software che fornisce all'utente una serie di comandi e servizi per usufruire al meglio della potenza di calcolo di un qualsivoglia elaboratore elettronico, spaziando dal più piccolo dei palmari al più potente tra i mainframe. I sistemi operativi nascondono tutti i dettagli tecnici legati allo specifico hardware e architettura rappresentando le informazioni ad un alto livello, meglio comprensibile dall'uomo.

come sono organizzati?

Un kernel è un gruppo di funzioni fondamentali, strettamente interconnesse fra loro e con l'hardware, che vengono eseguite con il privilegio massimo disponibile sulla macchina: la modalità kernel designa proprio questo tipo di interazione; un kernel non è altro che un software che ha il compito di fornire ai moduli che compongono il sistema operativo e ai programmi in esecuzione sul computer le funzioni fondamentali ed un accesso controllato all'hardware sollevandoli dai dettagli della sua gestione; esso fornisce dunque le funzionalità di base per tutte le altre componenti del sistema operativo, che assolvono le loro funzioni servendosi dei servizi che esso offre ed è dunque il motore o core di un sistema operativo. A seconda del tipo di sistema operativo il kernel può inglobare altre parti (kernel classico, monolitico o modulare) o fornire solo funzioni base delegando più funzioni possibile a oggetti/gestori esterni (microkernel). Un kernel tradizionale, ovvero monolitico e altri, integra invece dentro di sé la gestione della memoria virtuale, la cpu, lo scheduler e i gestori di file system, nonché i driver necessari per il controllo di tutte le periferiche collegate. Quali funzioni sia opportuno che il kernel debba fornire e quali possano essere demandate a moduli esterni è oggetto di opinioni divergenti: se il kernel di un sistema operativo implementa soltanto un numero molto ristretto di funzioni, delegando il resto ad altre parti esterne dette server o moduli in comunicazione con il kernel stesso, si parla di microkernel. Il vantaggio di un siffatto sistema operativo è la maggiore semplicità del suo kernel del suo sviluppo, la possibilità di cambiare facilmente i moduli e una certa tolleranza ai guasti in quanto se un modulo "crolla" (crash), solo la funzionalità del modulo s'interrompe, ed il sistema rimane funzionale e gestibile dall'amministratore (che può ad esempio ripristinare la funzionalità del modulo stesso); lo svantaggio è invece l'interazione più complessa e costosa fra kernel e le altre componenti del SO stesso, che spesso rallenta il sistema e/o lo rende meno stabile. Questo tipo di kernel è più complesso da progettare, mantenere ed aggiornare, ma è anche più veloce efficiente e stabile. Una sua evoluzione è costituita dai kernel "modulari", che mantengono al loro interno lo scheduler e i gestori di file system e memoria virtuale ma separano alcune funzioni non essenziali in moduli a sé stanti, da caricare in memoria solo in caso di effettivo uso della funzione o periferica di loro competenza.

scheduler

Lo scheduler è il componente fondamentale dei sistemi operativi multitasking, cioè quelli in grado di eseguire più processi contemporaneamente (va inteso simbolicamente. In realtà non c'è una gestione parallela dei processi ma avviene in sequenza, i tempi sono talmente brevi che all'utente sembrerà che i programmi vadano contemporaneamente). Lo scheduler si occupa di fare avanzare un processo interrompendone temporaneamente un altro, realizzando così un cambiamento di contesto (context switch). Generalmente computer con un processore sono in grado di eseguire un programma per volta, quindi per poter far convivere più task è necessario usare lo scheduler. Esistono vari algoritmi di scheduling che permettono di scegliere nella maniera più efficiente possibile quale processo far proseguire. I migliori scheduler hanno di complessità O(1)[2]. I processi non hanno continuamente bisogno della CPU: a volte, anziché far eseguire istruzioni alla CPU, si mettono in attesa che arrivino dei dati da un file, o che l'utente prema un tasto della tastiera. Quindi si può, in linea di principio, usare questi tempi "morti" (di attesa) per far eseguire un altro programma. Quest'idea, sorta fin dai primi anni cinquanta, si concretizzò nei sistemi operativi multitasking, cioè dotati di uno scheduler che manda in esecuzione più processi (esecuzione di programmi), assegnando a turno la CPU ad ognuno e sospendendo l'esecuzione dei processi in attesa di un evento esterno (lettura/scrittura sulle memorie di massa, stampa, input utente ecc.) finché questo non si verifica. Dovendo ospitare in memoria centrale più processi nello stesso tempo, i sistemi multitask hanno bisogno di più memoria rispetto a quelli monotask: perciò questo tipo di sistemi operativi è quasi sempre dotato di un gestore di memoria virtuale. Inoltre, con più processi simultaneamente attivi, il controllo delle risorse hardware diventa una reale necessità e non è più possibile farne a meno. Esistono sostanzialmente due modi di implementare il multitasking: cooperative e preemptive multitasking. Nel primo sono i processi che, spontaneamente, cedono il controllo al sistema non appena hanno terminato la singola operazione in corso; nel secondo è lo scheduler che ferma i processi allo scadere del tempo assegnato e trasferisce il controllo dall'uno all'altro: il cooperative multitasking assorbe meno risorse di calcolo e non ha quasi ritardo di commutazione per il cambio di task, e inoltre non richiede nessuna struttura hardware dedicata, il che rende possibile implementarlo su qualunque calcolatore; per contro è molto vulnerabile a errori nei programmi (in genere il crash di un processo fa cadere l'intero sistema) e l'isolamento fra processi è molto debole. È il modello usato dai vecchi sistemi. il preemptive multitasking necessita di CPU che implementino in hardware sia dei livelli di privilegio per l'esecuzione del codice sia una logica specifica per il context switch, il cambio di task eseguito dallo scheduler. Poiché l'interruzione dei processi è arbitraria, al cambio di task il sistema operativo è costretto a salvare tutti o quasi i registri della CPU e ricaricarli con quelli salvati dal task che subentra, perdendo molto tempo. A fronte di queste maggiori richieste, il preemptive multitasking offre una sicurezza del sistema maggiore e una virtuale immunità ai crash di sistema causati da errori nei programmi. È il modello usato dai moderni sistemi operativi. Lo scheduler scandisce dunque il tempo di esecuzione dei vari processi e assicura che ciascuno di essi venga eseguito per il tempo richiesto. Normalmente lo scheduler gestisce anche lo stato dei processi e può sospenderne l'esecuzione nel caso questi siano in attesa senza fare nulla, assegnando le risorse inutilizzate ad altri processi che le necessitano (esempio classico è la richiesta di dati da disco). Nei sistemi operativi realtime lo scheduler si occupa anche di garantire una timeline, cioè un tempo massimo di completamento per ciascun task in esecuzione, ed è notevolmente più complesso.

gestione input/output periferiche

La gestione dell'input/output ovvero delle periferiche di sistema è attuata attraverso il meccanismo dell'interrupt da parte delle periferiche stesse che chiamano in causa il sistema operativo il quale opererà un cambiamento di contesto (context switch) all'interno del ciclo del processore assegnando al processore il compito di input/output richiesto. Un'altra modalità tipica di gestione delle periferiche, alternativa agli interrupt, è il polling.

gestore di memoria

Il gestore di memoria è la componente del sistema operativo che si occupa di gestire ed assegnare la memoria primaria ai processi che ne fanno richiesta immediatamente prima dell'elaborazione. La gestione della memoria è necessaria anche per tenere traccia di quanta memoria è impegnata e di quanta invece è disponibile per soddisfare nuove richieste: in mancanza di un sistema di gestione, si avrebbe prima o poi il caso nefasto di processi che ne sovrascrivono altri, con gli ovvi inconvenienti. Esso è eseguito dal MMU (Memory Management Unit) che alloca la memoria primaria richiesta dai programmi e dal sistema operativo stesso, salva sulla memoria di massa le zone di memoria temporaneamente non usate dai programmi (memoria virtuale) e garantisce che le pagine swappate vengano riportate in memoria se richieste. Un altro buon motivo per registrare la memoria usata dai vari processi è il fatto che, in caso di errori gravi, i processi possono andare in crash e non essere più in grado di comunicare al sistema che la memoria che occupano può essere liberata: in questo caso è compito del gestore di memoria, dopo la terminazione anomala del processo, marcare come libere le zone di memoria possedute dal processo "defunto", rendendole disponibili per nuove allocazioni. Per poter gestire i programmi, divenuti processi, è necessario che tutti gli indirizzi definiti in essi siano calcolati in forma relativa alla prima istruzione del programma (come se il programma dovesse essere caricato a partire dall'indirizzo 0 di memoria centrale). Al momento del caricamento, che può essere eseguito in qualsiasi zona libera della memoria, gli indirizzi relativi verranno sommati al primo indirizzo di effettivo caricamento, diventando così assoluti: INDIRIZZO ASSOLUTO = INDIRIZZO RELATIVO + INDIRIZZO DI PARTENZA. Una modalità/meccanismo tipico di gestione/assegnazione della memoria ai programmi/processi da parte del sistema operativo è il paging. Nel caso il sistema disponga di un meccanismo di memoria virtuale, il gestore della memoria si occupa anche di mappare (indirizzare) la memoria virtuale offerta ai programmi sulla memoria fisica e sui dischi rigidi del sistema, copiando da memoria a disco rigido e viceversa le parti di memoria necessarie di volta in volta ai programmi, senza che i programmi stessi o gli utenti debbano preoccuparsi di nulla. La memoria primaria contiene un vettore di migliaia di miliardi di byte ciascuno dei quali allocato tramite un indirizzo mentre le memoria cache seppur guidate da algoritmi logici sono normalmente gestite dall'hardware.

protezione della memoria

La protezione della memoria è un sistema per prevenire la corruzione della memoria di un processo da parte di un altro. Di solito è gestito via hardware ad esempio con una MMU, (Memory management unit) e dal sistema operativo per allocare spazi di memoria distinti a processi differenti.

file system

Un computer diventa infatti molto più utile ed efficace se dotato di una memoria di massa: per gestirla serve un gestore di file system, cioè un software che in sintesi è composto da un insieme di funzioni che permetta di organizzare e gestire (accesso o lettura, scrittura o memorizzazione, ordinamento) i dati sulla superficie dei mezzi di memorizzazione secondo una struttura ben precisa. I sistemi operativi che risiedevano su disco e capaci di gestire un file system sono detti genericamente Disk Operating System, per l'appunto, DOS. L'esemplare più famoso è senz'altro l'MS-DOS di Microsoft, oggi sostituito dall'interfaccia grafica Windows ma che era alla base dei sistemi operativi Windows 95/98/Me. Ne esiste anche una versione libera compatibile con i suoi programmi, il FreeDOS, ed altre versioni come il DR-DOS. Il file system si occupa dunque di esaudire le richieste di accesso alle memorie di massa. Viene utilizzato ogni volta che si accede a un file sul disco, e oltre a fornire i dati richiesti tiene traccia dei file aperti, dei permessi di accesso ai file. Inoltre si occupa anche e soprattutto dell'astrazione logica dei dati memorizzati sul computer (directory, ecc). A seconda dei casi, un particolare sistema operativo può avere tutti questi componenti o solo alcuni. Un'ulteriore differenza fra i sistemi operativi è data dal tipo di comunicazione fra i vari componenti: i sistemi operativi classici sono basati su chiamate dirette di funzioni, mentre molti sistemi operativi moderni, soprattutto quelli che adottano microkernel, si basano sul message passing, sullo scambio di messaggi fra le loro varie parti e fra il sistema operativo e i programmi che fa girare.

interfaccia utente

Il secondo passo verso una migliore gestione del computer si ha con lo sviluppo di un'interfaccia utente separata dal kernel, un interprete di comandi che funzioni anche da interfaccia utente ovvero da Shell. Questa shell primitiva di solito funge anche da interprete per un linguaggio di programmazione: a seconda delle scelte dei progettisti del software può essere un vero linguaggio oppure un più semplice linguaggio di scripting con cui creare comandi batch. Era il tipico sistema operativo degli home computer degli anni 80, come il Commodore 64 e il Sinclair ZX Spectrum. L'interfaccia utente permette dunque all'utente di interagire con il computer. Esistono sostanzialmente due famiglie di interfacce utente: interfaccia a riga di comando e interfacce grafiche che forniscono ad esempio, una scrivania (o desktop).

pagina web a cura di: Alessandro Susini
Contattami



ritorna alla home