LEZIONE del 1 Ottobre

Il Laboratorio di Sistemi Operativi è un corso propedeutico al Corso di Sistemi Operativi con l'obiettivo di proporre e sviluppare esempi esplicativi basati su argomenti specifici caratterizzanti la struttura dei moderni elaboratori elettronici per migliorare la comprensione delle architetture software.

Organizzazione e Obiettivi del Corso

Nonostante la grande diffusione di personal computer, tipicamente equipaggiati con sistemi operativi nativi (Windows e MacOS) per ciascuna specifica architettura, nel corso del Laboratorio si farà riferimento esplicito alla grande famiglia dei sistemi Unix, con i suoi dialetti BSD4.2, Irix, Xenix, Ultrix, Eunice, System V, SunOS, Solaris, Linux, NetBSD, FreeBSD con l'obiettivo di fornire allo studente una panoramica minima delle funzioni essenziali realizzate dal nucleo dei moderni sistemi operativi.

Nel caso specifico si prenderanno in considerazione diversi aspetti con cui approcciarsi al sistema. Un primo si guarderà al sistema dall'esterno utilizzando l'interfaccia utente fornita dalla shell, il linguaggio che permette di definire qualunque azione complessa il sistema debba eseguire su richiesta dell'utente.

Un secondo aspetto riguarderà l'accesso al sistema dalla parte più profonda, ossia dal nucleo, componendo le azioni a partire da quei mattoni elementari che sono le chiamate di sistema, organizzate in librerie a cui l'utente deve riferirsi mediante i costrutti del linguaggio C e la sua variante per classi C++. Alcuni degli esempi proposti faranno riferimento all'interazione client-server secondo lo schema classico IPC di UNIX che utilizza le socket.

Un ulteriore aspetto sarà dedicato ad attività sperimentale riguardante l'interazione client-server in un dominio di rete locale. Nello specifico verranno considerati i meccanismi di creazione e gestione dei thread, la loro sincronizzazione mediante semafori, l'impiego delle interruzioni software di UNIX (signal) e la loro applicazione nell'input/output asincrono (SIGIO e SIGALRM).

Tuttavia, prima di entrare nello specifico degli argomenti tecnici, conviene tracciare una breve panoramica sull'evoluzione dei Sistemi Operativi a partire dagli albori, quando cominciò ad entrare nell'uso comune delle attività umane il calcolatore elettronico. Questo, probabilmente, è l'unico modo semplice per comprendere lo stato dell'attuale tecnologia il cui sviluppo non sempre segue la strada della necessità scientifica.

Evoluzione dei Sistemi Operativi

L'idea di calcolatore automatico nasce dopo una lunga gestazione che origina da Pascal e Leibnitz (XVII sec.), prosegue con Babbage e Bool (XIX sec.) fino a giungere nel XX sec. quando Turing (1936) e von Neumann (1945) pongono le basi per la realizzazione dei primi elaboratori elettronici.

Negli anni '40 si costruiscono i primi calcolatori a valvole e sono una sorta di enormi personal computer, nel senso che il loro utilizzo avviene prenotandoli per un intervallo di tempo fisso durante il quale la macchina è totalmente dedicata al suo utilizzatore.

Quando furono introdotti i sistemi batch, nel 1960, il programmatore codificava l'algoritmo su schede perforate (job), portandole in sala macchina. Nel momento in cui erano pronti abbastanza lavori, l'operatore li leggeva tutti come un unico lavoro. Di solito, per ottenere il risultato era necessario attendere una o più ore dal momento della consegna del lavoro.

Il timesharing (sistema a divisione di tempo) fu sviluppato sia presso il Dartmouth College che al M.I.T., con l'obiettivo di aggirare la situazione improduttiva e poco soddisfacente dei sistemi batch. Il sistema di Dartmouth girava solo con il BASIC ed ebbe un successo commerciale di breve durata.

Multics

Il CTSS, un sistema per applicazioni generali (general purpose) sviluppato al M.I.T., invece, ebbe un grosso successo nella comunità scientifica. In poco tempo i ricercatori del M.I.T. unirono le loro forze con i laboratori della Bell e della General Electric (a quel tempo venditori di computer) e cominciarono a progettare un secondo sistema, che chiamarono MULTICS (MULTiplexed Information and Computing Service).

Nonostante le aspettative MULTICS fu un fiasco: progettato per servire centinaia di utenti, non disponeva di un hardware adeguato che, alla metà degli anni '60, risultava paragonabile ai primi PC della IBM, come il famoso AT.

