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 costituiti da ammassi di valvole termoioniche che occupavano intere stanze, erano lentissimi e così costosi da poter essere utilizzati soltanto da grossi centri di calcolo o università. Queste macchine non erano provviste di sistema operativo, e l'utente programmatore poteva interagire direttamente con esse solo tramite una console costituita da bottoni e lampadine. Tramite la console era possibile visualizzare o modificare il valore di qualsiasi registro o locazione di memoria, ed era quindi necessario inserire nel program counter l'indirizzo contenente la prima istruzione di un programma per poterne attivare manualmente l'esecuzione. Le uniche periferiche di ingresso di questi sistemi erano i lettori di schede perforate, ovvero cartoncini sul quale venivano stampate, in binario, le istruzioni del programma. Tali schede, una volta caricate in memoria, venivano prima compilate e poi eseguite (anche il compilatore andava eseguito manualmente), e il risultato, a sua volta ottenuto tramite una stampante, era disponibile dopo decine di minuti.
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" (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.