![]() |
|
Storia dell' InformaticaLa storia dell'informatica può dirsi cominciare, in un senso molto lato, con l'introduzione dell'abaco nel 2000 a.C.; le macchine per calcolare poi non hanno subito per migliaia d’anni particolari modifiche o innovazioni specifiche. Solo nel '600 la tecnica raggiunse un livello tale da permettere la costruzione d’antenati delle odierne calcolatrici: famose rimangono la “pascalina”, progettata da Blaise Pascal.
Ma Babbage realizzò,
nella pratica, solo una piccola parte di
quello che avrebbe voluto. Anche perchè il motore differenziale non
era più la prima delle sue priorità, in quanto egli si stava
dedicando alla “macchina” o “motore analitico” (analythical
engine), suo sogno che, se realizzato, avrebbe anticipato di un
secolo la realizzazione del calcolatore vero e proprio. Tale macchina
prevedeva non più una serie fissa di operazioni ma una
“programmabilità” vera e propria ottenuta attraverso schede
perforate, in modo simile ai “telai programmabili” che si erano
diffusi all'epoca, inventati da J. Jacquard. Il motore analitico
prevedeva anche un'istruzione di salto condizionale, in altre parole
di modifica dell'ordine delle istruzioni in conformità ad una
condizione; Babbage ne prevedeva l'implementazione tramite
l'avvolgimento o il riavvolgimento del nastro secondo la condizione
inserita. Anche questa macchina non fu però mai realizzata, e il
lavoro di Babbage fu dimenticato.
Il concetto della macchina programmabile fu ripreso da Konrad Zuse negli anni '30. Costui realizzò un calcolatore programmabile, ma per inesperienza utilizzò non i sistemi meccanici a ruote (costruiti attorno alla base 10) ma preferì utilizzare i relé, elementi meccanici in grado di essere attivi o spenti. Questo segnò il primo calcolatore che utilizzasse la base 2 invece della base 10, anticipando lo “stato dell'arte” di diverse decine di anni; il lavoro di Zuse fu però sostanzialmente ignorato dalla comunità scientifica di allora. Una curiosità: il governo nazista rifiutò di sovvenzionare i calcolatori della “serie Z” di Zuse perchè la loro realizzazione, secondo i calcoli del Reich, avrebbe richiesto più tempo di quello che il governo tedesco contava di impiegare prima della fine della guerra. Inutile dire che i nazisti, oltre ad aver perso una delle grandi invenzioni di questo secolo, si erano tremendamente sbagliati sul calcolo dei tempi; Zuse non rimase poi in Germania durante la guerra, ma riparò in Svizzera dove continuò il proprio lavoro. Gli
Alleati, invece, non avevano invece sottovalutato l'importanza delle
macchine per il calcolo automatico avrebbero potuto avere nel
conflitto in corso; infatti, fu durante la guerra che venne costruito
uno dei primi veri “computer”; nominato Colosso, ne furono
costruite due versioni (Mark I e Mark II), e della seconda versione
ne furono costruite ben dieci unità. Il lavoro a cui Colosso era
dedicato era la decifrazione dei messaggi nazisti intercettati,
codificati con una macchina chiamata Enigma, di progettazione
americana ma comprata e modificata dai reparti tecnici nazisti.
Colosso era prevalentemente composto da elementi meccanici, ma
incorporava già idee che saranno poi riprese successivamente, come
l'uso dell'elettronica; all'algoritmo di decifrazione avevano
lavorato molti matematici britannici dell'epoca nella base segreta
alleata di Bletchley Park, nella campagna inglese. Il vantaggio
strategico derivante dalla decodifica di Enigma fu enorme: ad
esempio, la marina italiana perse, a causa delle trasmissioni
intercettate, tre incrociatori pesanti e due cacciatorpediniere nella
battaglia di Capo Matapan del 28 marzo 1941; e furono sempre i
messaggi decifrati da Colosso ad aiutare gli Alleati nel progettare
lo sbarco in Normandia, cogliendo impreparati i tedeschi e
capovolgendo le sorti della guerra. Dopo la fine di quest'ultima,
pare sia stato Churchill stesso a ordinare la distruzione di tutte le
copie di Colosso “in frammenti non più grandi di una mano”; la
storia di queste macchine fu declassificata e divulgata dal governo
inglese solo nel 1970, e pertanto in molte fonti non se ne trova
alcuna traccia. Si può però affermare, senza troppe incertezze, che
fu Colosso il primo vero e proprio “computer” elettromeccanico
della storia.
Tra i matematici responsabili della realizzazione dell'algoritmo di decifrazione, usato poi da Colosso, figurava Alan Turing, noto come il “padre della computazione”; a guerra iniziata, a poco meno di trent'anni d'età, era già famoso per aver proposto la sua teoria della macchina universale, un formalismo matematico utilizzato per descrivere e studiare le macchine programmabili, e il concetto di computabilità che legava gli algoritmi ad altre branche già esistenti della matematica, consentendo così di studiare sia la macchina che le operazioni che questa doveva eseguire in termini puramente matematici, facendo così nascere una teoria del calcolo automatico che è uno dei pilastri della moderna informatica teorica. A detta di molti, il lavoro di Turing ebbe per l'informatica un impatto paragonabile a quello che l’impegno d’Einstein ebbe sulla fisica. L'applicazione tecnica dei teoremi da lui creati e d’altri, relativi all'informazione, come quelli formulati da Claude Shannon alla fine degli anni '30, fecero da base alla progettazione e costruzione dei primi computer. L'unico altro computer costruito durante la guerra, se si eccettua Colosso, fu lo Z3 di Konrad Zuse, che non fermò mai le proprie ricerche. Utilizzando i relé, era in grado di effettuare calcoli in virgola mobile con un sistema binario, proprio come i computer moderni. L'unico prototipo di Z3 andò purtroppo distrutto durante la guerra, e la ricerca, al di fuori degli ambienti segretissimi degli Alleati, subì una battuta d'arresto. Con la distruzione di Colosso e la costruzione d’ENIAC alla fine della guerra termina la prima fase della storia dei calcolatori, la “preistoria” dell'informatica. I calcolatori costruiti da ENIAC in poi sono noti come computer della prima generazione e sono i primi veri esempi di computer elettronici e programmabili che il mondo conobbe.
Gli anni '60 sono un punto focale nella storia dell'informatica; molti dei concetti base dell'informatica d’oggi nascono proprio in questo periodo, e sempre in questo periodo inizia quello stimolo verso l'allargamento del mercato che porterà all'inizio degli anni '80 l'informatica a diventare "al dettaglio" e abbordabile a piccole aziende e singoli individui.
Un
particolare di un calcolatore della famiglia System/360 d’IBM Nella seconda metà degli anni '60 iniziarono o si svilupparono moltissimi progetti, linguaggi, concetti. Nel '64 nasce BASIC, uno dei primissimi "linguaggi didattici" che sarà banco di prova per moltissime "nuove leve" della programmazione, ed esce System/360, una linea di macchine di IBM che per la prima volta coniuga sia le esigenze degli utenti scientifici che quelle dell'utenza business; nel '65 esce il PDP-8, il primo vero minicomputer non più grande di un armadio, e inizia il lavoro su un progetto, denominato "Multics", sponsorizzato da ARPA (l'agenzia per i progetti avanzati, legata al Dipartimento della Difesa americana), per realizzare un sistema time-sharing standardizzato (ovvero un insieme di software di supervisione, hardware e linee di comunicazione per l'uso comune), in collaborazione con IBM, Bell Labs., e la Massachusetts Institute of Technology. Nel '67 inizia la commercializzazione molto "spinta" dei sistemi a circuito integrato, segnando l'affermazione definitiva della terza generazione di macchine informatiche. Sul fronte software, è nel '68 che scoppia una "bomba" che sarà destinata a rivoluzionare i metodi di programmazione, e cioè la lettera d’E. Dijkstra pubblicata da Comunicazioni d’ACM del marzo di quell'anno, dal titolo "GO TO Statement Considered Harmful" ("L'istruzione GO TO è da considerarsi pericolosa"), che condannava la programmazione non strutturata esemplificata nell'uso dell'istruzione "GO TO", l'istruzione di salto non condizionato, il cui uso sregolato (dovuto all'assenza della possibilità di creare una struttura nei programmi, isolando le porzioni di codice accomunate da uno stesso scopo o utili per più programmi) portava come conseguenza la creazione di codice di difficilissima comprensione e manutenzione. La discussione innescata dalla lettera di Dijkstra porterà alla progettazione di linguaggi come Pascal (creato da Niklaus Wirth all'Università Politecnica di Zurigo come linguaggio didattico e poi divenuto diffuso anche in ambienti "produttivi" specialmente dalla fine degli anni '70), e il C, linguaggio creato nell'ambito del progetto Unix, iniziato da Bell Labs.; un tale progetto nacque a causa del ritiro di Bell dal progetto Multics, che oramai pochissimi credevano sarebbe stato realizzato nei tempi previsti, e concentrava i propri sforzi più sulla gestione della macchina da parte di ciascun utente che sul controllo del lavoro di ognuno di essi, da cui il nome. Nel '69 ARPA, dalle ceneri del progetto Multics e d’altri progetti a lui collegati, inizia la costruzione e la progettazione d’ARPAnet, una rete che collegasse tra loro più centri militari prima, e di ricerca poi; la struttura d’ARPAnet, che sarà simile a quella che poi sarà d’Internet, è fatta in modo tale da consentire all'intera rete rimanente di funzionare e comunicare anche nel caso cadano uno o più nodi (utile in caso un attacco nucleare sovietico che distruggesse una o più intere città). Il sistema operativo (operating system) è un insieme di programmi che governa e controlla l’uso delle componenti del sistema di elaborazione permettendo all’utente un utilizzo trasparente ed efficace delle risorse disponibili. Con il termine risorsa si intende un elemento che può essere hardware (cpu, memoria centrale) o software (dati, programmi) Tramite questi sistemi operativi è stato possibile caricare in memoria centrale il programma da eseguire, attivare la cpu, richiedere la lettura di un dato memorizzato su memoria di massa, effettuare delle stampe. Un’altra funzione del sistema operativo è quella di ripartire una risorsa che è fisicamente limitata fra le tante richieste possibili. Queste funzioni sono esportate tramite le politiche di gestione che definiscono le norme scelte per una gestione razionale delle risorse. Possiamo affermare che un sistema operativo: -funziona come interfaccia tra l’utente e l’hardware della macchina che in modo che l’utente non debba interagire direttamente con l’elaboratore.. -gestisce
le risorse del sistema (cpu, memoria centrale, periferiche,
informazioni) rispettando le politiche di gestione.
Struttura e funzionamento dei sistemi operativi Macchine
virtuali Il
grado
di potabilità di un sistema operativo indica la possibilità di
utilizzare il sistema operativo stesso su macchine con hardware
diverso. Modalità di funzionamento Non tutti i programmi che costituiscono il sistema operativo possono risiedere contemporaneamente in memoria centrale solo il cuore del sistema operativo è sempre residente in memoria centrale.
Il modo di operare di un sistema operativo relativamente all’uso della cpu e all’elaborazione dei processi abbiamo le seguenti categorie: sistemi in monoprogrammazione, sistemi multiprogrammazione e sistemi in time sharing. Nell’elaborazione a lotti i fati necessari all’elaborazione sono accumulati in una memoria ausiliaria durante un certo periodo di tempo. L’elaborazione interattiva permette di colloquiare con il programma in esecuzione. L’uso di terminali consente all’utente di lavorare dal proprio posto di lavoro, come se l’unità centrale fosse solo a sua disposizione: in realtà più utenti vengono serviti ripartendo fra di loro le risorse del sistema. I sistema in monoprogrammazione sono quei sistemi che permettono l’esecuzione di un solo programma utente alla volta. Il sistema operativo deve caricare il programma in memoria centrale, inizializzare i registri per l’esecuzione ed è responsabile delle operazioni d’ingresso e uscita dei dati. I sistemi di multiprogrammazione sono quei sistema operativo che permettono di allocare più programmi utente in memoria centrale e di ripartire fra questi l’uso delle risorse. Per rendere indipendente la cpu dell’attività di ingresso e uscita dei dati sono stati introdotti gli elaboratori di canale che sono piccoli elaboratori in grado di eseguire le operazioni di trasferimento dei dati fra la memoria centrale e le periferiche e viceversa. Un particolare caso di multiprogrammazione è il multitasking. Particolarmente diffuso nei sistemi dedicati attuali, permette al sistema di elaborare più applicazioni (task) contemporaneamente. Il time slice è un periodo durante il quale la cpu lavora x un programma. Quindi se la cpu è gestita in time sharing essa rimane assegnata ad un programma finche: -il programma non termini, -il programma richiede un’operazione di I/O (input, output), -scade il time slice.
Prestazioni di un sistema operativo %CPU indica in percentuale il tempo d’utilizzo della cpu in rapporto al tempo di lavoro di tutto il sistema. Tcpu = tempo di lavoro della cpu %cpu= tcpu/Ttotale Ttotale = tempo I/O + Tcpu È necessario evitare che il sistema cada in system overhead situazione nella quale la percentuale d’utilizzo della cpu per eseguire programmi di sistema è troppo alto rispetto a quella dedicata all’elaborazione dei programmi utente.
Gestione del processore - nucleo del sistema operativo La componente principale dell’elaboratore a anche la più costosa, è la cpu (central processing unit). Tutti i programmi hanno bisogno della cpu per essere eseguiti. Di particolare importanza è la parte del sistema operativo che si occupa dell’assegnazione della cpu ai singoli lavori che ne richiedono l’uso. Le funzioni che questi moduli devono svolgere sono: -mantenere aggiornato lo stato del processore (libero/occupato), -decidere a quale processo assegnare il processore quando se ne presenti la necessità, -assegnare il processore al processo (quello scelto), -riprendere il controllo del processore quando il processo è terminato o sospeso. Programma è la descrizione delle istruzioni che devono essere svolte. Processo è un programma in esecuzione. La gestione dei processi è affidata a quei moduli del SO che formano il nucleo (kernel) e che sono sempre residenti in memoria centrale. Fanno parte del nucleo: schedulatore dei lavori, schedulatore dei processi, controllore del traffico, gestore delle interruzioni, procedure di sincronizzazione e comunicazione tra i più processi necessarie per lo scambio di dati e informazioni Ogni stato corrisponde ad una situazione in cui si trova il programma da eseguire (è in esecuzione, è nell’attesa della stampante ecc..) il passaggio da uno stato all’altro è deciso dal sistema operativo sulla base delle politiche di schedulazione. Ad ogni passaggio corrisponde una transazione che è effettuata tramite l’esecuzione di uno specifico programma del sistema operativo Un lavoro può trovarsi in uno dei seguenti stati: Hold = il lavoro è esposto al sistema. Esso è durante l’attesa d’esecuzione e si trova in memoria di massa Ready = il programma è diventato processo e si trova in memoria centrale pronto per essere eseguito Run = il processo è in esecuzione Wait = il processo è nell’attesa End = il processo è terminato Per poter compiere queste operazioni lo schedulatore accede alla lista di hold che contiene un JCB (job control block) per ogni programma in questo stato. Generalmente uno JCB contiene: l’identificato del programma, l’occupazione espressa in Kbyte, l’indirizzo di caricamento su memoria di massa, gli identificatori delle periferiche e il puntatore al JCB successivo. Una volta individuato il programma da caricare un altro modulo del sistema operativo elimina l suo JCB dalla lista di hold e inserisce un nuovo PCB (process control block) nella lista di ready. Generalmente un PCB contiene: lo stato in cui si trova il processo, l’identificatore del processo, il registro di salvataggio, l’indirizzo di caricamento in memoria centrale, gli identificatori delle periferiche, I file aperti, il puntatore al PCB successivo. |
|