Un altro motivo del fallimento di MULTICS fu determinato dall'impiego del PL/I, un linguaggio assai simile all'attuale PASCAL, sviluppato da IBM e per il quale non era disponibile un buon compilatore e che nei fatti non fu mai realizzato come tale. In definitiva, il progetto era troppo ambizioso per i suoi tempi e, quando il progresso tecnologico lo ha reso fattibile, è diventato rapidamente obsoleto in seguito all'imponente sviluppo delle reti di calcolatori.

Quando i laboratori della Bell si sganciarono completamente dal progetto, uno dei suoi ricercatori, Thompson, decise di riscrivere autonomamente una versione semplificata di MULTICS, in assembler, su un minicomputer della Digital Equipment Corp (DEC), il PDP-7. Sebbene questo calcolatore fosse di dimensioni ridotte, il nuovo sistema di Thompson funzionò egregiamente tanto da permettergli di continuare attraverso di esso il lavoro di implementazione.

Il Linguaggio C e Unix

In realtà Thompson sviluppò il suo sistema assieme ad un altro ricercatore della Bell Labs, Brian Kernigham che scherzosamente chiamò UNICS (UNiplexed Information and Computing Service), approfittando del gioco di parole per il quale la sua pronuncia è simile a "EUNUCHS" (eunuco).

Il nome fu scelto per ricordare che il sistema derivava da MULTICS, del quale conservava la struttura originale sebbene privato di qualcosa diventando definitivo, in un secondo momento, allorchè il suo nome fu leggermente cambiato in UNIX.

II lavoro di Thompson impressionò a tal punto i suoi colleghi alla "Bell Laboratories" tanto che fu contattato da Dennis Ritchie e da tutto il dipartimento. Im primo luogo, UNIX fu portato sul PDP-11/20, un computer più moderno del PDP-7 e, successivamente sul PDP-11/45 e sul PDP-11/70. Queste ultime due macchine dominarono il mondo dei minicomputer per gran parte degli anni '70: dotati di una protezione hardware, era possibile servire più utenti nello stesso tempo.

Il secondo passo nello sviluppo di UNIX riguarderà il linguaggio nel quale era scritto. Era ovvio che dover riscrivere l'intero sistema per le nuove macchine non sarebbe stato un attività semplice e, tanto meno, divertente così Thompson decise di riscrivere UNIX impiegando un linguaggio di alto livello appositamente progettato allo scopo. Chiamò quel linguaggio B perchè era una versione semplificata del BCPL, che era a sua volta la versione semplificata del CPL che, al pari del PL/I, non funzionerà mai bene.

Questo tentativo non ebbe successo soprattutto per la mancanza di strutture del linguaggio. Allora Ritchie progettò un successore di B, chiamato C, per il quale fu scritto un compilatore di ottima qualità. Thompson e Ritchie riscrissero insieme UNIX nel linguaggio C che, da allora in poi dominerà incontrastato come linguaggio per la programmazione dei sistemi.

Nasce il Microprocessore

Mentre UNIX si perfeziona nel campo dei minicomputer, compare sulla scena un nuovo attore, responsabile dello sviluppo degli elaboratori. Si tratta del microprocessore 4004 prodotto dalla INTEL nel 1971, alla cui invenzione aveva partecipato l'italiano Faggin. Nella sua realizzazione furono impiegate le tecniche d'avanguardia, per quel tempo, del VLSI (Very Large Scale Integration) ottenendo una CPU con 2300 transistor contenuti in uno spazio di pochi centimetri.

Dopo la realizzazione del 4004 (CPU a 4 bit), l'anno seguente (1972) l'INTEL produce il nuovo micro 8008 a 8 bit a cui fa seguito due anni più tardi (1974) il più moderno chip Intel 8080 con il quale, nel 1975, venne realizzato il primo personal computer (PC).

Esso fu costruito dalla MITS, una piccola ditta di Albuquerque nel New Mexico, e fu chiamato Altair. Dotato di 256 byte di memoria, non aveva nè tastiera, nè video, nè nastro o disco, ma per poche centinaia di dollari divenne popolare fra chi già possedeva un televisore. Un giovane di nome Bill Gates scrisse una versione di BASIC per Altair ed ebbe un modesto seguito tra i primi utenti di microcomputer e fu l'inizio delle sue fortune.

