E’ innegabile, viviamo immersi in un mare magnum di dispositivi elettronici. Conseguenza diretta è che sempre più spesso, anche i non addetti ai lavori devono fare i conti con termini tecnici. Grazie alla sempre maggiore diffusione di device di uso comune o più evoluti si sente molto frequentemente parlare di sistema operativo (in inglese, Operating System, abbr. OS).
Dagli smartphone alle tv, dalle radio ai tanti dispositivi indossabili (in inglese, wearable). Ognuno di questi dispositivi elettronici, da quelli più piccoli e rudimentali fino a quelli più grandi e complessi, ci costringono, anzi ci obbligano ad interfacciarci con un moderno sistema operativo.
Ma cos’è un sistema operativo? Siamo proprio sicuri di saperlo?
Bisogna pensare al sistema operativo come un intermediario, cioè un programma molto complesso capace di fornire un vasto ambiente dove l’utente potrà eseguire le sue applicazioni o impartire comandi in maniera appropriata ed efficiente.
Un computer è costituito in maniera modulare: tra i vari moduli possiamo trovare Tastiera, video, mouse, dischi, memoria di massa, memoria centrale, dispositivi ingresso/uscita abbr. I/O. Scrivere programmi che tengano conto di tutta questa complessità o delegare il loro corretto uso al malcapitato utente sarebbe impensabile. Uno dei principali compiti di un sistema operativo è la gestione dell’hardware del dispositivo e la fornitura ai programmi utente di un’interfaccia semplificata.
Il SO rende trasparente all’utente tutta la gerarchia di comandi e azioni che, partendo dalle applicazioni, si snodano fino alla vera micro-architettura del sistema di calcolo. Il sistema operativo è quindi un software che sovrintende al funzionamento del dispositivo ponendosi come intermediario tra l’utente e l’hardware; lo scopo èf ornire un ambiente nel quale eseguire programmi in modo efficiente. In effetti il sistema operativo può essere osservato da diverse prospettive, evidenziandone diversi aspetti e compiti:
Come tutte le cose anche i sistemi operativi si sono evoluti durante il corso degli anni. Essi sono sempre stati strettamente connessi all’architettura della macchina su cui venivano eseguiti, fino a creare una corrispondenza biunivoca (one to one) col calcolatore.
Uno dei primi computer, in questo caso meccanico, fu quello progettato dal matematico inglese Charles Babbage e si chiamava “macchina analitica”. Tale macchina per una serie di difficoltà del tempo, non ultima la problematicità nel costruire ruote meccaniche, non riuscì a funzionare correttamente. Ma la grande intuizione del matematico fu quella di accorgersi che sarebbe stato necessario del software per la sua macchina analitica.
L’incarico di sviluppare un primordiale software per la sua invenzione fu affidato a quella che oggi viene considerata la prima programmatrice della storia. Questa fu Ada Lovelace, matematica e scrittrice inglese, contessa di Lovelace e figlia di Lord Byron e della matematica Isabella Noel Byron. Ada tradusse, ampliandolo, anche un articolo scientifico di Federico Mebabrea (Notions sur la machine analytique de Charles Babbage) che conteneva riferimenti a procedure per il calcolo dei numeri di Bernoulli.
I primi calcolatori (anni 40 e inizio anni 50) non avevano un sistema operativo. Nella memoria centrale venivano caricate e risiedevano solo le istruzioni e i dati dell’unico programma in esecuzione. A causa di alcuni colli di bottiglia, dovuti principalmente alla grande differenza tra la velocità di trasferimento dei dati da e per i dispositivi di Input/Output e la velocità di esecuzione delle istruzione, che portavano ad una improduttiva inattività della CPU, negli anni seguenti vennero sviluppati sistemi con caratteristiche diverse: i sistemi operativi multiprogrammati.
Alla base della multiprogrammazione c’è l’idea di consentire l’aumento dell’utilizzo della CPU organizzando i lavori in maniera tale da mantenerla sempre in attività. Ciò accade perché il sistema operativo tiene contemporaneamente in memoria centrale diversi lavori (job). Nella esecuzione di un job ci si potrebbe trovare in una situazione di completamento di un’operazione di Input/Output. Un tale evento in un sistema non multiprogrammato lascerebbe la CPU inattiva (per tutto il tempo di esecuzione dell’operazione di I/O). Ciò invece non accade nei sistemi con multiprogrammazione, nei quali il sistema operativo passa all’esecuzione di un altro processo, ottenendo così che la CPU non resti mai inoperosa.
Negli anni 60 quindi, con la multiprogrammazione, le CPU iniziano ad eseguire contemporaneamente più programmi. Sfruttando i tempi morti o di attesa del completamento delle operazioni di I/O di un programma per far avanzare l’esecuzione di un altro job. Il passo successivo, anni 70, fu la volta dei sistemi operativi time sharing e sistemi basati sulle priorità. Nei time sharing il sistema operativo deve poter interrompere l’esecuzione di un programma per lanciarne un altro, mentre nella multiprogrammazione con priorità a tutti i programmi è assegnata una precedenza che misura l’importanza o l’urgenza dell’esecuzione.
Il sistema operativo dovendo scegliere tra più programmi pronti per l’esecuzione, sceglie quello a priorità più elevata; se un utente manda in esecuzione un nuovo programma il sistema operativo ne controlla la priorità e, nel caso, interrompe il software in esecuzione per fare partire la nuova richiesta di lancio. Il sistema operativo deve ottimizzare l’uso delle risorse e fare da ponte tra queste e il software.
Tutto il sistema è visto come una serie di livelli dal basso verso l’alto: prima di tutto ci sono i dispositivi hardware e subito sopra troviamo il resto dei livelli nei quali sono compresi le componenti del sistema operativo, e dove ogni livello è visto come una macchina virtuale, capace di fornire determinati servizi. Ciascun livello opera sulla macchina virtuale di livello inferiore e ne rappresenta una macchina virtuale a livello superiore più potente.
I moderni sistemi operativi godono di una architettura a micro-kernel. Alla base di questa architettura c’è l’idea di avere un nucleo di sistema operativo che esegue un minimo di funzioni essenziali. Tutte le altre funzioni sono trattate alla stregua delle applicazioni. Al micro kernel sono riservate poche attività, quali la gestione del processore, delle interruzioni (interrupt) e la comunicazione tra processi.
Tutte le funzionalità del sistema operativo che non sono incluse nel micro-kernel sono raggruppate in un unico livello esterno al micro-kernel stesso. Per realizzare sistemi più semplici e flessibili nei sistemi a micro-kernel il solo nucleo è eseguito in modalità riservata a differenza dei sistemi operativi tradizionali.
Articolo a cura di Carlo Denza