Articolo Pubblicazioni

Cos’è un sistema operativo: funzioni, componenti ed esempi

di · Pubblicato l’8 giugno 2010 - Aggiornato il 14 novembre 2026 · Tratto da «Corso d’introduzione ai Sistemi Operativi»

Abstract

L’articolo riprende la prima dispensa del «Corso d’introduzione ai Sistemi Operativi» dell’8 giugno 2010. Definisce il sistema operativo e i suoi tre ruoli, descrive l’organizzazione di un elaboratore, le interruzioni e la gerarchia delle memorie, e spiega la modalità duale, le chiamate di sistema e le interfacce. Presenta poi le strutture del sistema operativo, monolitica, stratificata e a microkernel, la virtualizzazione e la distinzione fra software libero e open source, con esempi concreti.

Vincenzo Calabrò | Cos’è un sistema operativo: funzioni, componenti ed esempi
 

La definizione

Un sistema operativo è il software che gestisce l’hardware di un calcolatore e offre a chi lo usa un ambiente in cui eseguire i programmi in modo comodo ed efficiente. Un sistema di elaborazione si può dividere in quattro componenti, l’hardware, il sistema operativo, i programmi applicativi e gli utenti. Il sistema operativo sta in mezzo, fra l’hardware e tutto il resto.
In senso stretto il sistema operativo è il kernel, l’unico programma sempre in esecuzione. Accanto al kernel ci sono i programmi di sistema, legati al sistema operativo ma esterni al kernel, e i programmi applicativi. I sistemi operativi mobili aggiungono un middleware, cioè un insieme di servizi per chi sviluppa applicazioni.

I tre ruoli

  • Arbitro. Gestisce la condivisione delle risorse, le assegna ai programmi, li isola e li protegge l’uno dall’altro.
  • Illusionista. Offre astrazioni semplici delle risorse fisiche, come una memoria che sembra illimitata o una macchina che sembra dedicata a ciascun programma, e oggetti di livello più alto come file, utenti e messaggi.
  • Collante. Fornisce servizi comuni, dall’archiviazione alla rete, dalle finestre alle autorizzazioni.

Come è organizzato un elaboratore

Un calcolatore general purpose è composto da una o più CPU e da controllori di dispositivo collegati da un bus comune che dà accesso alla memoria condivisa. Per ogni controllore il sistema operativo ha un driver, che ne gestisce le particolarità e offre al resto del sistema un’interfaccia uniforme. CPU e controllori lavorano in parallelo e competono per l’accesso alla memoria.
I dispositivi segnalano gli eventi con le interruzioni. La CPU controlla una linea di richiesta di interruzione dopo ogni istruzione. Le linee sono di solito due, una non mascherabile per gli errori gravi e una mascherabile per le richieste dei controllori. La memoria principale, la RAM, è volatile. Il firmware sta in memorie non volatili come le EEPROM, e la memoria secondaria conserva in modo permanente grandi quantità di dati.
Le architetture vanno dai sistemi con un solo processore ai multiprocessori, oggi quasi sempre multicore, con più unità di calcolo sullo stesso chip. Quando i processori aumentano, dare a ciascuno una memoria locale veloce porta all’architettura NUMA, ad accesso non uniforme alla memoria. I cluster uniscono invece più calcolatori completi, detti nodi, collegati in rete.

Modalità duale e chiamate di sistema