Nel giro di pochi anni, molte ditte iniziarono a costruire PC basati sul chip 8080 e sui quali girava un sistema operativo chiamato CP/M, prodotto dalla Digital Research, anch'essa una piccola casa produttrice della California. Tutti questi PC costruiti tra il 1975 e il 1980, chiamati in un secondo momento microcomputer, erano essenzialmente dei giocattoli comprati ed usati per hobby.

Unix Portabile

Tuttavia la differenza di sviluppo tecnologico fra mondo dei minicomputer e quello dei microcomputer rimaneva significativa. Basta ricordare che, nel 1974, Ritchie e Thompson pubblicarono un articolo su UNIX che fu una pietra miliare in seguito al quale (1984) i due autori ricevettero il prestigioso ACM Turing Award e così molte università furono spinte a chiedere una copia di UNIX alla "Bell Laboratories". La cessione di UNIX alle università a un prezzo modesto da parte della AT&T, compagnia associata alla Bell ma soggetta a monopolio regolato, permise la sua rapida diffusione nel mondo della ricerca.

In una di quelle coincidenze che spesso fanno la storia, il PDP-11 era il computer scelto presso quasi tutti i "dipartimenti di computer science" delle università ed i sistemi operativi di cui erano forniti avevano scarsa considerazione da parte di professori e studenti. Così UNIX fu in grado di colmare velocemente quel vuoto anche perchè distribuito assieme al codice sorgente.

Molti degli utenti di UNIX cominciarono a lavorare su tale codice arrivando ad organizzare incontri scientifici in cui si parlava di UNIX, con diversi oratori che illustravano i difetti del kernel o come vi avevano posto rimedio. Il risultato fu un apporto rapido di nuove idee e miglioramenti e la versione che per prima diventò lo standard de facto nel mondo accademico fu la Versione 6, chiamata così perchè descritta in sei edizioni del manuale del programmatore UNIX. Ad essa seguì la Versione 7 e il travaso verso il mondo produttivo di quegli studenti, che avevano utilizzato UNIX, contribuì in modo determinante a far conoscere tale sistema al mondo industriale.

Rendere UNIX portabile, cioè eseguibile su altre macchine, diventa relativamente semplice quando si dispone del codice sorgente in C e del compilatore per la nuova macchina. Quello che resta da fare è la scrittura dei driver per i dispositivi di I/O, vale a dire terminali, dischi, stampanti, ecc...

Inoltre, bisogna scrivere una limitata quantità di codice nel linguaggio assembler della nuova macchina perchè le routine di risposta alle interruzioni, la gestione della memoria e i meccanismi di sincronizzazione di basso livello sono fortemente dipendenti dall'architettura hardware.

Dopo il PDP-11 il porting di UNIX interessò il minicomputer Interdata 8/32, il cui effetto fu quello di mettere in luce il gran numero di assunzioni fatte implicitamente dal sistema UNIX riguardo alle macchine su cui girava: rappresentazione degli interi come dei puntatori nel formato da 16 bit, il che implica una dimensione massima di 64K per i programmi. Queste ed altre assunzioni dovettero essere ripulite dal sistema per permettere ad UNIX di girare agevolmente su altri calcolatori.

Un altro problema legato al porting di UNIX era dovto al compilatore di Ritchie che, sebbene veloce e producesse un buon codice oggetto, era essenzialmente una riedizione del codice per il PDP-11. Piuttosto che scrivere un nuovo compilatore specifico per l'Interdata, Steve Johnson della "Bell Laboratories" progettò e realizzò il compilatore C portabile che, con uno sforzo moderato, si poteva adeguare per produrre codice di ogni tipo di macchina. Per anni i compilatori C si sono basati su quello di Johnson il che ha aiutato decisamente UNIX ad essere portato su nuovi calcolatori.

Nasce il Computer Personale

Negli anni '80 l'IBM, gigante industriale di computer nel ramo dei grossi eleaboratori, detti, mainframe, decise che avrebbe dovuto svilupparsi nel mondo dei PC. Incaricò uno dei suoi manager di studiare il problema ed impostare una soluzione facilmente e rapidamente perseguibile. Questi arrivò alla conclusione che il solo modo per produrre velocemente un PC era usare componenti standard, piuttosto che progettarne di propri, come aveva sempre fatto in passato. Nel frattempo la Intel aveva prodotto due successori dell'8080, 1'8086 a 16 bit e una sua variante con un bus a 8 bit, 1'8088. Fu scelto quest'ultimo perchè era composto da chip sostanzialmente più economici.

