# Storia dei sistemi operativi

La storia dei sistemi operativi descrive l'evoluzione durante tutto il periodo di sviluppo dei calcolatori elettronici, sviluppandosi parallelamente alla storia del computer e, più in generale, della storia dell'informatica.

## Classificazione

La storia dei sistemi operativi può essere suddivisa in varie generazioni, ognuna delle quali composta da esemplari sempre più evoluti, affidabili e veloci rispetto a quelli della generazione precedente. Le generazioni possono essere così schematizzate:
* prima generazione – valvole e spinotti, assenza di sistema operativo;
* seconda generazione – transistor e sistemi batch;
* terza generazione – circuiti integrati e multiprogrammazione;
* quarta generazione – sviluppo delle reti e avvento del personal computer.

## Il secondo dopoguerra

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 sovrani particolarmente facoltosi. Inoltre questi calcolatori erano molto inaffidabili, in quanto le valvole che li componevano si rompevano spesso. In questo periodo non esisteva ancora il concetto di Sistema Operativo; infatti il programma da eseguire veniva inserito ad ogni esecuzione in codice binario attraverso dei primitivi lettori di schede perforate e dopo alcune ore il risultato veniva inviato a una stampante. Il programma doveva contenere tutte le istruzioni necessarie, comprese ad esempio le singole operazioni di input/output verso dispositivi fisici: queste procedure a basso livello andavano riportate identiche in tutti i programmi, a differenza dei sistemi odierni, in cui è il sistema operativo che le implementa, e nei programmi è necessario solo richiamarle.

## Gli anni '50 e '60

Tra il 1955 e il 1965, grazie alla rivoluzionaria invenzione del transistor gli elaboratori (chiamati mainframe) divennero abbastanza affidabili da poter essere costruiti e venduti in serie, anche se erano comunque macchine grosse e costosissime tanto che gli unici acquirenti possibili erano ancora una volta i Centri di Calcolo, le Università e le banche.
Per eseguire dei programmi (o come venivano chiamati, job), un programmatore doveva scrivere il proprio programma su carta, trasferirlo su schede, caricarlo nel computer, attendere il termine dell'esecuzione e la stampa del risultato. Tale operazione era molto dispendiosa in termini di tempo e non permetteva di sfruttare la CPU della macchina durante le lunghe fasi di caricamento di dati e programmi: non essendo infatti stata ancora introdotta la tecnologia di accesso diretto alla memoria (DMA) durante le fasi di input/output il processore era totalmente utilizzato per il controllo di queste operazioni. È per questo che si adottò la soluzione del sistema batch (a lotti): l'idea di base era quella di dividere su macchine distinte le tre operazioni di caricamento dei dati, elaborazione vera e propria e stampa. Il calcolo veniva affidato ad un calcolatore centrale costoso come l'IBM 7094 mentre gli elaboratori satelliti utilizzati per le altre due operazioni erano macchine più economiche come gli IBM 1401.
Il sistema operativo di questi mainframe doveva erogare pochi semplici servizi: gestione dell'input/output, interpretazione dei comandi contenuti nelle schede controllo, e pilotaggio dell'esecuzione di programmi, sia quelli lanciati dall'utente, sia le utilità di sistema. I sistemi operativi tipici per questi elaboratori, per lo più programmati in Fortran e in Assembly erano il Fortran Monitor System (FMS) e l'IBSYS.

## Gli anni '60 e '70

Dai primi anni sessanta cominciò a farsi strada il concetto di dispositivo virtuale e astrazione. Prima di ciò un programmatore che avesse voluto comandare ad esempio una stampante, doveva conoscere, nei minimi dettagli, il funzionamento a basso livello della periferica, mentre a partire dall'introduzione del concetto di periferica virtuale il sistema operativo avrebbe fatto da intermediario tra utente e periferica. Nello stesso periodo i sistemi operativi iniziarono a supportare il DMA e lo Spool.
Il DMA (Direct Memory Access) è il sistema che permette di trasferire interi blocchi di dati da memoria secondaria a memoria centrale in modo completamente indipendente dal processore, il quale può, nel frattempo, eseguire altre operazioni. Lo Spool (Simultaneous Peripheral Operations On Line) è un sistema che permette di gestire in maniera efficiente le code di job di stampa.

### La multiprogrammazione

In questo periodo vennero anche introdotte delle "politiche di ordinamento dei job". Essi venivano caricati ed eseguiti in maniera sequenziale, ma l'ordine di esecuzione dei programmi era gestito da opportune politiche implementate nel sistema operativo. Siamo ancora lontani da ciò che sarà poi il time-sharing supportato da tutti i sistemi operativi moderni, tuttavia è il germe che darà il via alla implementazione della multiprogrammazione negli anni successivi.

### L'IBM System/360

