GLI ONOREVOLI
Quaderno di Informatica
GIAMMARCO FELLA, ANDREA GALLO, LORENZO LACORTE, CIRO MARANO'
L'architettura di Von Neumann
Il modello di architettura di von Neumann è costituito da tre sottosistemi interconnessi: il Processore (CPU), la Memoria e i Dispositivi di I/O (Input/Output o Ingresso/Uscita). La connessione tra questi sottosistemi è realizzata mediante un altro dispositivo, noto come Bus.
IL PROCESSORE
Il processore (CPU, Central Processing Unit) è un interprete di istruzioni, costituito da tre componenti:
- ALU (Unità Aritmetico Logica): esegue le operazioni matematiche e logiche (addizione binaria, AND e OR) richieste dalle istruzioni;
- Unità di Controllo: legge le istruzioni, le decodifica e le esegue ed effettua i controlli delle attività necessarie per l'esecuzione;
- Registri: sono molto veloci e con una capacità ridotta, costituiscono una memoria speciale (di supporto) per l'ALU poiché contengono le istruzioni di controllo necessarie per il suo funzionamento e i risultati temporanei delle elaborazioni.

La CPU esegue i programmi memorizzati nella memoria centrale procedendo nel modo seguente: estrae le istruzioni del programma dalla memoria, le interpreta- le esegue una dopo l'altra, fino ad ottenere il risultato. Quindi, affinché un computer possa svolgere un compito, deve eseguire un programma sull'insieme dei dati ricevuti in input, cioè deve manipolare i dati in input secondo l'elenco delle istruzioni, fino al raggiungimento della soluzione del problema. Benché in memoria ci siano più dati e istruzioni, il processore li estrae uno alla volta e li elabora uno alla volta.
LA MEMORIA
La Memoria contiene i dati e i programmi e la sua capacità è espressa in multipli del Byte. Il Byte è una sequenza di otto bit, che insieme rappresentano un singolo carattere alfabetico e/o numerico. Le dimensioni della memoria sono espresse come multipli molto più grandi:
- Kilobytes (1.024 bytes),
- Megabytes (1.024 Kilobytes),
- GigaBytes (1.024 Megabytes),
- TeraBytes (1.024 Gigabytes).
Esistono due classi principali: la memoria centrale e la memoria secondaria. La memoria Centrale ha una funzione di supporto alla CPU perché fornisce(ad alta velocità) le istruzioni del programma in esecuzione e i dati su cui operare. È composta da un insieme di locazioni (celle), ciascuna delle quali può memorizzare una parte delle informazioni. Ad ogni locazione è associato un indirizzo (ossia un numero che la identifica univocamente). La memoria centrale è costituita esclusivamente dalla RAM, il restante delle memorie costituiscono le memorie secondarie.
La memoria ROM (Read Only Memory): memoria di sola lettura, cioè i dati non sono modificabili dall'utente. È una memoria permanente (conserva le informazioni anche dopo lo spegnimento del computer) e contiene i programmi fondamentali per l'avvio del computer, noti come BIOS (che interagiscono con i circuiti della macchina).
La memoria RAM (Random Access Memory): memoria ad accesso casuale e di tipo volatile, cioè il suo contenuto va perso quando si spegne il computer. Contiene i dati (intermedi e finali delle elaborazioni) e le istruzioni dei programmi in esecuzione. Inoltre è la memoria principale dell'elaboratore, senza di essa non potrebbe funzionare.
La memoria EPROM (Electric Programmable ROM) è paragonabile alla memoria ROM cui si è accennato in precedenza, ma, diversamente da quest'ultima, consente in particolari condizioni la modifica dei dati in essa contenuti. Ovviamente, qualsiasi modifica operata determina sostanziali modifiche nel funzionamento del computer, per cui la stessa non può essere oggetto di improvvisazione e deve essere affidata soltanto ad utenti esperti.
La memoria CACHE è invece destinata ad ospitare dati di frequente utilizzo, e consente un accesso più veloce a informazioni di recente acquisite e visualizzate; è il caso, ad esempio, dei dati cui si ha avuto accesso per mezzo di Internet. È una memoria molto utile e può essere "svuotata" a piacimento dall'utente, al fine di renderla disponibile per ulteriori archiviazioni temporanee.
La Memoria secondaria (o di massa) è più lenta, ha una elevata capacità di immagazzinare
i dati (di uso non frequente) ed è stabile, ossia mantiene la memorizzazione delle
informazioni anche dopo lo spegnimento del computer, per questo è utilizzata per la
memorizzazione permanente di dati e programmi.
DISPOSITIVI DI INPUT/OUTPUT
I Dispositivi di Input/Output (o periferiche), sotto il controllo e coordinamento del processore, consentono l'interazione tra il computer e l'utente (più in generale, l'interazione tra il computer e l'ambiente), in particolare consentono l'immissione dei dati all'interno del computer e la comunicazione all'esterno dei risultati ottenuti con l'elaborazione. Per unità di Input si intende un dispositivo che consente di immettere dei dati nel computer. Per unità di Output si intende un dispositivo che riceve dal sistema i risultati dell'elaborazione dei dati e li trasmette all'utente.
Esistono infine unità periferiche che svolgono entrambe le funzioni di input e output, per esempio:
- Modem: è un dispositivo di ricetrasmissione, cioè che consente la comunicazione di più computer utilizzando la linea telefonica;
- Monitor touch screen: è un dispositivo costituito da uno schermo ed un digitalizzatore, che consente all'utente di interagire con l'interfaccia grafica mediante apposita penna/stilo o con le dita.
Algebra di Boole
Nel lavoro di programmazione capita spesso di dovere ricorrere ai principi della logica degli enunciati ed occorre conoscere almeno alcuni concetti base dell'algebra degli enunciati (o delle proposizioni) detta anche algebra booleana o di Boole dal matematico inglese George Boole (1815-1864). Gli oggetti che fanno parte dell'algebra di Boole sono gli enunciati.
Si definisce enunciato una proposizione che può essere soltanto vera oppure soltanto falsa e che non può mai essere contemporaneamente vera e falsa oppure indeterminata.
Con il termine valore di verità di un enunciato si intende la sua verità oppure la sua falsità ossia il suo essere vero oppure falso. Nell'Algebra di Boole un enunciato può essere essere semplice oppure composto. Un enunciato composto è un enunciato formato da due o più enunciati semplici (chiamati sotto enunciati) collegati tra loro attraverso appositi connettivi logici.
I CONNETTIVI LOGICI FONDAMENTALI
- CONGIUNZIONE LOGICA (AND oppure e oppure ^ oppure et oppure &) Il connettivo logico AND è un operatore binario (ossia agisce su due enunciati per crearne un altro). L'enunciato composto p AND q risulta VERO solo nel caso in cui entrambi gli enunciati semplici p e q sono VERI, mentre risulta FALSO in tutti gli altri casi.
- DISGIUNZIONE LOGICA (OR oppure o oppure vel oppure | ) Il connettivo logico OR è un operatore binario (ossia agisce su due enunciati per crearne un altro). l'enunciato composto p OR q risulta FALSO solo nel caso in cui entrambi gli enunciati semplici p e q sono FALSI mentre risulta VERO in tutti gli altri casi (ossia quando almeno uno degli enunciati semplici è VERO).
- NEGAZIONE LOGICA (NOT oppure non). Il connettivo logico NOT è un operatore unario (ossia agisce su un solo enunciato per crearne un altro). In altre parole l'enunciato composto NOT p (detto anche "negazione di p") risulta VERO se l'enunciato semplice p è FALSO mentre risulta FALSO se l'enunciato semplice p è VERO ossia assume valore di verità opposto rispetto al valore di verità posseduto dall'enunciato semplice su cui viene applicato
I tre connettivi logici sopra definiti - AND, OR e NOT
- si definiscono "fondamentali" in quanto essi costituiscono un insieme
"funzionalmente completo" di operatori nell'algebra di Boole. Infatti tutti gli
altri connettivi logici possibili sono chiamati connettivi "derivati" in quanto
possono essere espressi mediante un'opportuna combinazione (espressione) di uno
o più connettivi logici fondamentali (ossia AND, OR e NOT).

