Un sistema operativo (abbreviato in SO, ), 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, di MicioOS, 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.

Storia

La storia dei sistemi operativi descrive l'evoluzione durante tutto il periodo di sviluppo dei Computer o calcolatori elettronici. Essa si sviluppa parallela a fianco della storia del computer e, più in generale, della storia dell'informatica. In un periodo delimitabile tra il 1945 e il 1955 gli elaboratori elettronici erano ammassi di valvole termoioniche, occupavano intere stanze, erano lentissimi e così costosi che potevano permetterseli soltanto grossi centri di calcolo o Università o organizzazioni dotate finanziariamente. A partire dagli anni 1960 con lo sviluppo dei primi mainframe si resero necessari software per l'utilizzo che consentissero l'interfacciamento degli utenti con tali macchine, l'evoluzione si accelerò a partire dagli anni 1970, soprattutto con l'avvento degli home computer e dei personal computer.

Descrizione

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 a un alto livello, meglio comprensibile dall'uomo.

Esso garantisce l'operatività di base di un calcolatore, coordinando e gestendo le risorse hardware di processamento (processore) e memorizzazione (memoria primaria), le periferiche, le risorse/attività software (processi) e facendo da interfaccia con l'utente, senza il quale quindi non sarebbe possibile l'utilizzo del computer stesso e dei programmi/software specifici, come applicazioni o librerie software.

È dunque un componente essenziale del sistema di elaborazione che funge da interfaccia tra l'utente e la macchina e inoltre è una base alla quale si appoggiano gli altri software, che dunque dovranno essere progettati e realizzati in modo da essere riconosciuti e supportati da quel particolare sistema operativo. Assieme al processore, con cui spesso è strettamente legato, costituisce la cosiddetta piattaforma del sistema di elaborazione. In generale un sistema operativo può essere:

monoutente, se un solo utente per volta può accedere alle risorse dell'elaboratore; multiutente, se più utenti possono accedere alle risorse dell'elaboratore che a sua volta può essere: seriale, sequenzialmente uno per volta; parallelo, ciascuno parallelamente agli altri; monotasking, se in grado di eseguire un solo compito o task (processo) alla volta: multitasking o multithreading, se in grado di svolgere più compiti o sottocompiti parallelamente attraverso una certa politica di scheduling (es. timesharing). portabile o meno su differenti architetture hardware di processori.

Il sistema operativo è un ambiente software che è avviato dopo il firmware della macchina, quale ad esempio, l'UEFI o lo SLIC (System Licensed Internal Code) per le architetture IBM (OS/400 ora IBM i).

Funzioni principali Secondo una definizione più rigorosa, il sistema operativo è un insieme di funzioni e strutture dati responsabile: del controllo e della gestione delle risorse di sistema (CPU e Memoria primaria) e delle componenti hardware che costituiscono il computer (processi di Input/Output da e verso le periferiche collegate al sistema) dell'esecuzione dei programmi (definiti entità passive) dai quali si ricavano i processi (detti entità attive), che vengono eseguiti, assegnandogli le necessarie risorse per l'avanzamento dei processi stessi..

Se il sistema di elaborazione prevede la possibilità di memorizzazione aggiuntiva dei dati su memoria di massa, come accade nei computer general purpose, esso ha anche il compito di: gestire l'archiviazione e l'accesso ai . I programmi possono gestire l'archiviazione dei dati su memoria di massa (ottenendo strutture complesse, come una base di dati), servendosi delle procedure messe a disposizione del sistema operativo. La componente del SO che si occupa di tutto ciò viene chiamata file system.

Infine, se è prevista interazione con l'utente, viene solitamente utilizzata allo scopo un'interfaccia software (grafica o testuale) per accedere alle risorse hardware (dischi, memoria, I/O in generale) del sistema. D'altra parte, un sistema operativo può essere utilizzato anche su una macchina che non preveda interazione diretta con un essere umano (per un esempio, vedi smart card o determinati sistemi embedded) spesso dunque più leggero e semplificato. Solitamente un sistema operativo installato su computer fornisce anche degli applicativi di base per svolgere elaborazioni di diverso tipo.

Sebbene molte delle funzionalità sopraddette non siano spesso immediatamente visibili/percepibili dall'utente, l'importanza del sistema operativo di un calcolatore è cruciale: oltre alla necessità di gestione delle funzionalità di base sopraddette, al di là delle prestazioni massime offerte dall'hardware dell'elaboratore stesso, il sistema operativo determina di fatto efficienza e buona parte delle prestazioni effettive di funzionamento dell'intero sistema ad esempio in termini di latenze di processamento, stabilità, interruzioni o crash di sistema.

Struttura Un generico sistema operativo moderno si compone di alcune parti standard, più o meno ben definite.

Kernel

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 e 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 e 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 e 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.

Sulla distinzione fra microkernel e kernel monolitico di notevole interesse è il famoso dibattito fra Torvalds e Tanenbaum "LINUX is obsolete"collegamento.

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).

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 a 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.