Anche l'interesse a sviluppare un software di controllo proprietario risultava marginale per l'IBM cosicchè, conoscendo la diffusione del BASIC fra gli utenti di microcomputer, si rivolse alla Microsoft, la "software house" di Bill Gates proprietaria del BASIC per il sistema CP/M, alla quale chiese la licenza dell'interprete BASIC da usare sul PC IBM e un sistema operativo per la macchina.

In quel periodo, la Microsoft vendeva UNIX con la licenza della AT&T ma UNIX nato nel mondo dei minicomputer, aveva bisogno di 100K di memoria per il sistema operativo ed aveva bisogno anche di un disco rigido, mentre la macchina IBM aveva solo 64K di memoria e non era fornita di disco rigido. Gates pensò che l'IBM avrebbe potuto usare il sistema operativo CP/M-86 della Digital Research ma questo era ancora in fase di sviluppo così si rivolse alla Seattle Computer Products che aveva sviluppato un sistema operativo dello stesso tipo del CP/M, chiamato 86-DOS.

La Microsoft acquistò 86-DOS nell'aprile del 1981, assunse il suo autore Tim Paterson per migliorarlo, cambiò il nome del sistema operativo in MS-DOS (MicroSoft-Disk Operating System) e lo vendette all'IBM. Quando fu presentato, nell'agosto del 1981, il PC IBM era dotato del suo sistema operativo, l'MS-DOS. In questo modo veniva garantita l'utilizzabilità della maggior parte del software che girava sull'8080 sotto CP/M in virtù della compatibilità del codice assembler dell'8088 con l'8080.

Nessuno al quel tempo ebbe la percezione della diffusione che il PC IBM avrebbe avuto negli anni seguenti tant'è che all'inizio si pensò al suo impiego per i videogiochi casalinghi con l'utilizzo del monitor TV, invece di uno proprio del PC. Questo spiega la scelta del clock a 4,77 MHz in modo da poter essere compatibile con la frequenza dei televisori degli Stati Uniti. Il PC fu anche equipaggiato di hardware per il controllo di cassette audio (come supporto di memoria) e di joystick (per i giochi) ma nessuno di essi fu realmente utilizzato, soprattutto per la mancanza del software adatto.

Tuttavia, resta il fatto che la scelta dell'IBM di lasciare il PC un sistema aperto fu assai coraggiosa e lungimirante perchè permise, grazie alla pubblicazione del progetto completo, compresi i listati della ROM e gli schemi dei circuiti elettrici, di avere a disposizione la descrizione dettagliata del PC presso i rivenditori. Poterono così proliferare nuovi prodotti hardware e software da aggiungere al PC il quale, composto di parti facilmente reperibili in commercio, potè essere costruito anche da produttori diversi dall'IBM che diffusero sul mercato i cosiddetti cloni IBM-compatibili. Questa enorme profusione di energie e creatività portò al successo del PC e con esso al successo dell'MS-DOS.

Sebbene 1'8088 abbia uno spazio degli indirizzi di 1 Mbyte, l'IBM decise di allocare i primi 640K per la RAM ed la rimanente per la ROM, il video e il resto; di conseguenza l'MS-DOS fu messo a punto per eseguire programmi la cui dimensione massima fosse di 640K. All'inizio ciò non presentò alcun problema, poichè la macchina aveva solo 640K di RAM, ma, quando successivamente furono realizzati modelli con 16 megabyte, l'impossibilità di eseguire programmi più grandi di 640K divenne una grave limitazione.

Un altro aspetto importante del PC IBM è il fatto che esso non ha alcuna protezione hardware. I programmi sono liberi di by-passare il sistema operativo ed accedere direttamente all'hardware, di solito per ottenere prestazioni migliori. Questo modo di programmare ha portato ad un gran numero di programmi scritti male e non portabili.

MS-DOS

La prima versione dell'MS-DOS, uscita nell'agosto del 1981 con il PC IBM, era la versione 1.0, occupava 12K dei 64K della memoria della macchina ed era più o meno compatibile con il CP/M. Il codice sorgente era formato da 4.000 righe di codice assembler. Il solo disco che supportava era un dischetto da 5 1/4 da 164K. Tecnologicamente, questo dischetto rappresentava un importante passo in avanti, poichè la maggior parte degli altri computer al momento usavano dischetti da 8 pollici. I dischetti da 5 1/4 pollici erano chiamati "mini-dischetti" in contrasto con quelli "normali" da 8 pollici.