Il codice binario
L'informatica lavora sui calcolatori elettronici e per questo motivo dobbiamo conoscere il "linguaggio" con cui essi interagiscono con noi esseri umani: il codice binario. Il codice binario, come si può evincere dal nome stesso, è formato da due caratteri: 0 e 1. Il nostro elaboratore utilizza il codice binario e non il linguaggio che utilizziamo tutti i giorni perché 0 e 1 corrispondono rispettivamente ai valori di assenza e presenza di corrente. Il valore 0 indica solitamente la mancanza di tensione nei circuiti (gli impulsi elettrici all'interno del calcolatore sono nulli) , viceversa con il valore 1.
Questi due valori vengono chiamati bit (binary digit) e rappresentano l'informazione più piccola che si possa assumere e/o inviare. I primi programmi , infatti , furono scritti in codice binario, poiché la macchina è tecnicamente capace di comprendere solo questi due valori.
Per codificare dei caratteri alfanumerici, abbiamo bisogno di raggruppare n numeri di bit, dove questi numeri di bit creano il byte. Momentaneamente per formare 1 byte abbiamo bisogno di 8 bit. In base al numero di byte che usiamo, esistono dei multipli, dotati di una propria nomenclatura :
- 1 byte = 8 bit.
- 1 kilobyte (kB) = 1024 byte
- 1 megabyte (MB) = 1024 kB
- 1 gigabyte (GB) = 1024 MB
- 1 terabyte (TB) = 1024 GB
Con la codifica binaria possiamo codificare anche solamente dei numeri. Esempio:
Dove 10 e 2 si riferiscono sistema di appartenenza del numero espresso: questi vengono solitamente chiamati basi di un numero. La base decimale è quella che rappresenta tutti i numeri che giornalmente utilizziamo, la base binaria è quella propria dei calcolatori elettronici.
TRASFORMAZIONE DI NUMERI DECIMALI IN BINARI E VICEVERSA
Per convertire un numero da decimale a binario basta fare la divisione del numero per due, dividere il quoziente ottenuto ancora per due, e così via fino ad ottenere quoziente zero. Il numero binario corrispondente si ottiene prendendo i resti a partire dall'ultimo.
Esempio:
1410 = 14 : 2 = 7 resto 0 ;
7 : 2 = 3 resto 1 ;
3 : 2 = 1 resto 1 ;
1 : 2 = 0 resto 1
da cui 1410 = 11102 .
Per convertire un numero da base 2 a base 10 bisogna scriverlo in notazione polinomiale scrivendo il numero della base con il simbolo che gli corrisponde nel sistema decimale (2) se prendiamo il numero precedente
11102 si ha 1 ∙ 23 + 1∙ 22 +1∙ 21 +1∙ 20 quindi 1 ∙ 8 + 1 ∙ 4 +1 ∙ 2 + 0 ∙ 1 = 1410
Altri sistemi di numerazione
Esistono anche altri sistemi di numerazione che il nostro elaboratore può usare. Essi sono il codice ottale, cioè a base 8 e il sistema esadecimale, a base 16.
IL CODICE OTTALE
La numerazione ottale, ovvero in base otto, si avvale di otto cifre per rappresentare i valori: da zero e sette. La tecnica di conversione di un numero ottale in un numero decimale è la stessa mostrata a titolo esemplificativo per il sistema decimale, con la differenza che la base di numerazione è otto.
Per esempio, per interpretare il numero ottale 123458, si procede come segue: 5 ∙ 80 + 4 ∙ 81 + 3 ∙ 82 + 2 ∙ 83 + 1 ∙ 84. Pertanto, lo stesso numero si potrebbe rappresentare in base 10 come 5349.
Al contrario, per convertire il numero 5349 (qui espresso in base 10), si può procedere nel modo seguente: 5 349/8=668 con il resto di cinque; 668/8=83 con il resto di quattro; 83/8=10 con il resto di tre; 10/8=1 con il resto di due; 1/8=0 con il resto di uno. Ecco che così si riottiene il numero ottale 12.3458
IL CODICE ESADECIMALE
La numerazione esadecimale, ovvero in base 16, funziona in modo analogo a quella ottale, con la differenza che si avvale di 16 cifre per rappresentare i valori, per cui si usano le cifre numeriche da zero a nove, più le lettere da «A» a «F» per i valori successivi. In pratica, la lettera «A» nelle unità corrisponde al numero 10 e la lettera «F» nelle unità corrisponde al numero 15.
La tecnica di conversione è la stessa già vista per il sistema ottale, tenendo conto della difficoltà ulteriore introdotta dalle lettere aggiuntive. Per esempio, per interpretare il numero esadecimale 19ADF16, si procede come segue: 15 ∙ 160 + 13 ∙ 161 + 10 ∙ 162 + 9 ∙ 163 + 1 ∙ 164.
Pertanto, lo stesso numero si potrebbe rappresentare in base 10 come 105 183. Al contrario, per convertire il numero 105.183 (qui espresso in base 10), si può procedere nel modo seguente: 105.183/16=6.573 con il resto di 15, ovvero F16; 6.573/16=410 con il resto di 13, ovvero D16; 410/16=25 con il resto di 10, ovvero A16; 25/16=1 con il resto di nove; 1/16=0 con il resto di uno. Ecco che così si riottiene il numero esadecimale 19ADF16.
Codifica delle Informazioni
Le informazioni possono essere memorizzate e comunicate in vari modi, ma sono solo due i tipi comunemente usati: analogico e digitale. Analogico è quando l'informazione è memorizzata come un segnale continuo, come le onde sonore o le fluttuazioni di tensione. Digitale è dove i valori discreti sono usati per rappresentare le informazioni, per esempio, il codice binario (0 e 1). Codificare significa convertire i dati digitali in un formato che può essere memorizzato, trasmesso o elaborato.
CODIFICA DEL TESTO
Una codifica di caratteri è un modo di rappresentare il testo in forma digitale. Specifica come i dati binari sono convertiti in codici che possono essere letti come caratteri dagli esseri umani, e interpretati dai computer. La codifica del testo è possibile grazie al codice ASCII.ASCII è l'acronimo di American Standard Code for Information Interchange, un insieme di simboli usati per rappresentare lettere, numeri e segni di punteggiatura. La codifica ASCII è un modo per rappresentare tutti questi caratteri in una forma che i computer possono capire. Inizialmente il codice ASCII era formato da 25 combinazioni, cioè 32.Successivamente con l'ASCII ESTESO siamo arrivati dalle 26 combinazioni alle 232 con l'UNICODE, un codice che riassume tutti i simboli e linguaggi usati dall'essere umano. La tabella ASCII rappresenta ogni carattere assegnandogli un numero, per esempio, il carattere spazio è rappresentato dal codice ASCII 32, mentre alla lettera Z maiuscola è assegnato il 90. Quando invii dati su Internet o li memorizzi sul tuo computer, stai usandola codifica ASCII per risparmiare tempo e spazio di memorizzazione.