Nell'aprile del 1964 l'IBM presentò una famiglia di computer chiamata IBM System/360, prima realizzazione di una netta distinzione tra architettura hardware e implementazione. Tutti gli elaboratori della suite, che andavano da piccole macchine a grandi mainframe utilizzavano varianti dello stesso sistema operativo, l'OS/360, che supportava sia il calcolo scientifico che quello commerciale. Tuttavia questa eccessiva diversificazione tra i diversi computer rese difficile scrivere codice efficiente che rispettasse tutti i requisiti che erano in conflitto tra di loro. Il risultato fu un sistema operativo enorme e molto complesso scritto da migliaia di programmatori. OS/360 conteneva centinaia di errori che resero necessarie diverse revisioni. Ogni nuova versione correggeva alcuni problemi, introducendone però degli altri.
Un esauriente rapporto sull'esperienza con OS/360 è descritto da Fred Brooks sul suo saggio sull'Ingegneria del Software intitolato "The Mythical Man-Month: Essays on Software Engineering". In questo e in molti altri sistemi operativi dell'epoca venne implementata la multiprogrammazione, che rendeva possibile la presenza di più programmi in memoria contemporaneamente. Questo rendeva necessaria la presenza di hardware specializzato per proteggere i programmi dalle reciproche interferenze. Quando un job in esecuzione aveva bisogno di effettuare un'operazione di I/O il sistema operativo lo sospendeva e al suo posto faceva girare un altro job. Quando l'operazione di I/O si concludeva, il primo job tornava pronto all'esecuzione e attendeva il suo turno attendendo la sospensione di uno degli altri. Questi sistemi ottimizzavano l'uso delle risorse disponibili ma non lo sviluppo dei programmi, infatti il tempo che intercorreva tra il caricamento dei programmi e la disponibilità dei risultati era spesso di alcune ore, per cui il più piccolo errore poteva far perdere al programmatore un sacco di tempo.

### La nascita di Unix