Il sistema operativo era formato da tre programmi:

A differenza di UNIX, il sistema operativo MS-DOS ha sempre fatto uso di una ROM installata sul PC, chiamata BIOS (Basic Input Output System, sistema di base per l'input/output), contenente i driver per i dispositivi standard cosicchè MS-DOS può gestire l'input/output mediante chiamate al BIOS. Laddove UNIX è fornito di propri driver per l'I/O da terminale, da disco o altra periferica, MS-DOS usa per gli stessi scopi il BIOS e risiede all'inizio dello spazio degli indirizzi di 1 Mbyte dell'8088, non occupando nessuna locazione della RAM, con grande vantaggio per macchine con solo 64Kbyte di memoria.

La versione 1.0 di MS-DOS utilizzava una sola directory (come il CP/M); dopo essersi collegati ed aver digitato dir per elencare il contenuto della directory di lavoro, si vedevano tutti i file del sistema, perchè non c'erano sottodirectory. Al contrario persino la prima versione di UNIX era fornita di un file-system gerarchico. La prima versione di MS-DOS risultava compatibile con CP/M, sebbene rispetto a questo avesse un certo numero di migliorie: maggiori le informazioni sullo stato dei file, maggiore il numero di algoritmi di allocazione del disco, capacità di gestire shell script molto semplici, chiamati batch file.

La Distribuzione di Berkeley

Mentre la Microsoft si apprestava a distribuire, nell'ottobre del 1982, la versione 1.1 di MS-DOS, affinchè fosse possibile l'utilizzo di dischetti da 320K a doppia densità, nel mondo UNIX ci si attrezzava per il grande sviluppo delle reti che sarebbe avvenuto nel decennio successivo. Ad onor del vero va detto che il problema della connessione in rete per i calcolatori che utilizzavano il sistema UNIX si pose fin dall'inizio. Infatti, poichè il porting di UNIX sull'Interdata andava a rilento per motivi logistici dovuti alla diversa dislocazione del PDP-11, l'unica macchina UNIX su cui sviluppare e testare le modifiche del codice, si pensò di connettere elettronicamente più elaboratori insieme. In questo modo la rete UNIX potè mettere radici; dopo l'installazione sull'Interdata UNIX fu "portato" sui VAX e su altri computer.

Dopo la sua privatizzazione la AT&T si sentì libera di consociarsi con un'altra compagnia per la vendita di computer; così in breve tempo, nacque il primo prodotto commerciale di UNIX, il System III. Questo prodotto non ebbe un gran successo per cui, l'anno seguente, fu rimpiazzato da un'altra versione, il System V alle quali seguirono versioni sempre più grandi e sempre più complesse. Anche la Microsoft di Bill Gates partecipò alla distribuzione di questo prodotto, come s'è già detto.

In questo processo svanì anche l'idea originale di UNIX di " essere un sistema semplice ed elegante" per cui, anche se il gruppo di Ritchie e Thompson aveva successivamente prodotto l'ottava, la nona e la decima edizione di UNIX, queste non furono molto usate. Solo alcune delle idee in esse contenute rientrarono nel System V poichè la AT&T aveva profuso tutti i suoi sforzi nella commercializzazione di questa edizione.

Una delle tante università che per prima acquistò la Versione 6 di UNIX fu l'Università di Berkeley in California. La disponibilità del codice sorgente completo diede la possibiltà a Berkeley di modificare sostanzialmente il sistema originario. Utilizzando i cospicui contributi ricevuti dall'agenzia governativa DARPA (Defence Advanced Research Projects Agency), a Berkeley fu possibile produrre e distribuire una versione di UNIX per il PDP-11 migliorata ed aggiornata a cui fu dato il nome di 1BSD (First Berkeley Software Distribution).

Ad essa seguì rapidamente la 2BSD, sempre per il PDP-11, ma le più importanti furono la 3BSD e specialmente la seguente, la 4BSD, per il VAX. Sebbene la AT&T avesse una versione di UNIX per il VAX, chiamata 32V, si trattava sostanzialmente della Versione 7. Al contrario la 4BSD, comprendente le 4.1BSD, 4.2BSD, 4.3BSD e 4.4BSD, incorporava un notevole numero di miglioramenti il più importante fra i quali era l'utilizzo della memoria virtuale e la paginazione, permettendo l'esecuzione di programmi più grandi della memoria fisica, suddivisi in pagine che potevano essere caricate e scaricate dalla memoria secondo le necessità.

Inoltre, si potevano impiegare nomi di file più lunghi di 14 caratteri e anche il file system fu modificato rendendolo più veloce e la gestione dei "segnali" divenne più affidabile. Fu introdotta anche la possibilità dei collegamenti in rete, tramite un protocollo di rete specifico denominato TCP/IP, caratteristico della distribuzione BSD. Si ottenne in questo modo uno standard de facto che diventò in assoluto il più utilizzato rispetto a qualsiasi altro standard ufficiale, persino lo standard ISO/OSI. Dalle connessioni fra elaboratori delle università di California nacque la cosiddetta rete ARPA (arpanet) nota succesivamente come rete internet.

A Berkeley furono aggiunti, inoltre, una certo numero di programmi di utilità per UNIX, compreso il nuovo editor vi e una nuova shell, la csh, i compilatori Pascal e Lisp e molti altri eseguibili. Tutti questi miglioramenti furono il motivo per cui la Sun MicroSystem, la DEC e altre case venditrici di computer basarono le loro versioni di UNIX su quella dell'Università di Berkeley piuttosto che su quella ufficiale della AT&T, System V. Lo UNIX di Berkeley diventò ben noto nel mondo accademico, delle ricerca e della difesa.

MS-DOS Cresce

Anche il sistema MS-DOS si stava diffondendo nel mondo dei microcomputer, specialmente quando, nel marzo del 1983, l'IBM presentò il PC/XT, il suo primo personal computer fornito di disco rigido e la nuova versione 2.0 di MS-DOS. Il taglio netto con il passato fu evidente perchè, anche se venivano utilizzate ancora le chiamate di sistema del CP/M, la Microsoft lo riscrisse interamente integrandolo con molte idee prese a prestito da UNIX. Infatti, a quel tempo, la Microsoft era una delle maggiori case venditrici di UNIX e naturalmente volle provare a far convergere MS-DOS e UNIX.

Per esempio, anche se il sistema di allocazione dei blocchi su disco aveva algoritmi diversi rispetto ad UNIX, il file system di MS-DOS fu basato molto su quello di UNIX, con un piccolo numero di modifiche come l'uso di \ al posto di / in funzione di componente separatore. Inoltre, non essendo un sistema timesharing ma per un singolo utente, non prevedeva nessuno dei meccanismi di protezione di UNIX. Nondimeno erano presenti le chiamate di sistema OPEN, READ, WRITE e CLOSE nella stessa forma di UNIX, utilizzando, cioè, il descrittore di file (assente nella versioni precedenti).

Anche la shell era stata migliorata potendo gestire la ridirezione dello standard input e output con supporto di pipeline e filtri. Nella versione 2.0 di MS-DOS era possibile utilizzare dischetti nel nuovo formato da 360K ed, inoltre, era prevista la possibilità di avere driver di dispositivi installabili dall'utente e di descrivere la configurazione del sistema, lo spool di stampa, la gestione della memoria e la shell personalizzata.

Prelevando da UNIX tutte queste caratteristiche, MS-DOS raggiunse la dimensione di circa 20.000 righe di codice assembler ed eliminò decisamente il CP/M, autodefinendosi il sistema operativo dominante per il PC. Poichè il disco rigido offriva la possibilità di utilizzare molte applicazioni di grosse dimensioni, il PC/XT trasferì l'interesse per i personal computer dall'ambiente casalingo al mondo degli affari. Piccole, medie e grandi imprese cominciarono ad acquistare i PC per scopi produttivi.

Con l'aumentare della domanda per le applicazioni commerciali nel mondo del PC/XT, si passò rapidamente alla versione 2.05, che teneva conto anche dell'ora, della data, della valuta e dei simboli decimali di molte nazioni e che, su qualche estensione, gestiva anche i caratteri cinesi (usando il codice giapponese Kanji a 16bit). La versione 2.1 dell'MS-DOS, prodotta in casa IBM, ebbe scarso successo cosicche la Microsoft, mettendo insieme le versioni 2.05 e 2.1, ottenne la nuova versione 2.11 vendendone milioni di copie.

Nell'agosto del 1984 l'IBM portò sul mercato il PC/AT, il suo primo personal computer basato sull'Intel 286; si trattava di un elaboratore con memoria da 16 megabyte (contro i 640K del PC/XT), aveva modalità utente e kernel, una modalità di protezione ad anelli simile a quella di MULTICS e la capacità di eseguire più programmi contemporaneamente. La versione di MS-DOS montata sul PC/AT era la 3.0 e non supportava nessuna di queste caratteristiche; al contrario girava in una modalità che simulava l'8088 anche se più veloce. Le successive versioni MS-DOS fecero uso della memoria estesa (cioè la memoria oltre 1 Mbyte).

Poichè il PC/AT poteva utilizzare dischetti da 1.2Mbyte, un clock a batteria tampone e l'informazione di configurazione in CMOS, fu aggiunto un supporto per questi dispositivi. Vennero finalmente supportati dischi rigidi più grandi di 10Mbyte e furono introdotti i cosiddetti dischi RAM in cui una parte di memoria veniva usata come disco veloce. Inoltre, l'interprete dei comandi (la shell) fu rimossa dal sistema operativo e realizzata in un programma separato, in modo che gli utenti la potessero sostituire con una versione personalizzata; tutto ciò fece aumentare le dimensioni del codice fino a 40.000 righe.

Dopo la versione 3.0 seguirono molte altre versioni di MS-DOS fino ad arrivare alla versione 6.22 nel 1994. Contemporaneamente Microsoft sviluppò un nuovo sistema, all'inizio basato completamente su DOS ma che differiva da questo solo per l'interfaccia grafica. La prima versione di questo nuovo sistema, chiamato Windows perchè si interfacciava con l'utente per mezzo di un certo numero di finestre, vide la luce nel 1985. Le versioni più recenti di Windows sono diventate possibili grazie alle architetture innovative della INTEL che con la nuova famiglia dei Pentium è arrivata alla realizzazione di CPU con tempi di clock dell'ordine del GHz.

Apple e MacOS

Uno dei motivi che spinse la Microsoft ad introdurre questo nuovo sistema fu dettato dalla necessità di contrastare un altro attore importante che si stava imponendo sulla scena dei microcomputer. La Apple, utilizzando microprocessori della Motorola, era entrata nel mondo dei PC nel 1979 con il suo Lisa nel quale era installato il primo di una serie fortunata di microprocessori, l'MC68000, così chiamato per essere costituito da circa 68000 transistor.

I computer della Apple, i famosi Macintosh, si guadagnarono presto l'interesse dei grafici e grazie ai sistemi Mac OS x.x, che utilizzavano l'interfaccia grafica fin dalle prime versioni, si diffusero sempre di più come computer casalinghi e computer personali nelle università e negli ambienti di ricerca in genere. Quote interessanti di mercato furono guadagnate in ambienti avanzati di produzione industriale e terziario. Lo sviluppo degli elaboratori e dei sistemi operativi, a partire dagli anni '80, è assai complesso e dipende da diversi fattori il cui impatto nello sviluppo attuale è difficile da valutare con cognizione di causa.

Standardizzare

Un altro problema importante che si ha nello sviluppo dei sistemi sia hardware che software è quello della standardizzazione per permettere una migliore convergenza degli sforzi profusi nello sviluppo delle varie architetture. Alcuni di essi vengono sicuramente raggiunti nella definizione, ad esempio, della rete internet oppure del bus PCI utilizzato nei PC. La convergenza, invece, del Mac OS verso UNIX diventa una necessità dettata dalla richiesta di sfruttare al meglio le potenzialità dei processori RISC di ultima generazione prodotti dalla Motorola.

Nella tabella che segue viene proposto una parte dello schema di sviluppo che ha interessato negli ultimi quarant'anni il mondo della computer science e che parzialmente è stato descritto in queste breve rassegna.

anno intel motorola unix dos/windows mac os
1957 BESYS
Bell
1965 MULTICS
Bell+GE+MIT
1969 GECOS
AT&T
1969 UNIX
DEC PDP-7
Thompson-Ritchie
1971 4004 Unix 1° Ed.
1972 8008 Unix 2° Ed.
1972 B --> C
Ritchie
1973 Unix 3° Ed.
1973 Unix 4° Ed.
1974 8080 Unix 5° Ed.
1975 Unix 6° Ed.
Altair
MITS
1975 BASIC
Gates
1975 CP/M
1977 1BSD
1978 8086
8088
2BSD
1979 Unix 7° Ed.
1979 68000 3BSD Lisa
1980 4.0BSD
1981 MS-DOS 1.0
1982 80186 IRIX
Silicon Graphics
MS-DOS 1.25
1982 80286
1983 MS-DOS 2.0
1984 Ultrix
DEC
MS-DOS 3.0
IBM AT
Mac OS 1.x
1984 68020 MS-DOS 3.1
networks
1985 80386 Unix 8° Ed. Windows 1.0 Mac OS 2.x
1983 Xenix System V
8086/8088
1985 GNU Project
MIT
1986 HP-UX-UX 1.0 MS-DOS 3.2 Mac OS 3.x
1986 Unix 9° Ed.
1987 Unix System V 4.0
Sun+AT&T
MS-DOS 3.3
1987 Windows 2.0 Mac OS 4.x
1987 Mac OS 5.x
1988 HP-UX-UX 2.0 MS-DOS 4.0 Mac OS 6.x
1988 HP-UX-UX 3.0 MS-DOS 4.01
1989 80486 68030 Xenix System V
8386
1989 HP-UX-UX 7.0
1989 Unix 10° Ed.
1990 AIX
IBM
Windows 3.0
1991 Solaris 2
Sun
Mac OS 7.0
1991 Linux MS-DOS 5.0
1991 HP-UX-UX 8.0
1991 68040 BSD ALPHA
x386 based
1992 HP-UX-UX 9.0 Windows 3.1
1993 80586
Pentium I
NetBSD 0.8 MS-DOS 6.0
1993 FreeBSD 1.0 MS-DOS 6.2
1993 Windows NT 3.1
1994 Red Hat Linux MS-DOS 6.21
1994 PPC60x NetBSD 1.0 MS-DOS 6.22
1994 Windows NT 3.5 Mac OS 7.5
1995 FreeBSD 2.0 Windows NT3.51
1995 HP-UX-UX 10
1995 4.4BSD Lite
Release 2
Windows 95
1995 Windows NT 4.0
1997 80686
Pentium II
HP-UX-UX 11 Mac OS 7.6
1997 Mac OS 8.0
1998 G3 IRIX 6.5 Windows 98
1998 Solaris 7
1998 FreeBSD 3.0
1999 80686
Pentium III
G4 Windows 98 SE Mac OS 8.6
1999 80686
Celeron
Mac OS 9.0
2000 80786
Pentium IV
FreeBSD 4.0 Windows 2000
2000 Windows ME
2001 Windows XP Mac OS X

Come si può notare anche il mondo UNIX appare molto diviso con diverse versioni di questo sistema che, alla fine degli anni '80, risultavano appartenere a due grandi famiglie, con caratteristiche considerevolmente incompatibili e le cui versioni di riferimento erano la 4.3BSD e il System V Release 3. Inoltre, molti distributori aggiunsero i loro propri miglioramenti. Questa divisione nel mondo di UNIX, insieme con la mancanza di formati standard per l'eseguibile (ancor'oggi visibile) ne impedì il successo commerciale perchè era impossibile scrivere e consegnare programmi UNIX aspettandosi che essi avrebbero girato su qualsiasi sistema UNIX come accadeva, invece, per MS-DOS.

I tentativi di standardizzazione di UNIX inizialmente fallirono tutti. Per esempio, la AT&T mise a punto lo SVID (System V Interface Definition), che definiva le chiamate di sistema, i formati dei file, e così via nel tentativo di allineare tutti i distributori del System V. Questo tentativo non ebbe alcun effetto nel mondo BSD semplicemente perchè si limitò ad ignorarlo.

Il primo tentativo serio di unificare le due versioni di UNIX fu iniziato grazie all'intervento dell'IEEE Standards Board, una corporazione largamente rispettata, molto importante e neutrale. Alla realizzazione di questo lavoro parteciparono centinaia di persone provenienti dall'industria, dalle università ed anche dal governo. Il nome dato collettivamente a questo progetto è POSIX, dove le prime tre lettere significano POrtable Operating System (Sistema Operativo Portabile) e la IX fu aggiunta per ottenere un nome simile a UNIX.

Dopo diverse discussioni, il comitato di POSIX produsse una versione standard conosciuta con il nome 1003.1. nella quale si definiscono un insieme di funzioni di libreria che devono essere fornite da ogni sistema UNIX conforme allo standard. La maggior parte di queste procedure effettua una chiamata di sistema, ma alcune di esse sono fuori dal kernel (nucleo); funzioni tipiche sono open, fork e read. L'idea base di POSIX è che un distributore di software che scrive un programma usando solo le funzioni definite in 1003.1 sa che esso girerà su qualunque versione standard di UNIX.