Dispense per il corso di terza area Com’è fatto l’hardware La macchina di Von Neumann Sostanzialmente tutti i computer sono realizzati sulla base allo schema proposto nel 1946 dallo scienziato John Von Neumann. La macchina di Von Neumann è composta come illustrato nella figura seguente. La macchina di Von Neumann è costituita da cinque elementi funzionali che svolgono un ruolo specifico. Memoria interna Contiene tutto il necessario all’esecuzione di un programma: i dati e le istruzioni. Spesso indicata con l’acronimo RAM, dall’inglese Random Access Memory, che potrebbe essere tradotto come memoria ad accesso diretto; viene anche detta memoriacentrale. Un programma in esecuzione deve essere contenuto nella memoria centrale. È di tipo volatile, ossia perde il suo contenuto quando il computer viene spento. Bus di sistema Ha la funzione di connettere tra loro gli altri elementi funzionali permettendo un scambio di dati fra questi. Unità centrale di elaborazione o processore Svolge le elaborazioni e controlla il trasferimento dei dati e programmi tra le altre componenti. È l’elemento funzionale che esegue i programmi. Spesso è chiamata CPU, acronimo inglese di Central Processing Unit. Memoria esterna Contiene dati e programmi in forma persistente, ossia indipendentemente dallo stato di acceso o di spento del computer. Solitamente indicata come memoria di massa perché la sua capacità è tipicamente molto più grande di quella della RAM. Ha tempi di accesso molto più lenti di quelli della RAM. Interfaccia alle periferiche È la parte che gestisce tutte le periferiche di comunicazione con l’ambiente esterno. Si noti che le periferiche, ad esempio tastiera video o mouse, sono considerate dispositivi distinti dal computer. La memoria centrale La memoria centrale è costituita da una sequenza ordinata di celle che sono in grado di memorizzare una parola (word) e che sono identificate univocamente da un indirizzo. Il numero di bit che compone una parola dipende dall’architettura del computer, solitamente è di alcuni byte (8 bit). Le lunghezze di parola più comuni sono uno, due, quattro oppure otto byte. Ogni cella di memoria ha un indirizzo predefinito, e rappresenta l’unità minima di memoria che la CPU riesce a accedere. La CPU è responsabile della gestione dei dati contenuti nella RAM. Il numero di volte che ogni singola cella può essere letta o scritta è sostanzialmente illimitato. Ogni singola cella può essere acceduta direttamente per mezzo del suo indirizzo univoco, per questo la RAM prende anche il nome di memoria ad accesso diretto. La traduzione letterale dall’inglese può essere fuorviante, perché un accesso casuale alla memoria sarebbe completamente inutile. Le celle di memoria sono realizzate tramite dispositivi a semiconduttori, ossia con tecnologia basata su transistor, e hanno bisogno di essere continuamente alimentate da energia elettrica per preservare il loro contenuto. Una mancanza di alimentazione comporta la perdita del contenuto della RAM, che quindi è detta anche memoria volatile. Il contenuto della memoria al momento dell’accensione del computer non è significativo. Il bus di sistema Il bus connette tra loro, in modo sincrono, le altre unità funzionali. Ad ogni quanto di tempo il bus connette tra loro due unità funzionali, una invia e l’altra riceve. Il bus è controllato dalla CPU. Le varie unità funzionali connesse al bus entrano in funzione solo quando sono selezionate dalla CPU. Il bus di sistema è costituito da tre tipologie di connessioni elementari specializzate: bus dati: fa transitare sia il contenuto del registro dati dalla CPU a una delle altre unità funzionali, sia da una di queste al registro dati della CPU; bus indirizzi: fa transitare dalla CPU verso la memoria l’indirizzo della parola che viene acceduta; bus controllo: fa transitare dalla CPU a una delle altre unità funzionali il codice della operazione da eseguire, e dalla unità funzionale il codice risultato dell’operazione. La presenza di più linee di connessione elementari per ogni tipo di bus permette la trasmissione contemporanea dei bit, ossia uno per ogni linea in uno stesso quanto di tempo. Se il bus non ha sufficienti linee di connessione, è costretto a effettuare più trasmissioni, una per ogni quanto di tempo. Nella figura seguente le linee di indirizzo connettono solamente il processore e la memoria interna, e sono rappresentate con una linea continua, le linee di dati e controllo connettono tutte le componenti della macchina e sono rappresentate, rispettivamente, con una linea tratteggiata e una linea punteggiata. La CPU La figura seguente mostra i principali elementi costitutivi di una CPU. Unità di controllo Regola l’esecuzione del ciclo della CPU, e invia i segnali di controllo per i trasferimenti sul bus. Decodifica le istruzioni e gestisce sia i trasferimenti all’interno della CPU sia quelli con il mondo esterno. Orologio o clock Stabilisce l’ampiezza del quanto di tempo, ossia la frequenza di sincronia del sistema. Unità logico aritmetica, ALU (Arithmetic Logic Unit) Realizza le operazioni aritmetiche e quelle logiche. In figura è mostrata una ALU con due operandi capace di eseguire una delle quattro operazioni aritmetiche in un quanto di tempo. Il risultato dell’operazione viene memorizzato nel registro A. Registri Sono memorie locali che possono essere accedute alla velocità del clock della CPU, mentre quelle della RAM sono accessibili alla velocità del clock del bus, solitamente molto più lento, attraverso le operazioni di lettura e scrittura descritte in precedenza. I registri principali sono: registro dati (RD): già descritto in precedenza, ha un numero di bit prefissato che coincide con una parola della memoria centrale; registro indirizzi (RI): già descritto in precedenza, ha un numero di bit prefissato che coincide con l’indirizzo massimo accessibile in memoria. Si noti che non sempre il computer è dotato di tutta la RAM indirizzabile; registro istruzione corrente (RIC): contiene l’istruzione in esecuzione nel quanto di tempo corrente, ha la stessa lunghezza di una parola della memoria centrale; contatore di programma (PC): contiene l’indirizzo in memoria centrale relativo alla prossima istruzione da eseguire, ossia quella che verrà letta all’inizio del prossimo ciclo della CPU. Ha la stessa lunghezza del registro indirizzi; registro interruzioni (RINT): contiene alcune dati relativi allo stato di alcune periferiche, come si vedrà successivamente; registri operandi: contengono gli eventuali operandi e risultato dell’istruzione in esecuzione. Nell’esempio sono indicate con A e B; registro di stato (RS): contiene indicazioni sulle operazioni svolte dalla ALU, quali, ad esempio: o il risultato è troppo grande per essere rappresentato, overflow dell’operazione; o segno del risultato se l’operazione è andata a buon fine; o in A c’è un valore nullo; o l’operazione ha generato un riporto. La memoria di massa Non è strettamente necessaria al funzionamento della macchina di Von Neumann, quindi potrebbe anche essere considerata una periferica. Questa trattazione presenta la memoria esterna come elemento funzionale nel modello della macchina perché altrimenti questa sarebbe risultata priva di una componente indispensabile dal punto di vista della sua utilizzabilità. La caratteristica della memoria di massa è di essere permanente, ossia di conservare il proprio contenuto anche quando il computer viene spento. Solitamente la memoria di massa ha una capacità molto più grande di quella della memoria centrale. I tempi di accesso al contenuto della memoria di massa sono molto più lenti rispetto a quelli della memoria centrale. La memoria magnetica Storicamente la prima forma di memoria di massa nei personal computer è stato il floppy disk. Dal punto di vista tecnologico il floppy disk conserva i bit tramite magnetizzazione, assegnando un valore binario ad ognuno dei due poli. Strutturalmente un floppy disk è un disco forato al centro con la superficie magnetizzabile. Il disco ruota sul suo asse e una testina di lettura/scrittura può muoversi radialmente su di esso per mezzo di un braccio meccanico che la sostiene. La testina si muove a scatti, posizionandosi solamente sulle tracce. Affinché un floppy disk possa essere utilizzato per la memorizzazione deve contenere dei riferimenti, che vengono registrati tramite l’operazione di inizializzazione, in inglese format. L’inizializzazione registra sulla superficie magnetica dei settori radiali, tutti della stessa ampiezza angolare. Le tracce, invece, sono concentriche e intersecano i settori a formare i blocchi, ogni blocco ha un indirizzo e può contenere alcune centinaia di byte. La scrittura di dati su disco può occupare diversi blocchi, per questo ogni disco ha un indice, in inglese FAT (File Allocation Table), che indica il primo blocco che contiene i dati. Ogni blocco indica il suo successore, sino all’ultimo blocco, che non ha successori. L’insieme dei blocchi che immagazzina un insieme di dati prende il nome di file. Sia i dati che i programmi sono quindi memorizzati su floppy sotto forma di file. Hard disk Il disco rigido, o hard disk, è una estensione del floppy disk. Dal punto di vista strutturale un disco rigido è una pila di dischi leggermente distanziati tra loro, ognuno dei quali è organizzato in tracce e settori. I dischi ruotano su un asse comune (coassialmente) e sono letti e scritti da un gruppo di testine solidali tra loro. La meccanica di un disco rigido è molto più precisa e delicata rispetto a quella di un floppy disk, quindi il gruppo dischi e testine è sigillato in un contenitore che li protegge dagli agenti esterni. Il vantaggio di memorizzare i file secondo lo schema dei blocchi concatenati tra loro, come descritto in precedenza per i floppy disk, permette la flessibilità della memorizzazione sia nel numero di file che nella loro dimensione. Tipicamente un file di dati può variare di dimensioni tra i diversi salvataggi in memoria di massa. Nel caso di un aumento di dimensioni del file alla catena originaria di blocchi ne vengono accodati quanti sono necessari a contenere il nuovo file. Nel caso un file subisca una riduzione i blocchi superflui verrebbero messi nuovamente a disposizione per un uso successivo. Anche il numero di file che una unità di memoria di massa può contenere è variabile, ed è limitato solo dal massimo numero di indici contenibili nella sua FAT. Controller Sia i floppy disk che i dischi rigidi sono unità indipendenti dalla CPU, nel senso che la CPU effettua operazioni di lettura e scrittura di file senza minimamente avere nozione di quali e quanti blocchi questi occupino su disco. Una interfaccia apposita, il controller, provvede a gestire il flusso di dati da e verso la CPU. CD, DVD e altre memorie di massa Supporti ottici Il principio fisico di immagazzinamento dei bit nei supporti ottici, quali ad esempio CD e DVD , si basa sulla luce laser. Il disco presenta delle zone opache ed altre riflettenti, un raggio laser può essere assorbito o riflesso da queste superfici, codificando in questo modo le due cifre binarie. La rotazione del disco espone al raggio laser, nel tempo, una porzione piuttosto ampia della sua superficie. I CD per la memorizzazione di dati sono prodotti con la stessa tecnologia di quelli musicali, e possono contenere sino a 0.8 GByte. I CD si dividono in due categorie principali: riscrivibili e registrabili. I CD-ROM sono registrabili e possono essere scritti una sola volta; vengono spesso utilizzati per le copie di archiviazione di dati e programmi, i cosiddetti backup. I CD riscrivibili, detti CD-RW, possono essere cancellati e registrati numerose volte. I tempi di accesso ai dati non sono comunque paragonabili a quelli di un disco rigido, ma sono molto più alti. I DVD sono dischi ottici di grande capacità, normalmente possono contenere sino a 4.7 GByte di dati. Sfruttano una tecnologia più evoluta di quella dei CD, ma il principio di funzionamento è analogo. Nastri o cassette Sono nastri magnetici il cui principio di funzionamento è simile a quello dei nastri audio e video. Un nastro ricoperto di materiale magnetizzabile viene fatto scorrere a contatto di una testina di lettura-scrittura. I file vengono memorizzati in sequenza su porzioni di nastro. La differenza principale dai supporti rotanti è il tipo di accesso ai dati, che è sequenziale. Per leggere un certo file occorre leggere anche tutti i file sul nastro che lo precedono nella registrazione. Un’altra differenza è nella flessibilità sulla dimensione dei file, aumentare la dimensione di un file potrebbe significare riscriverlo in fondo al nastro, portando alla inutilizzazione di parte del nastro. Nel caso di riduzione della lunghezza del file si potrebbe sprecare la parte del nastro non più occupata. Le porte di comunicazione Sono collegamenti a cui vengono collegate periferiche, solitamente per mezzo di cavi. Seriale e parallelo I bit di una parola possono essere trasmessi verso le periferiche, o da queste verso la CPU, contemporaneamente in un intervallo (un "quanto") di tempo, oppure uno per volta, in tanti intervalli di tempo quanti sono i bit della parola. Nel primo caso si parla di connessione parallela, nel secondo di connessione seriale. Entrambe queste connessioni solitamente permettono un collegamento uno-a-uno tra il computer e la periferica. Le porte seriali sono spesso identificate con la sigla RS-232-C, e sono utilizzate per il collegamento ad alcuni tipi di stampanti, a modem e, in generale, a dispositivi esterni. Un collegamento seriale utilizza due linee per la trasmissione e la ricezione, e invia un bit per volta. Le porte parallele, spesso chiamate centronics, sono utilizzate per il collegamento a stampanti e ad alcuni dispositivi di memorizzazione esterni. Un collegamento parallelo trasmette un numero maggiore di uno di bit (ad esempio otto) per volta, risultando solitamente più veloce di quelli seriali. Alcuni dispositivi esterni sono connessi al computer tramite collegamento SCSI (Small Computer System Interface) che offre la possibilità di collegare in cascata diverse periferiche alla stessa porta del computer, tipicamente fino ad un massimo di otto periferiche. Questo tipo di connessioni inizia ad essere in disuso. USB e firewire Queste tipologie di connessione condividono diverse caratteristiche: permettono la connessione in cascata di dispositivi, anche di alcune centinaia; sono molto più veloci delle porte seriali e parallele; permettono di aggiungere e rimuovere periferiche con il meccanismo detto di hot plugin, ossia con il computer acceso; possono alimentare di energia elettrica le periferiche connesse. Le porte USB permettono di collegare in cascata fino a 127 periferiche, sono utilizzate per dispositivi che non necessitano il trasferimento di grosse quantità di dati. Il collegamento firewire, noto anche come IEEE 1394, permette di collegare in cascata sino a 63 dispositivi, e offre una capacità di trasmissione adatta a supportare il traffico di grosse quantità di dati, quali, ad esempio, quelli generati da dischi rigidi, telecamere e fotocamere. Wireless (senza fili) Alcune nuove tecnologie permettono di collegare il computer ad alcune periferiche senza ausilio di cavi. Tra queste tecnologie ricordiamo Bluetooth, che viene utilizzata per il collegamento di periferiche vicine, quali telefoni cellulari o stampanti, e quella cosiddetta Wi-Fi, che utilizza onde radio per connessioni di media distanza. Principali periferiche di input/output Periferiche di Input Sono periferiche che permettono di inviare dati e comandi al computer. Tipicamente queste periferiche sono di carattere asincrono rispetto all’orologio di sistema. Quando una periferica di input ha necessità di inviare dati al computer, segnala con un interrupt alla CPU il suo stato. La CPU che riceve un interrupt di input può sospendere temporaneamente l’attività in corso per soddisfare la richiesta della periferica e successivamente riprendere l’elaborazione sospesa. Le più comuni periferiche di input sono: Tastiera e mouse sono i dispositivi di input più utilizzati. Vale la pena sottolineare che un esperto dattilografo è in grado di scrivere alla velocità di poco più di cento battute al minuto, mentre la CPU ha un orologio interno con una frequenza dell’ordine di grandezza del miliardo di oscillazioni al secondo; joystick: concettualmente sono simili ad un mouse e permettono di spostare il cursore sullo schermo; tavolette grafiche e touch screen: riconoscono la pressione di una penna speciale o delle dita su di una superficie. Spesso sono collegati a programmi per riconoscere la calligrafia dell’utente; scanner: permettono l’acquisizione di immagini con un meccanismo molto simile a quello delle fotocopiatrici. Se l’immagine scandita è una pagina di testo, questo può essere riconosciuta come tale per mezzo di appositi programmi, i cosiddetti OCR (Optical Character Recognition); riconoscimento vocale: l’utente impartisce i propri comandi tramite un microfono e il test parlato viene riconosciuto come se fosse digitato da tastiera. Periferiche di output Sono le periferiche che mostrano all’utente l’esito delle elaborazioni. Le due periferiche di output per antonomasia sono lo schermo e la stampante. Saranno analizzate nelle prossime pagine. Discretizzazione grafica Le immagini sono un esempio eclatante degli effetti della discretizzazione imposta dall’uso del computer. Una qualsiasi figura geometrica che dovessimo immaginare sarebbe quasi sicuramente un oggetto "continuo", sia perché lo spazio è continuo, sia per nostra consuetudine mentale. Con l’utilizzo del computer, invece, il concetto di "continuo" può al più essere approssimato con una sua interpretazione discreta (discretizzazione). Immaginiamo di voler disegnare con una matita su un foglio di carta un segmento che congiunge due punti. Indipendentemente dall’inclinazione risultante il segmento viene sempre della stessa forma e dimensione. In questo caso la discretizzazione si effettua immaginando di sovrapporre al foglio da disegno un reticolo di quadretti isomorfi. Ogni segmento può quindi essere rappresentato annerendo i quadretti più vicini al segmento ideale, uno per ogni coordinata lungo l’asse con cui il segmento forma un angolo minore. La figura seguente mostra la discretizzazione di diversi segmenti, della stessa lunghezza, inclinati differentemente. Si noti che i segmenti nel continuo sono di lunghezza uguale tra loro, ma che al variare della loro inclinazione rispetto agli assi può cambiare il numero di quadratini utilizzati per rappresentarli nella nostra discretizzazione. Quando il segmento è orizzontale o verticale viene rappresentato con 13 quadratini, quando è inclinato il numero di quadratini varia da un minimo di 9 a un massimo di 12. Anche la forma assunta dalla sequenza di quadratini, pattern, cambia con l’inclinazione dei segmento. La circonferenza viene rappresentata con gli stessi quadratini che verrebbero disegnati volendo rappresentare un ottagono regolare. Gli assi cartesiani sono quelli di uno schermo, e hanno l’asse delle ordinate che punta verso il basso e non verso l’alto come accade usualmente. Lo zero del sistema di riferimento è posto in alto a sinistra rispetto alla quadrettatura del foglio. Schermo Pixel Nel caso del video di un computer i quadratini dell’esempio precedente prendono il nome di pixel, dall’inglese picture element. Il pixel è la minima unità disegnabile su di uno schermo, può assumere diversi colori, ma non può essere acceso solo in parte. In un certo senso il pixel è una entità binaria. In qualsiasi forma di discretizzazione a video di elementi grafici i pixel svolgono un ruolo fondamentale. La risoluzione di uno schermo è il numero di pixel nell’unità di misura. Maggiore è questo numero, minore si noteranno i singoli pixel, ossia minore sarà l’effetto "calettatura" dato dalla discretizzazione. La risoluzione si misura in dpi, ossia dots per inch. CRT Nei monitor a raggi catodici, CRT dall’inglese Cathode Ray Tube, ogni singolo pixel è formato dalla convergenza di tre fasci di elettroni, di diversa intensità, che attivano fosfori di tre colori base per formare il colore del pixel. La tecnologia utilizzata è la stessa dei televisori, ma con una maggiore risoluzione. La risoluzione varia dai 72 ai 96 dpi. I CRT sono molto ingombranti e pesanti e consumano molta energia, ossia scaldano. Questa tecnologia sta cedendo il passo alle altre, tranne che in alcuni settori di nicchia. LCD Sono formati da tre sottili strati colorati e semitrasparenti, ogni pixel è dato dalla sovrapposizione dei pixel corrispondenti su ogni strato colorato. La geometria del singolo pixel è particolarmente precisa, a differenza di quanto accade per i CRT, dove la convergenza dei tre fasci luminosi può risultare non molto accurata. La risoluzione può andare oltre i 100 dpi. Consumano pochissimo, sono sottilissimi e il loro costo sta rapidamente decrescendo. Plasma Sono formati da due pannelli di vetro che racchiudono dei gas tra loro. Quando i pannelli vengono alimentati elettricamente generano raggi ultravioletti che stimolano fosfori dei colori di base. Attualmente vengono utilizzati per grandi pannelli. Stampante Le stampanti sono il dispositivo di output più utilizzato dopo lo schermo. Ci sono diverse tecnologie per stampare su carta e diversi formati di carta. La risoluzione di una stampante si misura in dpi. La risoluzione di una stampante è solitamente molto maggiore a quella di uno schermo. Laser La tecnologia delle stampanti laser si basa su un cilindro rotante, detto tamburo, illuminato da un sottile raggio laser. Nel punto in cui il raggio laser colpisce il tamburo si genera una carica elettrostatica che attrae un inchiostro in polvere, detto toner. Ogni punto lasciato dal raggio laser sul tamburo produrrà un punto come risultato finale su carta. A seguito di pressione e calore il toner viene trasferito dal tamburo alla carta. La risoluzione di una stampante laser può andare dai 300 ai 2400 dpi. Getto di inchiostro Le stampanti a getto d’inchiostro utilizzano micro-gocce di inchiostro per ogni punto che vogliono lasciare sulla carta. Un carrello fa muovere orizzontalmente la testina di stampa sul foglio di carta che avanza in modo da poter disegnare punti in qualsiasi posizione del foglio. Impatto Un martelletto di una testina di stampa batte su un nastro inchiostrato che a sua volta batte sul foglio di carta lasciando un’impronta. Il movimento della testina di stampa e del foglio di carta è analogo a quello delle stampanti a getto di inchiostro. Il martelletto può avere una forma predefinita, oppure essere formato da una matrice di aghi, 9 o 24, che sporgono o si ritraggono per formare la porzione di foglio da stampare. Classificazione dei computer Lo schema seguente riporta una possibile classificazione dei computer in base alla potenza di calcolo. Tale schema non è esatto e rigido, viene presentato solo come possibile riferimento. Supercomputer Sono i più potenti computer disponibili. Possono contenere da qualche migliaio a diverse centinaia di migliaia di processori, e sono in grado di svolgere 1015, ossia un milione di miliardi di operazioni al secondo. Vengono utilizzati per elaborazioni che richiedono un enorme quantitativo di calcoli, quali, ad esempio, previsioni del tempo, progettazioni di velivoli o simulazioni di realtà complesse, ad esempio in cinematografia. Hanno costi che possono arrivare alle decine di milioni di euro. Mainframe Sono una tipologia di computer che era molto diffusa alcuni anni addietro. Solitamente sono impiegati da grosse organizzazioni che gestiscono, con continuità, grandi quantità di dati. Hanno costi che possono arrivare a qualche milione di euro. Per la loro gestione è necessario un gruppo di personale specializzato. Spesso gli utenti accedono al mainframe per mezzo di terminali, ovvero piccoli calcolatori periferici connessi da una rete di comunicazione. Workstation Questa tipologia di computer è stata introdotta negli anni ottanta. Eroga una potenza di calcolo inferiore a quella di un mainframe, con prezzi più bassi e minore richiesta di risorse. Viene utilizzato nella progettazione o nella produzione assistita al computer, rispettivamente CAD, Computer Aided Design, e CAM, Computer Aided Manifacturing. I costi delle workstation sono dell’ordine di grandezza delle decine di migliaia di euro. Le prestazioni della fascia bassa di questa categoria si sovrappongono a quelle di punta dei personal computer. Personal computer Computer di costo e dimensioni contenuti, introdotti all’inizio degli anni ottanta, adatto all’uso personale sia domestico che lavorativo. Il costo è dell’ordine di grandezza di alcune migliaia di euro. Alcuni personal computer sono portatili, ossia hanno dimensioni e peso che permettono all’utente di trasportarli manualmente e frequentemente. Appartengono a questa categoria anche i PDA, personal digital assistant, gli smartphone e i palmari. Microcontroller Sono i computer invisibili, ossia quelli che vengono utilizzati per governare il funzionamento di un altro strumento. Il loro costo è una frazione minimale di quello dello strumento nella sua interezza. Schema a livelli gerarchici La figura seguente rappresenta le relazioni fra le diverse entità analizzate sino ad ora. Ogni elemento della figura ha una interfaccia con quelli che gli sono a contatto. Possiamo pensare che l’interazione possa avvenire solo attraverso i piani orizzontali. In basso l’hardware fornisce supporto a tutto il resto, esso contiene il firmware, che è la parte di astrazione più vicina al software. Lo strato successivo è il sistema operativo, che "maschera" completamente l’hardware sottostante, ossia l’insieme hardware e sistema operativo costituisce una macchina astratta che ha l’interfaccia agli strati superiori fornita dal sistema operativo. Al livello più alto troviamo l’utente che interagisce direttamente con il sistema operativo oppure possono esserci diversi programmi. I programmi si appoggiano all’interfaccia del sistema operativo e forniscono a loro volta un’interfaccia di più alto livello all’utente, ossia una nuova macchina astratta. Linguaggi di programmazione L’unico linguaggio che il computer è in grado di comprendere ed eseguire è il linguaggio macchina, di cui c’è un semplice esempio nelle pagine precedenti. Il linguaggio macchina è molto lontano dal modo di esprimersi degli umani, quindi risulterebbe molto difficile scrivere programmi direttamente come sequenze di zero e uno. Assembler I primi computer erano programmabili solo in linguaggio macchina, successivamente venne introdotto un linguaggio che permettesse di scrivere i programmi per mezzo del codice delle istruzioni, invece che con l’istruzione vera e propria. Tale linguaggio prese il nome di assembler. Occorreva però tradurre un programma dall’assembler, leggibile da un umano, al linguaggio macchina, comprensibile dal computer. Per questo scopo fu ideato un programma detto assemblatore, che prendeva come input un file contenente il programma scritto in assembler, detto codice sorgente, e produceva come output un altro file contenente il corrispondente programma in linguaggio macchina, detto codice oggetto. Linguaggi di alto livello Il linguaggio assembler, pur essendo analizzabile e definibile dall’uomo, è molto vicino all’hardware e richiede la descrizione dettagliata della sequenza di operazioni elementari necessarie a svolgere un compito. Un linguaggio con un più alto livello di astrazione fornisce un insieme di istruzioni elementari molto più complesse rispetto all’assembler. I linguaggi procedurali offrono questo tipo di astrazione. Una singola istruzione elementare in linguaggio procedurale coinvolge un grande numero di istruzioni, sia in assembler che in linguaggio macchina. Un linguaggio offre un’astrazione di computer, ossia un computer più semplice e potente dell’hardware effettivamente utilizzato. Gli insiemi di istruzioni elementari messe a disposizione dai linguaggi procedurali possono variare sensibilmente tra loro. I linguaggi procedurali sono specializzati alla soluzione di problemi in ambiti specifici, per cui offrono un’astrazione dedicata. Tra i linguaggi procedurali ricordiamo: il FORTRAN, ideato alla fine degli anni ’50 e tuttora in uso, per la risoluzione di problemi scientifici; il COBOL, coevo del FORTRAN, indirizzato alla risoluzione di problematiche di tipo commerciale e gestionale; il C, ideato ai primi degli anni ’70, per implementare sistemi operativi; il Pascal, dei primi anni ’70, per la didattica della programmazione; Java, degli anni ’90, per la programmazione di carattere generale. Traduzione di un programma Uno dei vantaggi offerti dai linguaggi procedurali è quello di essere "distanti" dai dettagli del linguaggio macchina, ossia dalla piattaforma hardware-software in uso. Un linguaggio procedurale fornisce un’astrazione piuttosto indipendente dal computer in uso e più facilmente trasportabile da un tipo di computer ad un altro rispetto al linguaggio macchina. Uno stesso programma in linguaggio procedurale può essere tradotto nei linguaggi macchina dei computer in uso affinché questi lo eseguano. Compilatori e Interpreti Ci sono due modi per tradurre un programma dal linguaggio procedurale all’assembler. Un compilatore traduce completamente il programma e lo memorizza in un file. L’esecuzione del programma tradotto comporta il suo preventivo caricamento in memoria. Una volta tradotto il programma può essere eseguito indipendentemente dal compilatore e la velocità di esecuzione sarà la massima possibile per il computer in uso. Un interprete esegue la traduzione nel corso dell’esecuzione del programma: ogni istruzione viene prima tradotta e poi eseguita. Il processo di traduzione quindi rallenta l’esecuzione complessiva del programma, ma permette molta flessibilità nel corso di scrittura del programma. Cos’è un sistema operativo? Definizione: Un sistema operativo è un programma che controlla l’esecuzione di programmi applicativi e agisce come interfaccia tra le applicazioni e l’hardware del calcolatore Obiettivi di un sistema operativo: Semplicità: Deve semplificare l’utilizzazione della macchina da parte degli utenti Astrazione: Deve fornire una visione astratta delle risorse del calcolatore per i programmatori Efficienza: Deve utilizzare in modo efficiente le risorse del calcolatore Protezione: Deve proteggere le risorse del computer e permettere un accesso controllato ad esse I servizi offerti dai sistemi operativi Esecuzione di programmi (applicativi e di sistema) Gestione dell’accesso alla memoria (principale e secondaria) del calcolatore Gestione dell’accesso ai dispositivi di I/O Rilevazione e risposta agli errori Amministrazione di utenti diversi Controllo degli accessi Accounting Hardware, software e sistemi operativi Un sistema di calcolo può essere suddiviso nei seguenti elementi: Un sistema di calcolo è composto da elementi hardware ed software. E’ possibile rappresentare le relazioni che esistono fra i vari elementi tramite un diagramma a strati, come quello proposto in figura. L’hardware è lo strato inferiore: è il più complesso e difficile da utilizzare e programmare. Per fare un esempio, la lettura di informazioni da un floppy disk richiede una complessa interazione tra il controllore del floppy disk (hardware) e il software; questo ultimo deve orchestrare numerose operazioni, incluse l’accensione del motore, l’attesa che il disco raggiunga una velocità di rotazione sufficiente, lo spostamento della testina di lettura, e così via. Possiamo indicativamente suddividere l’hardware in processore, memoria e dispositivi di I/O. Il nucleo del sistema operativo (in inglese, kernel) è quella parte del sistema operativo che si colloca immediatamente sopra l’hardware, con il compito di nascondere ai livelli soprastanti i dettagli più complessi e fungere da gestore delle risorse del sistema. La comunicazione tra il nucleo e gli altri elementi software è mediata da un’interfaccia di programmazione, detta delle chiamate di sistema (system call). Sopra a questa interfaccia sono costruite le librerie (di sistema e applicative), un insieme di funzioni di base che permettono di eseguire le operazioni più comuni realizzate da un sistema operativo (esecuzione di programmi, lettura di file, ecc.), e da tool di sistema, ovvero programmi che permettono di realizzare le operazioni più comuni, come copia di file, backup, ecc. Il nucleo del sistema operativo, l’interfaccia di programmazione, le librerie e i tool di sistema vengono detti software di sistema, in quanto si occupano tutti della gestione della macchina. Sopra al software di sistema troviamo il software applicativo (come ad esempio suite per l’ufficio, per la navigazione in Internet, ecc). I componenti di un sistema operativo I principali componenti di un S.O. sono: Gestore dei processi Gestore della memoria principale Gestore dei dispositivi di I/O Gestore della memoria secondaria Gestore del file system Meccanismi di protezione e sicurezza I S.O. moderni presentano un’elevata complessità strutturale. Al loro interno, è possibile distinguere un certo numero di unità operative, che si prendono carico di fornire uno o più servizi a programmatori ed utenti. Il gestore dei processi è l’elemento che si occupa di organizzare l’esecuzione dei programmi sul processore. Quando un programma è in esecuzione, prende il nome di processo. Periodicamente o in seguito ad eventi di I/O generati dai dispositivi, il gestore dei processi sceglie uno fra i processi pronti ad eseguire, e istruisce il processore affinché venga eseguito. Il meccanismo di gestione deve essere tale che ogni processo riceva una porzione del tempo del processore proporzionale alla sua importanza (o una porzione equa, se tutti i processi hanno la stessa importanza). Il gestore della memoria principale si occupa di suddividere la memoria RAM fra i vari processi attualmente in esecuzione. Le operazioni svolte da tale componente sono essenzialmente due: tenere traccia di quali sezioni della memoria sono occupate da quali processi e tenere traccia dello spazio libero di memoria, ovvero dello spazio non utilizzato. Può avvalersi dei servizi del gestore della memoria secondaria per simulare una quantità maggiore di memoria principale. I gestori dei dispositivi di I/O si occupano di astrarre la complessità dei dispositivi hardware fornendo un’interfaccia comune ad ognuno di essi; ad esempio, tastiera e mouse possono essere modellati semplicemente come un flusso di dati in input. Un gestore di dispositivo può gestire più dispositivi dello stesso tipo. Il gestore della memoria secondaria e il gestore del file system sono i componenti che forniscono l’astrazione di file e Directory; come nel caso della memoria principale, il loro compito più importante è mantenere informazioni su chi utilizza certe parti della memoria ed eventualmente sopprimere il processo se necessario.I meccanismi di protezione spesso non sono organizzati come un modulo a parte; invece, permeano tutti i moduli precedenti, impedendo che i processi e gli utenti eseguano operazioni non consentite. Sistemi Operativi Moderni Sistemi operativi Microsoft Windows 9x-Millenium Edition Windows NT-2000-XP-Longhorn Sistemi operativi commerciali basati su UNIX AIX, Solaris MacOS X Sistemi operativi open-source Linux FreeBsd, NetBsd, OpenBsd Ai giorni nostri, esistono tre grandi classi di sistemi operativi. I sistemi Microsoft sono sicuramente i più diffusi. Esistono due grandi famiglie di prodotti Microsoft nel campo dei sistemi operativi. La prima famiglia, che comprendeva Windows 95, Windows 98 e Millenium Edition, trae le sue origini dai vecchi sistemi mono-programmati DOS, ed aggiunge, anche se in modo incompleto, funzionalità di multi-programmazione e time-sharing. In particolare, gli insufficienti meccanismi di protezione all’interno del nucleo del sistema operativo per la gestione di processi multipli e il mancato controllo degli accessi alle risorse condivise, rese questi sistemi operativi inadatti per l’utilizzazione come server. La seconda famiglia, che include sistemi quali Windows NT, Windows 2000, Windows XP e la futura versione Longhorn, invece, è caratterizzata da sistema operativi moderni, multi-programmati, output e multiutente. UNIX è un sistema operativo sviluppato inizialmente negli anni ’70, e oggi presente sotto forma di numerosi sistemi operativi, commerciali e non. Sistemi operativi come AIX e Solaris (prodotti rispettivamente da IBM e Sun Microsystems) sono esempi di moderni sistemi operativi basati su UNIX. MAC OS X, recentemente introdotto dalla Apple, è basato su un nucleo UNIX, sopra al quale è stata costruita una moderna interfaccia grafica. Oltre alle versioni commerciali, le idee rappresentate da UNIX hanno dato origine a numerosi progetti open-source, fra cui il sistema più noto è sicuramente Linux. Linux è composto da un nucleo altamente affidabile, che presenta le stesse interfacce di programmazione di UNIX ed un insieme di programmi applicativi e di sistema, fra cui interfacce grafiche, programmi per l’automazione dell’ufficio e web server. Architettura di un S.O. E’ possibile suddividere le architetture interne dei sistemi operativi in due grandi famiglie: Sistemi monolitici Sistemi a microkernel Classificando i S.O. in base alla loro struttura interna, esistono due grandi famiglie: sistemi monolitici e sistemi basati su microkernel. Nei S.O. monolitici, il kernel è implementato come una semplice collezione di funzionalità e servizi, senza una particolare organizzazione; ognuno di tali servizi può comunicare con gli altri senza intermediari. Il vantaggio di tale struttura è l’efficienza, mentre lo svantaggio principale è la mancanza di modularità, che porta a complicare l’implementazione, la manutenzione e l’espansione di tali sistemi operativi. Come esempi di sistemi monolitici possiamo ricordare MS-DOS e UNIX. MS-DOS è un sistema a struttura semplice, che sebbene abbia retto un’evoluzione al di là degli scopi originari (Windows 9x), ha dimostrato come una mancanza di seria progettazione iniziale può rendere difficile l’implementazione di funzionalità importanti quali protezione della memoria e sicurezza. UNIX, d’altro canto, ha dimostrato che un sistema monolitico ben progettato può avere una vita molto lunga. Nel modello di architettura basato su microkernel, il kernel è ridotto al minimo, e contiene le funzionalità base per la gestione dei processi, la gestione base della memoria principale e l’interfacciamento con i dispositivi di I/O. Tutti i servizi ulteriori (gestione avanzata della memoria principale, gestione della memoria secondaria, implementazione di file system) vengono realizzati come processi privilegiati. La comunicazione tra processi è mediata dal kernel ed è basata su scambio di messaggi. I vantaggi di tale struttura sono evidenti: il kernel è molto semplice e facile da realizzare; più espandibile e modificabile; più facilmente portabile ad altre architetture hardware; più sicuro e affidabile. Lo svantaggio principale è una ridotta efficienza, in quanto ogni comunicazione tra servizi del sistema operativo deve passare attraverso il kernel. Windows NT-2000-XP è parzialmente basato su un’architettura a microkernel. Linux, d’altro canto, pur essendo un sistema monolitico, è dotato del meccanismo dei moduli, che permette di caricare (anche durante l’esecuzione) nuove funzionalità nel sistema operativo.