CODIFICA DELLE IMMAGINI IN BIANCO E NERO
Il termine codifica delle immagini si riferisce alla tecnica con cui le informazioni all'interno di un'immagine vengono registrate e memorizzate digitalmente. Il processo di codifica di un'immagine implica prendere l'immagine originale e convertirla in un formato che può essere utilizzato da un particolare dispositivo. Questo processo rende possibile visualizzare le immagini digitali, convertirle in altri formati e salvarle per un uso futuro.
Per codificare un'immagine in bianco e nero, il nostro elaboratore la suddivide in una griglia formata da righe orizzontali e verticali. I quadratini della griglia sono chiamati pixel (picture elements) e sono intesi come unità costituenti dell'immagine. La codifica di un'immagine consiste nella codifica dei pixel in cui viene scomposta l'immagine. Assumiamo che un pixel sia codificato con un singolo bit che vale:
• 0 se nel pixel il bianco è predominante
• 1 se nel pixel il nero è predominante
La rappresentazione sarà più fedele all'aumentare del
numero di pixel, ossia al diminuire delle dimensioni dei quadratini della
griglia in cui è suddivisa l'immagine. Il numero di pixel in cui è suddivisa
un'immagine si chiama risoluzione e si esprime con una coppia di numeri ad es.
640 × 480 pixel (orizzontali × verticali).


