Definizione di Sistema Operativo
Un Sistema Operativo (SO) è un
software, quasi sempre molto complesso, che virtualizza una macchina
reale (elaboratore elettronico) e le
sue risorse, gestendone e coordinandone l'uso da parte delle applicazioni. Il
SO crea un ambiente di lavoro nel quale le applicazioni vengono eseguite
ed assegna (alloca) loro le risorse della macchina reale in base alle
richieste e alla disponibilità. Il SO è schematizzabile come costituito da un
nucleo detto Kernel (insieme di tutto ciò che può essere eseguito sulla
macchina in stato supervisore, normalmente interdetto all'utilizzo da
parte dell'utente, e responsabile della creazione dell'ambiente di lavoro) e da
un interprete dei comandi (espressi in apposito linguaggio di comando
simbolico detto JCL, Job Control Language) detto Shell
(si pensi al prompt dell'MS-DOS
Per i primi sistemi di elaborazione
l'unico tipo di programmazione previsto era il Linguaggio Macchina (il
programmatore si occupava di tutto: algoritmo, controllo periferiche, settaggio
dei bit di stato, flag del processore, e così via). I primi SO erano semplici
insiemi di Drivers, programmi che fungono da interfaccia tra l'unità
centrale e i dispositivi periferici. Successivamente fu ideato il primo programma
Caricatore, il cui compito era caricare programmi e dati, da schede
perforate o nastri magnetici, nella memoria dell'elaboratore (un programma in
linguaggio simbolico poteva richiedere per la sua esecuzione più operazioni di
caricamento prima l'opportuno compilatore che generava il testo in
Assembly, poi l'assemblatore che produceva il codice oggetto in formato
binario e che veniva infine caricato in memoria per l'esecuzione). La necessità
di limitare progressivamente l'uso delle schede perforate diede impulso alla
creazione di macchine dedicate al trasferimento dei "contenuti" da
schede perforate a nastri magnetici e, poiché se ne occupava un operatore
umano, fu presto evidente che il processo di trasferimento era tanto più
efficace se applicato ad un numero considerevole di schede per volta: nacque il
concetto di Batch o Lotto. Si capì che la CPU di una macchina poteva
essere sfruttata per eseguire alternativamente diversi Processi attivi
purchè questa Multiprogrammazione
(e i problemi che comportava) fosse opportunamente gestita. Il trasferimento di
contenuti dalle schede perforate venne presto indirizzato alle unità a disco
(che hanno il vantaggio di essere ad accesso casuale, anziché sequenziale come
i nastri magnetici) e la procedura adottata prese il nome di Spooling (Spool
è acronimo di Simultaneous Peripheral Operations On-Line e si riferisce
allo spostamento di immagini di lavoro, da svolgere o da inviare a dispositivi
periferici, attraverso la temporanea memorizzazione in un buffer, in memoria
o più frequentemente su disco rigido): in pratica i contenuti delle schede
perforate e dei nastri venivano massicciamente trasferiti a lotti su unità a
disco, indicizzati in una tabella, in modo da poter essere poi
all'occorrenza caricati in memoria su richiesta di utenti e programmi in tempi
molto rapidi grazie all'accesso casuale dei dischi; naturalmente lo Spooling
valeva non solo in Input ma anche in Output, consentendo di usare il disco come
buffer temporaneo per l'invio differito nel tempo di dati a dispositivi
periferici (la più comune applicazione dello Spool è proprio lo spooling di
stampa, un sistema che attraverso una coda FIFO è in grado di somministrare
ad una stampante una grande quantità di pagine, secondo i tempi che le sono
congeniali, agendo in background, in modo che, durante la stampa, i
tempi morti della CPU siano sfruttati dall'utente per eseguire processi a più
alta priorità); con questo meccanismo era possibile caricare su disco un grosso
pool di jobs, trasferirne di volta in volta una parte in memoria ed
eseguirli uno per uno fino ad esaurimento, attingendo quando necessario
direttamente dal disco i dati utili, con la possibilità di swappare un
processo (in attesa di un evento o sospeso) su disco a vantaggio di un altro,
così da tenere sempre in attività la CPU: si parla di Multiprogrammazione di
tipo Batch o Batch Multiprogrammato. Diverso approccio alla gestione
di job multipli è la Multiprogrammazione di tipo Time Sharing, nel quale
la potenza di calcolo della CPU viene distribuita ciclicamente, per piccole
frazioni di tempo, ad N utenti attraverso N terminali (ciascun utente ha
l'impressione di avere le risorse del sistema tutte per sé, il singolo processo
del singolo utente diventa Running per un breve intervallo di tempo e poi
resta Ready nel tempo in cui operano gli altri utenti). Nel Batch
Multiprogrammato con Partizione Time Sharing i jobs degli utenti
(considerati prioritari perchè conversazionali, ovvero richiedono
interazione con l'utente e devono sottostare a stringenti tempi di risposta)
sono gestiti tramite il Time Sharing (Scheduling a Breve Termine), e
solo in assenza di jobs conversazionali vengono avviati i jobs di background
in modalità Batch (Scheduling a Lungo Termine); una possibile variante
del modello consiste nel non fare sì che la CPU sia monopolizzata totalmente
dai processi utente e prevede che una piccola frazione di tempo utile ciclico
della CPU sia comunque concessa al carico di lavoro Batch. I sistemi che
forniscono risposte in tempi brevi sono classificati in Hard Real Time o
Real Time (non Hard) rispettivamente se tempi di risposta estremamente
rapidi sono decisivi per la correttezza del sistema oppure se tempi "medi" di
risposta sono comunque accettabili. Con l'avvento dei MicroProcessori i
computer divennero personal e i SO offrirono un ambiente di lavoro più user
friendly: il concetto di multiprogrammazione era inizialmente assente nei
primi SO (si riteneva fosse legato necessariamente ad una pluralità di utenti e
comunque richiedeva potenze di calcolo proibitive per l'epoca) ma oggi è
supportato da tutti i SO moderni. Negli ultimi 20 anni, infine, si è dato
impulso all'aggregazione di PC per costituire Sistemi Distribuiti,
comunemente detti Reti, geograficamente dislocate.
Dal punto di vista dell'utente, i SO
possono essere classificati in sistemi dedicati, sistemi batch (a
lotti), sistemi interattivi o conversazionali, sistemi in
tempo reale e sistemi transazionali. Un sistema dedicato
fornisce un interprete dei comandi, la possibilità di lanciare programmi e di
gestire file, il tutto dedicato ad un unico utente, caratterizzandosi per il
basso sfruttamento della CPU durante le interazioni con l'utente e l'assenza di
una virtualizzazione delle risorse: viene denominato Supervisore o DOS,
per evidenziare rispettivamente il controllo esercitato sull'esecuzione dei
lavori o il supporto alla gestione del disco. Un sistema batch (a
lotti) gestisce singolarmente l'avanzamento di lavori raggruppati in lotti
memorizzati su disco, privilegiando lo sfruttamento della CPU (vantaggio) a
prezzo dell'assenza di interazione con l'utente, che deve fornire il suo lavoro
in via preliminare e che può attenderne il completamento anche per ore o giorni
(svantaggio): le unità di I/O sono virtualizzate e
ciò rende le operazioni su di esse più veloci (vantaggio). Un sistema
interattivo o conversazionale assegna, agli utenti che interagiscono
attraverso terminali, le risorse per "quanti di tempo", riducendo il tempo di
risposta e dando loro la sensazione di operare su un sistema dedicato (vantaggio):
questo meccanismo produce necessariamente un overhead (svantaggio). Un sistema
transazionale consente ad utenti ed applicazioni di eseguire sequenze di
operazioni elementari (tipicamente manipolazione di
archivi)
in forma di transazioni, rispettando le proprietà di atomicità, consistenza,
isolamento e persistenza. Un sistema in tempo reale esegue programmi
che, interagendo con l'ambiente esterno, garantiscono a dati di ingresso
risposte in tempo utile rispetto alle constanti di tempo proprie dell'ambiente
esterno stesso: la correttezza del sistema dipende in modo critico dalla
velocità di esecuzione. Si noti che in campo commerciale "real time" è sinonimo
di conversazionale o transazionale, tuttavia i due tipi di sistemi non coincidono.
In base all'organizzazione interna
possono essere inoltre classificati in sistemi monoprogrammati, sistemi multiprogrammati,
sistemi time-sharing (a partizione di tempo) e sistemi ad uso
speciale. In base infine all'architettura del sistema di elaborazione su
cui sono calati, i SO possono essere classificati in SO per sistemi di
calcolo monolitici, per sistemi di calcolo distribuiti e per sistemi
di calcolo paralleli.