Scarica Fondamenti di informatica e più Schemi e mappe concettuali in PDF di Fondamenti di informatica solo su Docsity! FONDAMENTI DI INFORMATICA INTRODUZIONE L’informatica NON è lo studio del calcolatore, il quale risulta essere solamente uno strumento. Sono molti infatti gli oggetti in grado di elaborare dati e informazioni, e allo stesso tempo ci sono settori dell’informatica che non utilizzano alcun tipo di calcolatore (informatica teorica) lo studio di un linguaggio di programmazione, è solo uno strumento per descrivere soluzioni (algoritmiche) a problemi, è quindi solo un mezzo e non un fine. Esistono diversi linguaggi e diverse classi di linguaggi: Logici (Prolog), si scrivono solamente i vincoli del problema e si procede attraverso la logica Imperativi (Pascal), dicono al calcolatore passo passo le azioni da compiere Ad oggetti ( Java, C++), si descrivono degli oggetti e si fanno interagire tra di loro Funzionali (Lisp), qualunque calcolo viene visto come una funzione PYTHON PUO’ FUNZIONARE COME TUTTI QUESTI LINGUAGGI lo studio delle applicazioni, le applicazioni sono utilizzate dagli utenti finali mentre gli informatici si occupano della specifica, della progettazione, della realizzazione e della validazione delle applicazioni L’informatica è Un approccio tradizionale parte dalla definizione di algoritmo: una procedura per risolvere un problema in un numero finito di passi e definisce l’informatica come: Lo studio degli algoritmi, che comprende: le loro proprietà formali e matematiche le loro realizzazioni hardware le loro realizzazioni software le loro applicazioni Lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, efficienza, realizzazione, e applicazione La scienza della rappresentazione e dell’elaborazione dell’informazione Il termine informatica deriva dalla contrazione del termine informazione automatica: (Trattamento) (automatico) (dell’informazione) Trattamento: rappresentazione, conservazione, elaborazione Automatico: deleghiamo uno strumento Informazione: relazione tra dati L’informatica si occupa quindi principalmente di risolvere problemi: Un problema è una classe di domande omogenee a cui dare una risposta mediante una procedura ben definita. Ogni singola domanda si chiama istanza del problema. Ogni istanza è caratterizzata da: un insieme di dati di partenza (es. {12, 13}), l’input un risultato cercato (es. 156), l’output La soluzione di un problema è definita da una procedura che, a partire da qualsiasi insieme di dati di partenza, produce un risultato. In particolare, la soluzione è un algoritmo, di cui diamo una definizione più dettagliata: Alla base dell’informatica c’è il concetto di algoritmo: Un algoritmo è una sequenza finita di passi elementari che dai dati di partenza produce un risultato per ogni istanza di un problema. •Finitezza: ogni algoritmo deve terminare; •Generalità: ogni algoritmo deve fornire una soluzione per tutti i problemi appartenenti ad una data classe; •Non ambiguità: i passi successivi devono essere definiti in modo univoco. I componenti principali di un calcolatore secondo l’architettura di von Neumann sono: la Memoria, dove vengono memorizzati programmi e dati (da elaborare e i risultati l’Unità di Elaborazione Centrale, detta CPU (Central Processing Unit) ha il compito di elaborare i dati secondo le istruzioni del programma le unità periferiche, per immettere dati nel calcolatore e per ottenerli in uscita dal calcolatore il Bus, che connette tra loro i componenti permettendo il transito dei dati La memoria è costituita da una serie di celle contenenti una parola (word). Ciascuna parola è composta da una sequenza di bit (binary digit). Il bit è l’unità minima di memoria e può essere in uno di due stati, indicati come 0 e 1. Gli attuali calcolatori hanno celle con parole di 32 o 64 bit, organizzate in byte. Un byte è una sequenza di 8 bit. Quindi le celle di 32 bit sono composte da 4 byte, mentre quelle di 64 bit da 8 byte. In generale con n bit posso distinguere 2n stati(per calcolare i bit necessari per codificare dei dati, 2n=x ,quindi log2 x=n¿. La quantità di memoria si misura in byte e multipli del byte: La memoria di un calcolatore è una sequenza di celle, sono numerate e arrivano a miliardi. Il numero delle celle si dice indirizzo. La CPU è il dispositivo principale del calcolatore ed è composta da: L’Unità di Controllo, detta anche CU( Control Unit), controlla tutte le operazioni del calcolatore, regola il tempo con il quale svolgere le istruzioni preleva le istruzioni dalla memoria e i dati necessari all’esecuzione, invia i segnali di esecuzione alle altre unità L’unità logico-aritmetica, detta ALU(Arithmetic e Logic Unit) si occupa di eseguire le istruzioni aritmetiche e logiche I registri, memoria locale della CPU dove memorizzare gli operandi e i risultati delle operazioni. La CPU esegue un ciclo in tre fasi: FETCH: preleva dalla memoria l’istruzione da eseguire( l’indirizzo è nel PC (Program Counter)). L’istruzione viene messa nell’Istruction Register(IR). Il PC viene incrementato automaticamente per passare all’istruzione successiva. Unità coinvolte: memoria e unità di controllo. DECODE: decodifica l’istruzione e vengono presi gli operandi necessari e messi nei registri. Unità coinvolte: memoria e unità di controllo. EXECUTE: l’unità di calcolo esegue l’istruzione presente nell’IR. I risultati vengono trasferiti dai registri alla memoria. Se l’istruzione prevede un salto il PC viene sovrascritto. Le unità periferiche sono dispositivi necessari alla comunicazione da e per il calcolatore . Si distinguono in : Unità di input: per immettere informazioni nel calcolatore, esempi sono la tastiera, il mouse, il microfono Unita di output: riceve le informazioni dalla memoria per renderle disponibili all’utente, esempi sono lo schermo, altoparlanti, stampanti. Vi sono inoltre dispositivi di input/output come memorie secondarie, touch- screen, dispositivi di collegamento alle reti. Il Bus è un canale di comunicazione che permette ai dati di transitare tra le componenti di un calcolatore. Linguaggi di programmazione Il linguaggio macchina è un linguaggio direttamente comprensibile ed eseguibile dall’elaboratore, senza nessuna traduzione. Caratteristiche: istruzioni ed operandi presenti in memoria tutto è espresso in forma binaria Conseguenze: difficile da scrivere difficile da interpretare per esseri umani Una istruzione in linguaggio macchina può essere a lunghezza fissa (per esempio di una cella) o variabile da 1 a più byte. Il linguaggio assemblativo (assembly) è un linguaggio di basso livello che consente al programmatore di ignorare il formato binario della macchina il quale viene sostituito da una sequenza di caratteri che lo rappresenta in forma mnemonica. Quindi un programma scritto in assembly è facilmente leggibile dai programmatori. Per poter essere eseguito su un calcolatore deve essere tradotto in linguaggio macchina. Questo compito è svolto da un programma detto assemblatore. Anche il linguaggio assemblativo è di difficile uso perché legato alla macchina più che alle esigenze del programmatore. Sono quindi stati introdotti i linguaggi di alto livello (C, Fortran, C++, Java, Python, ...). Per essere eseguiti hanno comunque la necessità di essere tradotti in linguaggio macchina. Esistono due tipi di traduttori: i compilatori: accettano in ingresso l’intero programma e producono in uscita la rappresentazione dell’intero programma in un altro linguaggio. Possono esserci catene di compilatori: ad esempio i primi compilatori del C++ traducevano il codice C++ in un programma in C, che veniva compilato in assembly, a sua volta tradotto in linguaggio macchina dall’assembler. gli interpreti: traducono ed eseguono direttamente ciascuna istruzione del programma sorgente, una dopo l’altra. Rappresentazione analogica: l’informazione viene rappresentata da grandezze continue( traccia su un disco in vinile, onda elettromagnetica, sonora) Rappresentazione digitale: l’informazione viene rappresentata sfruttando combinazioni di simboli( cifre per i numeri) La rappresentazione analogica ha lo svantaggio di essere più soggetta al rumore. Questo limita la trasmissione dell’informazione. Quindi si preferisce una rappresentazione digitale con pochi simboli chiaramente distinguibili. In informatica si usano due soli simboli, per convenzione 0 e 1. Le forme in cui si presenta l’informazione sono molto diverse tra loro. Ad esempio: un numero una frase un suono un’immagine un filmato Per tutte queste forme possiamo trovare una codifica, cioè una rappresentazione tale che l’informazione possa essere elaborata Rappresentazione dei numeri Il numero è un concetto astratto. Dato un numero ogni sua rappresentazione viene detta numerale. (sassi, dita della mano, in antico romano, in decimale, in binario, in greco,…). Un numero è comunemente rappresentato da una sequenza di cifre decimali (cioè i simboli 0, 1, . . . , 9) dove ogni cifra assume un valore a seconda della posizione in cui si trova nella stringa (notazione posizionale). Un numero in base 10 di n cifre è rappresentato come: xn−1 · 10n−1 + xn−2 · 10n−2 + xn−3 · 10n−3 + . . . x1 · 101 + x0 · 100 dove 0 <= xi < 10. Il valore della cifra dipende dalla posizione nella sequenza e dal valore della base b. 0 <= xi < b xn−1xn−2 . . . x0 = xn−1 · bn−1 + xn−2 · bn−2 + . . . + x0 · b0 IN QUALSIASI BASE AGGIUNGERE UNO ZERO SIGNIFICA MOLTIPLICARE PER LA BASE Quando la base è 2 abbiamo a disposizione solamente i simboli 0 e 1 (1010)2 = 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20 = 8 + 0 + 2 + 0 = (10)10 In questo modo si possono convertire i numeri in base 2 in numeri in base 10 Dividendo un numero in base b per b il resto sarà la cifra meno significativa( quindi la prima cifra) Per passare invece da numeri in base 10 a numeri in base 2 bisogna dividere il numero per due fino ad ottenere un quoziente pari a 0 si devono prendere i resti dal basso verso l’alto( dall’ultimo al primo) Rappresentazione in esadecimale In informatica si usa una codifica particolare in base 16 detta esadecimale. A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F} b = |A| = 16 xn−1xn−2 . . . x0 = xn−1 · 16n−1 + xn−2 · 16n−2 + . . . + x0 · 160 (per trasformarlo in base 10 si utilizza sempre lo stesso metodo) L’esadecimale è utile per rappresentare lunghe sequenze di bit. Ad ogni 4 bit si può associare una cifra esadecimale 0000 corrisponde a 0 0001 corrisponde a 1 0010 corrisponde a 2 0011 corrisponde a 3 0100 corrisponde a 4 0101 corrisponde a 5 0110 corrisponde a 6 0111 corrisponde a 7 1000 corrisponde a 8 1001 corrisponde a 9 1010 corrisponde a A 1011 corrisponde a B 1100 corrisponde a C 1101 corrisponde a D 1110 corrisponde a E 1111 corrisponde a F Per passare da decimale a esadecimale si divide per 16 e si prendono i resti dal basso verso l’alto Per passare da esadecimale a decimale bisogna sempre moltiplicare per le potenze di 16 Per passare da esadecimale a binario è sufficiente sostituire ad ogni cifra esadecimale il gruppo di 4 bit corrispondenti. Per passare da binario ad esadecimale bisogna raggruppare le cifre a gruppi di 4 partendo da destra. Il sistema ottale Per passare da ottale a decimale si utilizza lo stesso sistema del binario quindi moltiplicando per le potenze di 8. Per passare da binario ad ottale è sufficiente raggruppare a tre a tre le cifre del numero binario da destra verso sinistra e sostituire ad ogni gruppo la cifra ottale corrispondente. Per passare da ottale a binario è sufficiente sostituire ad ogni cifra ottale il gruppo di tre bit corrispondente Rappresentazione numeri relativi A questo punto si presenta il problema della rappresentazione dei numeri relativi. Si è pensato ad aggiungere un simbolo prima dei numeri: uno 0 che va ad indicare che il numero è positivo, un 1 per indicare che il numero è negativo. Però in questo modo ci sarebbe una doppia rappresentazione per lo 0: +0 e -0, e quindi si utilizzano anche altre rappresentazioni per i numeri relativi come il complemento a due . Le celle di memoria hanno un numero finito di bit, in generale con n bit possiamo ottenere 2n configurazioni. Con n bit possiamo rappresentare i numeri naturali da 0 a 2n-1. Molti linguaggi di programmazione, anche di alto livello, definiscono interi solo quei numeri rappresentabili con i bit di una parola. A ciscuna delle configurazioni possibili associano un intero diverso. Con un byte (8 bit), rappresentiamo gli interi nell’intervallo −128, 127, con 16 bit quelli tra −32768, 32767, con 32 bit quelli tra −2147483648, 2147483647 e in generale, con n bit, quelli nell’intervallo aperto [−2n−1,+2n−1). Alcuni linguaggi più recenti, tra cui il Python, rappresentano gli interi con un numero di cifre qualsiasi utilizzando più celle di memoria fino ad esaurimento della stessa. due operazioni: campionamento: consideriamo solo i valori che il segnale assume in determinati istanti di tempo quantizzazione: approssimiamo l’insieme continuo dei valori con un insieme discreto (cioè, definire quanti valori diversi il segnale può assumere per definire il numero di bit necessario a identificare un campione) Rappresentazione delle immagini Esistono due tipi differenti di immagini che differiscono nella natura dell’elemento costitutivo di base: Immagini vettoriali: descritte matematicamente come composizione di elementi di base come punti e linee Immagini raster: descritte come griglie di picture elements (pixel) Le immagini vettoriali Le immagini vettoriali sono utilizzate nella progettazione meccanica, architettonica, elettronica e dai sistemi di grafica professionale. Limiti: forte dipendenza dal programma applicativo usato per la creazione inadeguatezza alla rappresentazione di immagini molto complesse dal punto di vista delle sfumature cromatiche inadeguatezza alla rappresentazioni di immagini fotografiche Immagini raster Le immagini raster sono ottenute da scanner o macchine fotografiche digitali. Nelle immagini in bianco e nero ad ogni pixel è associato un bit. Nelle immagini a colori ad ogni pixel possono essere associati 3 byte, uno per ogni colore fondamentale (rosso, verde, blu). Le immagini richiedono Megabyte per essere memorizzate: esistono quindi molti formati per la loro compressione. Rappresentazione dei filmati Un fotogramma si codifica come un’immagine il segnale è discreto all’origine (24 fotogrammi al secondo per il cinema, 25 o 30 fotogrammi al secondo per la tv, a seconda dello standard adottato) in linea teorica si potrebbero codificare tutti i fotogrammi (immagini statiche) in successione questo porterebbe ad una occupazione di memoria di 644 Mbyte per un filmato televisivo della durata di un minuto sono quindi necessarie tecniche di compressione: Vengono sovrapposte delle immagini e si trasmette la differenza dall’immagine precedente, dopodiché ogni tanto viene trasmessa l’immagine completa per poi ricominciare con la differenza. L’ARCHITETTURA DI UN CALCOLATORE Come abbiamo visto, l’architettura dei moderni calcolatori è basata sul modello di von Neumann, che prevede una memoria, una CPU, dei dispositivi di input/output e un bus di collegamento. Vediamo ora come avviene la comunicazione con la memoria per la scrittura e lettura dei dati. Per supportare i trasferimenti di dati da e verso la memoria la CPU ha i seguenti registri speciali: Memory Address Register (MAR, registro di indirizzamento della memoria) – contiene l’indirizzo di memoria dove scrivere o da dove prelevare un dato – è direttamente collegato col bus indirizzi Memory Data Register (MDR, registro dati di memoria) – contiene una copia del dato da scrivere o prelevato dalla memoria – è direttamente collegato col bus dati Per supportare le operazioni di trasferimento dati con la memoria sono previste due linee di controllo sul bus controlli: Segnale “leggi”: quando questo viene attivato l’operazione richiesta è una lettura Segnale “scrivi”: quando questo viene attivato l’operazione richiesta è una scrittura Se entrambi i segnali sono assenti la memoria non è chiamata in causa La lettura -La CPU scrive l’indirizzo i nel registro MAR (e quindi sul bus indirizzi) e invia il segnale “leggi” sul bus controlli – La memoria risponde inviando sul bus dati il contenuto della cella di indirizzo i, che viene memorizzato nel registro MDR e quindi nel autonomamente quando e come accedere alle risorse del sistema (devono chiedere l’intervento del sistema operativo) come devono essere soddisfatte le richieste di utilizzo delle risorse del sistema COMPONENTI DEL SO sistema di gestione del processore: controlla la CPU vista comerisorsa; definisce quale programma è da eseguire in un dato momento(time sharing). sistema di gestione della memoria: carica programmi (istruzioni edati) nella memoria principale dalla memoria secondaria; controlla l’allocazione della memoria di lavoro ai diversi programmi che possono essere in esecuzione. sistema di gestione delle periferiche: garantisce l’accesso ai dispositivi di I/O; maschera i dettagli di basso livello e gli eventuali conflitti che possono insorgere quando arrivano contemporaneamente più richieste di accesso alla stessa risorsa; rileva i problemi provocati da guasti hw. sistema di gestione dei file (file system): consente l’archiviazione e il reperimento dei dati sfruttando i dispositivi che costituiscono la memoria di massa; predispone l’organizzazione logica dei dati sottoforma di “cartelle” (directory) e file. sistema di gestione degli utenti: fornisce un’interfaccia agli utenti(interprete dei comandi); permette agli utenti di accedere in modo semplice ed intuitivo alle funzionalità disponibili; permette la condivisione di risorse da parte di più utenti (sistema multiutente) LA MEMORIA SECONDARIA La memoria principale di un calcolatore è veloce, ma volatile (se non alimentata si cancella). È quindi necessario memorizzare i dati su supporti permanenti. Supporti storici sono le schede perforate, i tamburi, i nastri (ancora in uso). Supporti attuali sono: dischi magnetici CD (Compact Disk) DVD (Digital Versatile Disc) BD (Blu-ray Disc) SSD (Solid State Drive), impropriamente detti dischi a stato solido DISCHI MAGNETICI I dischi magnetici sono composti da più piatti rotanti suddivisi in tracce e settori. Nei settori, che hanno un loro indirizzo, sono memorizzati i dati che vengono letti e scritti da testine di lettura e scrittura. I dati memorizzati sono organizzati sotto forma di file. Un file (archivio) è una sequenza di byte. Se il file occupa più settori, la loro sequenza è mantenuta specificando gli indirizzi dei settori che lo costituiscono. CD, DVD, BD, SSD Un disco a stato solido è costituito da memorie flash(memoria elettronica non- volatile che può essere cancellata e riscritta) Le SSD conservano i dati su circuiti I dati in un disco vengono rilevati attraverso dei buchetti: se non c’è è 1, se c’è è 0. IL FILE SYSTEM Per File System si intende il modo in cui i file sono gestiti, immagazzinati e organizzati su un dispositivo di archiviazione, come un disco o un DVD. Esistono diversi file system, creati per diversi sistemi operativi, per diverse unità di memorizzazione e per diversi usi. La capacità di memorizzare programmi e dati è una caratteristica fondamentale di un calcolatore. Il file è un meccanismo per strutturare dati che permette di aggregare informazioni elementari in strutture più complesse. Il file permette di aggregare e di archiviare in un unico oggetto informazioni che devono essere mantenute insieme, ad esempio istruzioni di un programma o frasi che compongono un testo. A prescindere dal modo in cui l’informazione viene organizzata, un file è comunque formato da una sequenza finita di byte. Un file è identificato da un nome, a cui ci si riferisce spesso con il termine inglese filename. I nomi comprendono lettere, numeri e altri caratteri come lo spazio. Il file system: Fornisce un meccanismo per creare e identificare i file, associando spazio fisico sulle memorie secondarie a un nome L’effettiva struttura fisica del supporto è trasparente all’utente L’occupazione dello spazio libero e di quello ricavato da cancellazioni è gestito automaticamente Fornisce le funzioni di lettura e modifica dei dati Realizza meccanismi di protezione dei dati che permettono di stabilire chi e come può accedere alle informazioni memorizzate sui supporti Si utilizza una struttura gerarchica per rappresentare il contenuto di un disco o altra unità di memorizzazione permanente ad accesso diretto GERARCHIE DI FILE E DIRECTORY I file sono raggruppati in cartelle (directory). Una directory può contenere file e altre directory, formando così una gerarchia ad albero. Ad ogni directory è associato un nome. In molti SO esiste una directory che contiene tutte le altre detta root (indicata con “/” in Linux) Il nome completo di un file è dato dalla sequenza (path) dei nomi delle directory in cui il file è contenuto a partire dalla radice e dal nome del file stesso. Es. (in Linux): /home/gabriele/Fondamenti/FileSystem.pdf