Assegnando un bit ad ogni pixel è possibile codificare solo immagini senza livelli di chiaroscuro. Le immagini in bianco e nero hanno diversi livelli di intensità di grigio. Per codificarle, si usa la stessa tecnica: per ogni pixel si stabilisce il suo livello medio di grigio. A tale livello viene assegnata convenzionalmente una rappresentazione binaria. ogni pixel è codificato con un numero di bit > 1. Se utilizziamo quattro bit possiamo rappresentare 24=16 livelli di grigio, se utilizziamo otto bit ne possiamo distinguere 28=256 e così via.
CODIFICA DELLE IMMAGINI A COLORI
Le immagini a colori possono essere codificate dal nostro elaboratore attraverso due metodi:
- Raster, informazione grafica rappresentata come matrice di pixel
- Vettoriale, informazione grafica rappresentata da relazioni matematiche (funzioni che descrivono luoghi di punti)
Le immagini Raster quando vengono ingrandite perdono di qualità, ma occupano meno spazio, invece le immagini vettoriali possono essere ingrandite alla fine ma occupano molto spazio all'interno dell'elaboratore.
I colori possono essere trasformati in numeri binari attraverso la codifica RGB. Qualsiasi colore può essere rappresentato dalla composizione del Rosso, del Verde e del Blu (colori primari). Ogni pixel viene rappresentato con una combinazione (mescolanza) dei tre colori. Rappresentando ogni colore primario con 8 Bit (1 Byte) allora 3 Byte per ogni Pixel. Con 8 bit per ogni colore primario rappresentiamo 28 =256 sfumature per ogni colore e quindi, con la codifica RGB riusciamo a rappresentare 256 x 256 x 256 = 16.777.216 colori diversi (truecolor).
FORMATI PER LE IMMAGINI
I formati immagine definiscono come un'immagine è codificata in un file. Ci sono due tipi principali di formati immagine: lossy e lossless.
Lossy, quando alcuni dati possono essere persi durante il processo di codifica. Alcuni esempi di formati lossy sono:
- JPEG
- PNG
- GIF
- TIFF
Questi file sono compressi per ridurre le dimensioni dei file. Mentre questo li rende più piccoli e più veloci da scaricare, c'è una inevitabile perdita di qualità dell'immagine con ogni ciclo di compressione. Questa perdita non può essere invertita, i formati lossy sono più adatti per immagini che hanno bassi livelli di dettaglio, sono adatti all'uso sul web e alla creazione di miniature.
Lossless, dove i dati non vengono persi durante il processo di codifica. Esempi di formati lossless sono BMP, SVG, TGA e ICO. I formati senza perdita sono più adatti per le immagini che contengono grandi livelli di dettaglio, come ad esempio i loghi.
CODIFICA DEI SUONI
Il suono è un'onda sonora che cambia in base alla pressione nell'aria e che viene percepita dal nostro orecchio e viene invio come stimolo al cervello. I suoni costituiscono con cui stiamo costantemente a contatto, e possono essere rappresentati in forma digitale.
Ogni suono per essere diverso da un'altro deve avere le caratteristiche della vibrazione ovvero:
- Intensità
- Durata
- Frequenza
L'intensità di un suono descrive l'ampiezza delle variazioni dell'onda sonora e fornisce una misura dell'energia trasportata dall'onda sonora e si misura in decibel (dB)
L'altezza di un suono è il parametro legato alla sensazione di gravità/acutezza che si percepisce di un suono. Dipende dalle frequenze di variazione delle onde elementari che compongono l'onda sonora.
Le frequenze si misurano in Hertz (Hz)
Le fasi fondamentali per la digitalizzazione sono tre:
- campionamento
- quantità di campione o digitalizzazione
- codifica