Per proteggersi dagli errori dei programmi il sistema operativo lavora in due modalità, segnalate da un bit della CPU. In modalità kernel si possono eseguire le istruzioni privilegiate, in modalità utente no. Un timer interrompe la CPU a intervalli regolari e restituisce il controllo al sistema operativo, così che nessun programma possa monopolizzarla.
Le chiamate di sistema sono il modo in cui un programma chiede al sistema operativo di svolgere operazioni riservate. I programmatori le usano quasi sempre attraverso una API, come la Win32 API di Windows, la POSIX API dei sistemi derivati da UNIX e la Java API. Quando un programma C chiama printf(), la libreria invoca a sua volta la chiamata di sistema write(). I parametri passano al kernel nei registri, in un blocco di memoria di cui si passa l’indirizzo oppure nello stack. Le chiamate si dividono in controllo dei processi, gestione dei file, gestione dei dispositivi, informazioni, comunicazioni e protezione.
Ogni sistema operativo ha le proprie chiamate di sistema, e per questo un programma compilato per uno non gira su un altro. Per renderlo portabile lo si scrive in un linguaggio interpretato come Python, lo si esegue in una macchina virtuale come quella di Java, oppure lo si scrive in un linguaggio standard come C o C++ e lo si compila per ogni sistema.

Interfacce e servizi

L’utente interagisce con il sistema operativo attraverso un interprete dei comandi, la shell, un’interfaccia grafica o uno schermo tattile. Il sistema offre servizi per eseguire i programmi, gestire l’input e l’output e i file, comunicare, rilevare gli errori, allocare le risorse, registrare gli eventi e garantire protezione e sicurezza.
Un esempio di sistema monoprogrammato è la piattaforma Arduino. Il programma si scrive su un PC e si carica nella memoria flash del microcontrollore, che esegue un solo programma alla volta. FreeBSD, derivato dallo UNIX di Berkeley, è invece un esempio di sistema multitasking.

Le strutture del sistema operativo

  • Monolitica. Le funzioni del kernel stanno in un unico programma, in un sistema strettamente accoppiato. Linux, basato su UNIX, ha una struttura di questo tipo.
  • Stratificata. Il sistema, debolmente accoppiato, è diviso in livelli, ciascuno dei quali usa solo i servizi di quelli inferiori.
  • A microkernel. Il kernel si limita alle funzioni di comunicazione fra i programmi client e i servizi, che girano anch’essi in spazio utente. Il primo esempio fu Mach, a metà degli anni Ottanta.
I sistemi reali combinano queste strutture. Darwin, il nucleo di macOS e iOS, unisce il microkernel Mach e il kernel BSD UNIX ed è stato rilasciato come open source. Android, che gira su un numero enorme di dispositivi diversi, astrae l’hardware con uno strato apposito, l’hardware abstraction layer (HAL).
All’accensione un piccolo programma di bootstrap, conservato nel firmware, individua il kernel e lo carica in memoria. Il kernel inizializza l’hardware e monta il file system principale. Programmi come GRUB permettono di scegliere fra più kernel e più versioni.

Protezione, virtualizzazione e licenze

La protezione è l’insieme dei meccanismi che controllano l’accesso alle risorse da parte di processi e utenti. La sicurezza difende il sistema dagli attacchi interni ed esterni, e gli identificatori utente legano ogni operazione a chi la compie.
La virtualizzazione astrae l’hardware di un computer in più ambienti di esecuzione, ciascuno con l’illusione di avere una macchina propria. Un gestore di macchine virtuali permette di eseguire più sistemi operativi sullo stesso hardware, ed è la base del cloud computing nelle forme SaaS, PaaS e IaaS.
Il software libero rende disponibile il codice sorgente con una licenza che ne permette l’uso, la ridistribuzione e la modifica. Il software open source rende disponibile il codice sorgente, ma non sempre con le stesse libertà. GNU/Linux e FreeBSD sono esempi diffusi di sistemi aperti, Microsoft Windows è un sistema proprietario.
 
 

Vincenzo Calabrò | Ingegnere informatico specializzato in sicurezza informatica e investigazioni digitali. Funzionario informatico del Ministero dell'Interno; su incarico autorizzato si occupa di sicurezza informatica e di perizie informatiche forensi. Autore di articoli e saggi. Lecturer, Speaker, Trainer.
Profili: Google Scholar · ORCID · ResearchGate · Academia.edu · CyberSecurity360 · AgendaDigitale · ICT Security Magazine · LinkedIn