EVOLUZIONE SISTEMI OPERATIVI
Le problematiche nel creare una interazione tra l’utente e l’hardware sono state le prime ad essere affrontate dai progettisti che decisero così di creare il SOFTWARE DI BASE. Queste migliorarono grazie ai sistemi dedicati, la gestione dei sistemi a lotti dato che introdussero il BUFFERING e il SPOOLING.
SISTEMI DEDICATI (1945-1955)
La prima fase, quella compresa tra il 1945 e il 1955, può essere definita come quella dei
sistemi dedicati. I calcolatori erano valvolari, occupavano intere stanze, erano lenti, molto
costosi e a uso quasi esclusivo di università o centri di ricerca.
Il tempo macchina, inteso come tempo di utilizzo della CPU, era una risorsa pregiata concessa
a pochi utenti privilegiati per brevi periodi (turni), e durante il proprio turno i vari
utenti avevano a disposizione l’intero sistema: il programmatore caricava i propri programmi
(scritti in linguaggio macchina prima e successivamente in assembler) in memoria, li
faceva eseguire e ne controllava l’esecuzione.
Non esisteva un sistema operativo vero e proprio: le poche funzioni disponibili per la gestione
dell’hardware venivano inviate impostando interruttori e commutatori della console.
Non esistevano tastiera e monitor, e i risultati dei programmi si leggevano direttamente in
alcuni registri rappresentati sul pannello tramite indicatori luminosi.
GESTIONE A LOTTI (1955-1965)
La gestione appena descritta permetteva un basso utilizzo della CPU in quanto la maggior
parte del tempo veniva sprecata per caricare i programmi: in un sistema molto costoso
sicuramente tale situazione non era soddisfacente.
Il passo successivo fu quello di introdurre un sistema automatico di caricamento dei programmi:
si utilizzarono le schede perforate come supporti su cui memorizzare i programmi, i comandi con le
chiamate di sistema operativo e i lettori di schede come dispositivi di input.Ogni scheda perforata conteneva un’istruzione.
L’utente non utilizzava più la console del calcolatore, ma la sua interazione avveniva semplicemente
inserendo un pacco di schede (lotto) nell’apposito lettore: questo tipo di gestione
fu proprio chiamata gestione a lotti (batch processing) o elaborazione a lotti.
I lavori degli utenti erano costituiti da pacchi di schede perforate dove ogni lotto (chiamato
lavoro o job) iniziava con una scheda di identifi cazione dell’utente e consisteva in una sequenza
di passi o step, dove i singoli step erano le funzioni richieste dall’utente al sistema
operativo, come la compilazione del programma, il caricamento, l’esecuzione ecc.
Le schede di controllo utilizzavano un particolare linguaggio per comunicare con il calcolatore:
il JCL o Job Control Language.
Un job è delimitato da due schede speciali di controllo: $JOB e $END.
Per esempio il comando $FTN attivava il compilatore Fortran, $RUN richiedeva l’esecuzione,
$END terminava l’elaborazione ecc. Il processore alternava quindi l’esecuzione di istruzioni di controllo ai programmi: gli eventuali dati dovevano essere inclusi nel pacco di schede e quindi i singoli lavori prevedevano anche un’alternanza di schede di istruzioni, di controllo e di schede dati.
I risultati delle elaborazioni finivano stampati su un tabulato comune a tutti i job.
Le principali caratteristiche di questo tipo di sistema possono essere così elencate:
- il sistema operativo è sempre residente in memoria (monitor)
- In memoria centrale è presente un solo job alla volta;
- Finché il job corrente non è terminato, il successivo non può iniziare l’esecuzione;
- Non è presente interazione tra utente e job;
- Se un job si sospende in attesa di un evento, la CPU rimane inattiva;
- Da una scarsa efficienza: durante l’I/O del job corrente, che sono per loro natura molto lente, la CPU rimane inattiva.
Il problema principale della scarsa efficienza di questo tipo di gestione era proprio legato al fatto che la CPU veniva sempre altamente sottoutilizzata dato che sia il lettore di schede sia la stampante, essendo componenti meccanici, erano di gran lunga più lenti del processore, che risultava per la maggior parte del tempo inattivo aspettando le “lentezze” delle sue periferiche. Furono quindi introdotti perfezionamenti nella gestione a lotti per rimuovere tale collo di bottiglia: si passò dalle schede ai nastri magnetici, aumentando così la velocità di trasferimento;
BUFFERING
Un primo rimedio per ovviare ai tempi di attesa delle periferiche fu l’introduzione della tecnica di buffering: un buffer è un’area di memoria intermedia dedicata al salvataggio temporaneo di informazioni, implementato direttamente nel device driver del dispositivo. IBM 1401 fu uno dei primi calcolatori ad utilizzare questa tecnologia (buffering).
Con il buffering l’accesso alla periferica segue questa sequenza di operazioni:
- La periferica legge in Input/Output un blocco dati (blocco corrente) e lo passa alla CPU;
- Mentre la CPU elabora il blocco dati corrente, la periferica legge il blocco dati successivo;
- La CPU produce output solo fino a quando il buffer è pieno e quindi si ferma;
- La periferica di uscita legge i dati prodotti dalla CPU prelevandoli dal buffer al suo ritmo.
SPOOLING
Nonostante l’introduzione dei buffer, rimasero alcuni problemi da risolvere:
- I buffer non possono essere molto grandi per motivi di costi;
- Il buffer tende a riempirsi velocemente e quindi il problema dell’attesa non viene risolto;
- Con velocità di I/O << velocità CPU non produce giovamenti;
- Se il buffer si riempie, la CPU si blocca.
Si arrivò all’introduzione di meccanismi chiamati dischi di spooling (Simultaneous Peripheral
Operations On Line), creando contemporaneità tra le attività di I/O e quelle di computazione: il disco viene impiegato come un buffer molto ampio, dove leggere in anticipo i dati e memorizzare temporaneamente i risultati, in attesa che il dispositivo di output sia pronto.
Invece cioè di scrivere e leggere dai dispositivi fisici si legge e si scrive su due dispositivi
virtuali:
- Il disco di spooling di ingresso contiene le schede lette dal lettore e contenenti job nonancora eseguiti (“job virtuali”);
- Il disco di spooling di uscita contiene invece “output virtuali”, ossia tabulati già prodotti relativi a eseguiti ma non ancora stampati. In questo modo è possibile sovrapporre i tempi di elaborazione con quelli di I/O: mentre la CPU elabora il programma, i canali di I/O provvedono a riempire o svuotare i dischi di spooling e a gestire i trasferimenti