CAMPIONAMENTO E QUANTITA' DI CAMPIONE
Si effettuano dei campionamento sull'onda sonora (cioè si misura il valore dell'ampiezza dell'onda a intervalli costanti di tempo) e si codificano in forma digitale le informazioni estratte da tali campionamenti. Quanto più frequentemente viene effettuato il campionamento dell'onda, tanto più precisa sarà la sua rappresentazione. Riducendo l'intervallo di tempo tra due campionamenti aumenta l'accuratezza del segnale, ciò corrisponde a una quantità di informazione, cioè a un maggior numero di campione nell'unità di tempo.
Un maggior numero di campione richiede una maggiore quantità di memoria e una superiore velocità di trasferimento dati. Il tasso di frequenza deve essere almeno il doppio della frequenza massima presente nel segnale in ingresso, questo tasso di campionamento è detto tasso di Nyquist.
La quantizzazione e' appunto l'operazione di assegnare valori discreti per descrivere un segnale continuo, più bit vengono usati, tanto più e' accurata la quantizzazione effettuata. Questo perché nella quantizzazione il rapporto segnale/rumore è proporzionale al numero di bit adoperati con una riduzione del "rumore di quantizzazione" in misura di 6 db per ogni bit adoperato.
I valori più ricorrenti di digitalizzazione attualmente usati vanno da un minimo di 8 bit per campione in campo telefonico (range dinamico del segnale suddiviso in 256 intervalli), fino a 20 e più bit per campione (range dinamico del segnale suddiviso in un milione e più di intervalli).
Naturalmente all'aumentare del numeri dei bit per campione aumenta la fedeltà del segnale campionato alla forma d'onda originale e si riduce l'imprecisione introdotta dalla quantizzazione. Dopo questi processi, la sequenza dei valori numerici ottenuta dai campioni può essere facilmente digitalizzata e resa disponibile agli utenti.
Il sistema operativo
Il sistema operativo è un software di base che permette all'utente di interfacciarsi con l'elaboratore. Se non ci fosse il sistema operativo non potremmo usare il nostro elaboratore. Esso è situato prima dell'accensione nelle memorie di massa (Hard Disk, DVD, CD e chiavette USB).
All'accensione il processore va a leggere il firmware della ROM (Bios). Il firmware è un software che esegue compiti specifici all'interno di un elaboratore. Il processore carica il sistema operativo nella RAM. Nella RAM c'è il software che stiamo attualmente utilizzando. Questo processo di caricamento è chiamato Bootstrap. I sistemi operativi più utilizzati sono MAC OS, Windows, IOS, Linux.
Il sistema operativo è formato a strati come una cipolla:
CORE (KERNEL), costituisce il nucleo o cuore di un sistema operativo, ovvero il software che fornisce un accesso sicuro e controllato dell'hardware ai processi in esecuzione sul computer;
GESTORE MEMORIA, gestisce la RAM e lo scambio delle informazioni tra il CORE e le periferiche di input/output;
GESTIONE I/O, gestisce le periferiche;
GESTIONE FILE (FILE SYSTEM), gestisce le informazioni file sul disco (crea, salva, elimina) e assegna delle estensioni ad ogni file
APPLICAZIONE, sono programmi informatici impiegati per l'automatizzazione di ufficio o per altre utilità.