Dagli anni sessanta esiste il concetto di time-sharing: ogni utente dispone di un dispositivo di ingresso (la tastiera) e un dispositivo di uscita (un monitor o una telescrivente), e ha la possibilità di inviare comandi al sistema operativo ottenendo subito una risposta. Infatti in questi sistemi con time-sharing un programma resta in esecuzione fino a quando esso richiede un'operazione di I/O, oppure occupa la CPU per più di un certo intervallo di tempo prestabilito (detto quanto temporale).
Nel 1962 venne realizzato al MIT il primo sistema di time-sharing su un IBM 7094: il CTSS. Fu in realtà il Multics la vera rivoluzione. Venne sviluppato congiuntamente dal MIT, dalla General Electric e dai Bell Laboratories, ed era in grado di supportare centinaia di utenti in time-sharing. La realizzazione fu però molto più complessa del previsto, tanto che i Bell Laboratories abbandonarono il progetto. Tuttavia Multics introdusse molte nuove idee che influenzarono non poco i successivi sistemi operativi. Se da un lato esistevano questi supercomputer dall'altro negli stessi anni vi fu lo sviluppo dei minielaboratori, dei quali un importante esponente fu il PDP-1 del 1961 che costava "solo" 120000 $ (cioè il 5% del prezzo di un IBM 7094) e che ebbe un gran successo. Per questi sistemi vennero progettati appositi sistemi operativi, il più famoso dei quali fu senza dubbio Unix.
Unix fu progettato a partire dal 1969 da un gruppo di ricercatori della AT&T presso i Bell Laboratories, tra cui erano presenti Ken Thompson (che lavorò anche al progetto Multics), Dennis Ritchie e Douglas McIlroy. Esso prese notevole spunto dal padre Multics, e grazie all'ottimo lavoro di queste persone divenne un sistema molto interattivo, affidabile e ricco di funzionalità, tanto che, nelle sue varianti ed evoluzioni, tuttora domina il mercato delle workstation. Da esso furono realizzate varianti come Berkeley Software Distribution (BSD) e sistemi Unix-like come MINIX (usato in ambito didattico) e successivamente l'ormai famosissimo Linux sviluppato dallo studente finlandese Linus Torvalds. Oggigiorno i sistemi operativi "*NIX" sono conformi allo standard POSIX (che uniforma l'interprete dei comandi e le API dei programmi), offrendo una compatibilità reciproca di base necessaria a non stroncarne lo sviluppo.

## Gli anni '80 e i personal computer

Verso gli anni ottanta, grazie alla tecnologia LSI (large scale integration) la costruzione di chip integrati divenne massiccia e portò all'abbattimento dei prezzi dell'hardware, facendo sorgere l'era dell'elaboratore personale o personal computer. Queste macchine erano piccole, economiche ed avevano prestazioni simili a quelle dei calcolatori medio-grandi di 10-20 anni prima. I primi modelli erano dotati di sistemi operativi monoutente con accesso interattivo e supporto al time-sharing. Il più importante tra i primi sistemi operativi per personal computer era il CP/M-80 della Digital Research per le CPU 8080, 8085 e Z-80. Era basato sui sistemi operativi della Digital Equipment Corporation specialmente quelli per l'architettura PDP-1. MS-DOS (o PC DOS quando fornito da IBM) era originariamente basato proprio sul CP/M-80.

### La concorrenza tra Microsoft e Apple

Steve Jobs era tra quelli che credevano nell'idea del personal computer. All'epoca era difficile immaginare cosa potesse farsene una persona di un computer in casa. Egli invece continuò per la sua strada fondando Apple Computer Inc. il 1º aprile 1976 assieme a Steve Wozniak e Ronald Wayne.
Jobs, dopo aver casualmente visto l'interfaccia a finestre sviluppata da Xerox Corporation qualche anno prima, si convinse che il futuro del personal computer sarebbe stato legato all'interfaccia grafica, e così Apple lanciò nel 1984 Mac OS il primo sistema operativo per personal computer con interfaccia grafica. Questa fu una vera rivoluzione tanto che nello stesso anno sarebbe nato l'X Window System in ambiente Unix e il 20 novembre 1985 Microsoft avrebbe commercializzato Windows.
All'inizio Windows non era definibile come un sistema operativo: era piuttosto un'estensione di MS-DOS. Fu con il rilascio di Windows 3.0, nel 1990, che Microsoft si impose sul mercato. Oltre alle maggiori performance che garantiva alle applicazioni rispetto alle versioni precedenti, Windows 3.0 forniva un ambiente multitasking migliorato rispetto alle precedenti versioni di MS-DOS, grazie all'introduzione del supporto alla memoria virtuale, e divenne così un degno rivale dell'Macintosh (su cui girava Mac OS) di Apple. A partire da Windows 3.1 fu introdotto il supporto alla multimedialità (perfezionato via via nelle successive release), mentre con l'introduzione di Windows 95 si passò definitivamente dal calcolo a 16 bit a quello a 32 bit.

## Gli anni '90, l'avvento di Internet e la nascita di Linux

A fianco di Microsoft ed Apple il mercato delle workstation e dei grandi elaboratori era comunque dominato da UNIX. Un fenomeno interessante che iniziò a prendere piede da metà degli anni ottanta fu lo sviluppo delle reti di calcolatori, fenomeno che ha poi portato all'incredibile crescita di Internet. Nacquero così i "sistemi operativi di rete" e i "sistemi operativi distribuiti".
I primi non sono altro che normali sistemi operativi ai quali vengono aggiunti i software per il collegamento a macchine remote e quindi alle relative risorse condivise come file e stampanti. I secondi sono sistemi operativi che girano su sistemi a più processori oppure che inviano i processi da elaborare ad altri computer della rete. Essi sono dotati di particolari politiche di scheduling che permettono un'efficace allocazione dei processi tra le CPU disponibili. Inoltre anche il sistema di archiviazione (il file system) è unico, anche se in realtà è distribuito tra vari nodi della rete.
Esempi della prima classe di sistemi di rete sono tutte le versioni di Windows dalla "Windows for Workgroups 3.1" e dalla "NT" in poi, mentre UNIX e derivati fanno parte di entrambe le categorie in quanto supportano entrambe le tecnologie.
Nel 1991 Linus Torvalds sviluppò un kernel Unix-like, capace però di girare sulla piattaforma x86. Così nacque Linux. Fu quando venne abbinato al progetto GNU di Richard Stallman, portavoce della filosofia del software libero, che iniziò la fortuna di GNU/Linux in quanto la combinazione risultava, e lo è tuttora, un sistema operativo efficiente ed affidabile.

## Gli anni 2000

A partire dal 2000 sono stati immessi sul mercato una grande varietà di sistemi di elaborazione dalle più disparate dimensioni e performance a costi contenuti; questo permette una diffusione pervasiva degli elaboratori elettronici nelle più diverse attività umane. Inoltre sono oggi sempre più diffuse le interconnessioni tra i vari dispositivi in modalità sia wired che wireless. Tutte queste innovazioni hanno portato allo sviluppo di sistemi operativi per le più svariate architetture, in particolare per dispositivi handheld come smartphone e Tablet PC (Symbian OS, Android, iOS, Windows Phone, ecc.).
Per qualunque architettura venga sviluppato un sistema operativo moderno esso deve fornire il supporto, oltre a quanto visto sinora, a molteplici esigenze quali:
* streaming audio/video (trasmissione ed elaborazione continua di dati multimediali);
* supporto alle più diverse tecnologie di interconnessione (ad esempio Ethernet, Bluetooth e Wireless LAN);
* integrazione di tecnologie per la fruizione di contenuti su Internet;
* un'efficiente gestione dell'energia.
La linea di sviluppo dei sistemi operativi moderni per il mercato consumer è principalmente incentrato su multimedialità, connettività e risparmio energetico.

## Filmografia

* I pirati di Silicon Valley (Pirates of Silicon Valley), USA 1999, col, 95', regia di Martyn Burke
* Revolution OS, USA 2001, col, 85', regia di J.T.S. Moore