IL KERNEL
Il kernel si trova al centro del sistema operativo e controlla tutte le funzioni più importanti di un hardware, sia che si tratti di un sistema Linux, macOS o Windows, di uno smartphone, un server. Un kernel accompagna e guida tutto il percorso dall'hardware del sistema al software applicativo. Il suo lavoro finisce dove inizia l'accesso dell'utente: con la Graphical User Interface (GUI), l'interfaccia grafica utente.
Il kernel confina così direttamente con la shell (cioè con l'interfaccia utente). Si può pensare al kernel come a un nucleo e alla shell come a un anello intorno a quel nucleo. Il principale compito del kernel è l'elaborazione parallela di diversi processi, ovvero il multitasking. Da un lato, devono essere rispettati i limiti temporali e, dall'altro, un kernel deve rimanere aperto per ulteriori applicazioni ed estensioni.
IL GESTORE MEMORIA
Il gestore della memoria è un componente del sistema operativo dedicato alla gestione della memoria primaria disponibile sul computer. Il gestore si preoccupa di allocare, deallocare e gestire la memoria che viene assegnata agli applicativi e allo stesso sistema operativo. Allocare vuol dire memorizzare qualcosa, deallocare significa rimuovere qualcosa dalla memoria.
LA GESTIONE DELLE PERIFERICHE
Uno dei compiti principali di un sistema operativo è la gestione ed il controllo dei dispositivi di input/output. Esiste una incredibile varietà di dispositivi di I/O largamente diversi per funzioni e velocità. I metodi di controllo di tali dispositivi sono quindi altrettanto diversi. L'insieme di tali metodi costituisce il sottosistema di I/O del nucleo (kernel) di un sistema operativo. Questo sottosistema di I/O del nucleo è strutturato in moduli chiamati driver, che incapsulano le particolarità e i dettagli dei vari dispositivi. Nonostante l'incredibile varietà dei dispositivi di I/O bastano pochi concetti per capire come tali dispositivi sono connessi al sistema di calcolo e come il sistema operativo li controlla:
Porta (punto di connessione)
Bus (meccanismo di connessione)
Controllore (controlla porte, bus o dispositivi)
Una porta di I/O è formata tipicamente da quattro tipi di registri:
status: insieme di bit che possono essere letti e indicano lo stato della porta (errore, fine operazione corrente, etc.)
control: insieme di bit di controllo che può essere scritto per attivare un comando
data-in: letto dalla CPU per ricevere dati
data-out: scritto dalla CPU per emettere dati
IL FILE SYSTEM
Il File System è quella parte del S.O. che si occupa di gestire e strutturare le informazioni memorizzate su supporti permanenti (memoria secondaria). I file vengono utilizzati come supporto per la memorizzazione dei programmi (sia programmi di sistema che programmi utente) e dei dati. Un file è una collezione di informazioni e deve avere un nome logico. Il File System assegna un'estensione ad ogni file. Le estensioni sono importanti perché di solito indicano il tipo del file e danno informazioni sul programma applicativo in grado di manipolarlo. Un insieme di operazioni minimale, presente in tutti i sistemi è il seguente:
creazione di un file
cancellazione di un file
copia o spostamento di un file
visualizzazione del contenuto di un file
stampa di un file
modifica del contenuto di un file
ridenominazione di un file
visualizzazione delle proprietà di un file
Il numero di file che devono essere memorizzati su un disco può essere molto elevato. È quindi necessario mantenere un elenco ordinato elenco ordinato dei file. Essi quindi devono essere raggruppati in sottoinsiemi, che vengono memorizzati all'interno di contenitori detti cartelle o directory. Per organizzare gerarchicamente i file, il sistema operativo deve fornire all'utente un insieme di operazioni sulle directory, per esempio: creare una nuova directory, rimuovere una directory, rinominare una directory, elencare il contenuto (l'insieme di file e sottodirectory) della directory, copiare o spostare i file da una directory ad un'altra. Nel caso di un'organizzazione gerarchica a più livelli il solo nome non è più sufficiente per identificare il file. Il nostro elaboratore a questo punto si serve dell'intera sequenza di directory che contengono un file. Questo "percorso" è chiamato Path.
APPLICAZIONE
Il termine applicazione in informatica individua un software installato o una serie di software in fase di esecuzione su un computer con lo scopo e il risultato di rendere possibile una o più funzionalità, servizi o strumenti utili e selezionabili su richiesta dall'utente tramite interfaccia utente, spesso attraverso un'elaborazione a partire da un input fornito dall'utente interagendo con esso. Risultato a livello utente dalla combinazione di risorse software e rispettive risorse hardware di processamento per la loro esecuzione, l'installazione delle applicazioni avviene tramite store ufficiali o alternativi.

Nel caso di un dispositivo mobile il termine applicazione è sostituito più comunemente con il termine app. Tipicamente le applicazioni espongono i loro servizi all'utente attraverso un'interfaccia grafica dedicata composta tipicamente da un panel principale dell'applicazione e relative finestre ad interattività con l'utente tramite mouse e tastiera, pulsanti compresi in barre degli strumenti, barra dei menù, barra di scorrimento ecc. variamente disposte e spesso anche personalizzabili.
TIPI DI SOFTWARE
Tutti i software presentano un piano di utilizzo per gli utenti. Essi si servono delle licenze d'uso, cioè un permesso per utilizzarlo per un determinato periodo di tempo. Esistono varie licenze:
-LICENZA LIFETIME, quando si compra un software e lo si ha per sempre;
-LICENZA EXPIRED TIME, è una licenza a scadenza e che poi va rinnovata;
I software FREEWARE e FREE SHARE possono essere utilizzati gratuitamente, ma spesso sono versioni di prova o con funzionalità ridotte. Questo spinge l'utente a comprare il software completo. I software OPEN SOURCE, sono aperti, gratuiti, modificabili e condivisibili. Recentemente gli utenti utilizzano molto i software ON PLATFORM, cioè disponibili online senza scaricarli sull'elaboratore e senza occupare spazio come ad esempio Documenti Google.
La risoluzione dei problemi
In Informatica per risolvere i problemi ci serviamo di due tipi di approcci: l'approccio euristico, più efficace ma con più margine di errore, e l'approccio algoritmico, più lento ma con una percentuale di successo molto elevata.
APPROCCIO EURISTICO
La programmazione euristica è un approccio alla risoluzione dei problemi che utilizza metodi di prova ed errore per trovare una soluzione probabile a un determinato problema. La programmazione euristica è un approccio efficace alla risoluzione dei problemi perché è in grado di trovare soluzioni in modo rapido, senza dover cercare in modo esaustivo tutte le soluzioni possibili.
Non è garantito che trovi la migliore soluzione possibile come l' algoritmo e non è adatta a problemi di grandi dimensioni poiché il numero di soluzioni possibile può diventare ingestibile. In tale contesto, in informatica, si parla di euristiche o di metodi o procedimenti euristici per indicare algoritmi che in dati problemi, per esempio di ricerca, si avvicinino con buona probabilità alla soluzione cercata.

APPROCCIO ALGORITMICO
Cos'è un algoritmo? E' una sequenza di istruzioni che, seguite nel giusto ordine, partendo da specifici input consente di ottenere un determinato risultato. Il concetto di algoritmo ha origini millenarie, ma il suo potenziale si è scatenato quando ha incontrato l'informatica e l'automazione. Il primo algoritmo informatico è stato ideato dalla matematica britannica Ada Lovelace nella prima metà dell'800, per il calcolo dei numeri di Bernoulli.
La versatilità degli algoritmi ha semplificato sempre di più la nostra quotidianità, permettendoci di vivere in un presente dove le macchine si guidano da sole, in cui possiamo cercare e trovare un'infinità di informazioni in tempi brevissimi, delegare lavori ripetitivi o pericolosi a macchinari altamente specializzati. Probabilmente gli algoritmi non saranno la soluzione a ogni nostro problema, ma se utilizzati nel modo corretto contribuiranno a rendere concrete le idee che daranno forma al nostro futuro.
Gli Algoritmi
In matematica e informatica un algoritmo è la specificazione di una sequenza finita di operazioni che consente di risolvere tutti i quesiti di una stessa classe o di calcolare il risultato di un'espressione matematica.
L'algoritmo è un concetto fondamentale dell'informatica, anzitutto perché è alla base della nozione teorica di calcolabilità: un problema è calcolabile quando è risolvibile mediante un algoritmo.
Inoltre, l'algoritmo è un concetto cardine anche nella fase di programmazione dello sviluppo di un software: preso un problema da automatizzare, la programmazione costituisce essenzialmente la traduzione o codifica di un algoritmo per tale problema in programma, scritto in un certo linguaggio, che può essere quindi effettivamente eseguito da un calcolatore rappresentandone la logica di elaborazione.

CARATTERISTICHE DI UN'ALGORITMO
Per potersi definire algoritmo un programma deve essere:
- finito: costituito da un numero finito di istruzioni e deve sempre terminare;
- deterministico: partendo dagli stessi dati in ingresso, si devono ottenere i medesimi risultati;
- non ambiguo: le operazioni non devono poter essere interpretate in modi differenti;
- generale: deve essere applicabile a tutti i problemi a cui si riferisce;
- completo: deve risolvere tutti i problemi di un dato dominio;
COME POSSIAMO RISOLVERE UN PROBLEMA DI INFORMATICA ATTRAVERSO GLI ALGORITMI?
Innanzitutto, la prima cosa che si fa è quello di analizzare il problema basandoci su due metodi; entrambi sono strategie di elaborazione delle informazioni e ordinamento della conoscenza, utilizzate in una varietà di campi tra cui software, teorie umanistiche e scientifiche, gestione e organizzazione. In pratica, possono essere visti come uno stile di pensiero, insegnamento o leadership.
Questi due metodi sono:
- Il metodo top-down
- Il metodo bottom-up

ll metodo top-down (in italiano si traduce con:<<dall'alto verso il basso>>) è basato su un approccio di decomposizione. In questo metodo l'obbiettivo è suddividere il problema più grande in unità più piccole (chiamate moduli) e ripetere il processo con ogni problema. Viene rappresentato con una struttura ad albero in cui la radice è il nodo più alto del problema e le foglie i sotto problemi in cui viene suddiviso. Questo algoritmo ha anche uno svantaggio è quello che non sempre è possibile suddividere il problema in una serie di problemi più piccoli.
Il metodo bottom-up ( in italiano si traduce con <<dal basso verso l'alto>>) è basato sull'approccio compositivo. In questo metodo l'obiettivo principale è identificare e risolvere i problemi più piccoli e quindi integrarli insieme per risolvere il problema più grande. Questo algoritmo ha anche uno svantaggio è quello che a volte è abbastanza difficile identificare la funzionalità generale del sistema nelle fasi.
I diagrammi di flusso
In informatica il diagramma di flusso è una rappresentazione grafica delle operazioni da eseguire per l'esecuzione di un algoritmo. Ogni singolo passo è visualizzato tramite una serie di simboli standard.
Esso consente di descrivere tramite un linguaggio di modellazione grafico:
- le operazioni da compiere;
- la sequenza nella quale devono essere compiute, rappresentata con frecce di collegamento.
Per questa loro connotazione topologica i diagrammi di flusso possono essere ricondotti alla classe più ampia dei diagrammi a blocchi, che a loro volta rientrano nell'ancora più vasta categoria delle mappe concettuali, utilizzate soprattutto per la descrizione e la rappresentazione delle informazioni e della conoscenza.

AlgoBuild
AlgoBuild è un software didattico pensato per lo studio della programmazione e degli algoritmi.
Presenta un ambiente visuale in cui realizzare i flow-chart rispettando le regole della programmazione strutturata.
Se le istruzioni vengono inserite rispettando una opportuna sintassi è possibile eseguire il programma in modalità passo-passo o temporizzata seguendo l'esecuzione delle istruzioni, il calcolo dei valori, le operazioni di input e output.
A differenza dei classici editor di flow chart, serve a progettare programmi e non solo a disegnare. Si utilizzano le istruzioni del linguaggio come output, input, assegnazione, test condizionali, cicli per mezzo di comandi visuali. L'attenzione è posta sulla logica del programma più che sulla sua forma grafica. Le istruzioni possibili sono quelle tipiche della programmazione strutturata.
Una volta terminati, i programmi possono essere eseguiti all'interno dell'ambiente grafico.
Può essere utilizzato in laboratorio, in classe con la Lavagna Interattiva Multimediale e a casa dagli studenti. È anche un utile strumento per i docenti perché permette di sviluppare i diagrammi molto rapidamente e quindi consente la preparazione del materiale didattico in breve tempo.
AlgoBuild è dedicato all'apprendimento della programmazione secondo il paradigma imperativo, quello dei linguaggi più comuni come C, Java, C#, Pascal, Basic...
Quando si deve imparare a programmare è necessario acquisire prima di tutto una serie di strumenti che consentano di analizzare un problema ed esprimere la sua soluzione in termini astratti.
Per questo, fin dagli albori dell'Informatica, sono stati adottati dei linguaggi di progetto che permettano di esprimere questa soluzione e valutarla prima di passare alla stesura definitiva (implementazione) del programma vero e proprio.
I linguaggi di progetto più diffusi si basano su Diagrammi di Flusso (Flow Chart) e Pseudo Codifica.
AlgoBuild serve proprio, per mezzo di comandi semplici e intuitivi, a realizzare progetti per mezzo sia della modalità grafica che testuale. Inoltre c'è la possibilità, usando la sintassi opportuna, di collaudare direttamente all'interno dell'ambiente il funzionamento del programma. Durante l'esecuzione vengono visualizzate le variabili e la traccia delle istruzioni eseguite.

COME DISEGNARE UN DIAGRAMMA DI FLUSSO
Ogni Diagramma di Flusso si crea mettendo all'inizio un'ovale con all'interno la scritta "START MAIN"

Tra un'istruzione e l'altra va messa una freccia che indica la direzione dell'algoritmo

Nel parallelogramma si inseriscono o si visualizzano dati e informazioni. Può essere in input o in output


Per inserire delle operazione o degli assegnamenti con i dati immessi, si usa il rettangolo

Per esprimere una condizione, vera o falsa, si utilizza la figura geometrica del rombo

I cicli: For, Do-While e While-Do
In un algoritmo abbiamo spesso bisogno di eseguire la stessa azione più volte di fila. Ad esempio, quando abbiamo bisogno di ritornare, una dopo l'altra, della merce da una lista; o anche solo eseguire lo stesso codice per ogni numero da 1 a 10. I cicli sono un modo di ripetere una stessa parte di codice più volte.
CICLI PRE-CONDIZIONALI E POST-CONDIZIONALI
I cicli non sono tutti gli stessi. Una prima distinzione, possiamo farla in base a dove viene posizionato il blocco condizionale contenete la/le variabile/i guida:
- ciclo pre-condizionale (La condizione è posta in testa), come i cicli "For e While-Do"
- ciclo post-condizionale (la condizione è posta in coda), come il ciclo "Do-While"
CICLO WHILE-DO
Il ciclo while-do o semplicemente while è un ciclo pre-condizionale che funziona per condizione vera, ovvero che cicla finché la condizione non diventa falsa.
Procedimento del while:
- Entra nel ciclo, verificando la condizione;
- Se la condizione è vera (T), esegue i blocchi sottostanti. Una volta terminati, torna all'inizio del ciclo e verifica di nuovo la condizione;
- Se la condizione è falsa, esce dal ciclo.

CICLO DO-WHILE
Il ciclo do-while è un ciclo post-condizionale ed è una specie di seconda versione del ciclo while. La differenza sta nel fatto che il ciclo do-while, prima di verificare la condizione, esegue almeno una volta il blocco di istruzioni al suo interno.
Lo scopo principale dei cicli do-while è il controllo dell'input. Il ciclo do-while lavora sempre per condizione vera.

CICLO FOR
Il ciclo For permette di eseguire delle operazioni per un numero definito di volte e senza una condizione. Ad esempio, è possibile ripetere per tre volte un suono. Si distingue dal ciclo while in cui la ripetizione delle operazioni avviene in base ad una condizione (ad esempio: sin quando il valore è maggiore di zero, continua il ciclo). E' una scorciatoia utilizzata da alcuni linguaggi di programmazione. Altrimenti, è possibile realizzarla con un semplice ciclo a condizione iniziale while.

ESEMPIO PROBLEMA CON METODO TOP DOWN:
TRACCIA: Un parcheggio a pagamento è aperto dalle ore 6 alle ore 24 di ogni giorno della settimana. Le tariffe sono differenziate a seconda del tipo di veicolo in base al seguente schema:
1. auto piccole: 1 ora € 2,00, frazione successiva € 2,00;
2. auto grandi e medie: 1 ora € 3,00, frazione successiva € 2,00;
3. station wagon e SUV: 1 ora € 3,00, frazione successiva € 3,00;
4. furgoni: 1 ora € 4,00, frazione successiva € 3,00.
Dati gli orari di ingresso e di uscita e il tipo di veicolo, calcola l'importo da pagare.
RAGIONAMENTO:
1) inserire orario di ingresso e tipo di veicolo
1,1) in input inserire l'ora di ingresso
1.2) controllare se l'ora è compresa tra 6 e 24 attraverso un ciclo post-condizionale
1.3) scrivere in input i minuti di ingresso
1.4) controllare se i minuti sono compresi tra 0 e 59 attraverso un ciclo post-condizionale
1.5) scrivere in input l'ora di uscita
1.6) Controllare se l'ora é compresa tra 6 e 24 attraverso un ciclo post-condizionale
1.7) scrivere in input i minuti di uscita
1.8) controllare se i minuti sono compresi tra 0 e 59 attraverso un ciclo post-condizionale
1.9) inserire in input il tipo di veicolo
1.10) controllare se si tratta di autoMed o autoPic o Suv o Furg con ciclo post-condizionale
2) associare la tariffa al tipo di veicolo
2.1) se ora=0 e minuti <60 allora ora=1
2.2) se ora >0 e minuti>0 allora ora=ora+1
2.3) se autoPic; prezzo=2*ora
2.4) se autoMed; prezzo=2*(ora-1)+3
2.5) se SUV; prezzo= 3*ora
2.6) se Furg; prezzo=3*(ora-1)+4
3) mostrare prezzo in output
ALGORITMO:
