vuoi
o PayPal
tutte le volte che vuoi
DOMANDE DAI TEMI D'ESAME
D I F O N D A M E N T I D I I N F O R M A T I C A 1
Si presentino i codici ASCII e UNICODE evidenziando la loro
utilità. Si dica se il codice ASCII è un codice ridondante,
motivando la risposta. Si presenti la distanza di Hamming anche in
relazione ai codici non ridondanti e a quelli ridondanti.
Sulla base della necessità di avere calcolatori che non trattano solo numeri ma
anche altri tipi di caratteri, sono stati inventati i codici. I Codici utilizzano
una codifica, ovvero una corrispondenza biunivoca tra elementi di alfabeti
diversi; in particolare un gruppo di elementi di un alfabeto più povero (meno
elementi) identificano un solo simbolo di un alfabeto più ricco. Definita C la
cardinalità (#elementi) dell'alfabeto ricco e n il numero di cifre disponibili
all'alfabeto povero per codificare l'altro, la codifica è possibile se e solo se:
C < o = 2^n; quindi se n > o = log(base2)C=M.
Se n=M l'alfabeto povero utilizza tutte le combinazioni possibili
se n>M il codice si dice ridondante e usa più cifre del necessario per codificare
l'alfabeto ricco.
La distanza di hamming è il numero minimo di elementi che differiscono da
una parola qualsiasi all'altra di un alfabeto. Se non c'è ridondanza H=1,
altrimenti H > o = a 1. I codici ridondanti si usano per rilevare e correggere
errori di trasmissione nei dati.
La codifica ASCII è la più utilizzata per la rappresetazione di caratteri
alfanumerici e ne esistono due versioni:
7 bit (+1 di parità per la correzzione di errori; H=2) che può quindi
rappresentare 128 simboli (2^7)
8 bit con 256 simboli, che aggiunge 128 simboli che però possono variare da
macchina a macchina, creando dei problemi di portabilità.
Il codice unicode utilizza invece diverse codifice a 16 bit (65536 simboli) e fu
introdotto per rappresentare ogni simbolo di tutti i linguaggi del pianeta.
ASCII non è ridondante poichè a ogni simbolo corrisponde una e una sola
combinazione di bit, e per giunta non vi sono configurazioni inutilizzate.
Si descriva l’architettura di una generica CPU evidenziando in
particolare le funzioni che vengono svolte dall’IR e dal
decodificatore e commentando il coinvolgimento delle risorse della
CPU durante la fase di fetch dell’istruzione.
La CPU (Central Processing Unit) è l'unità fondamentale di ogni calcolatore,
quella che di fatto compie le varie operazioni tra i dati.
Ha più componenti :
I Bus sono i collegamenti fisici attraverso i quali passano i segnali elettrici e
collegano le varie componenti della cpu o la cpu con l'esterno. Si dividono in
base al tipo di informazione trasportata: dati (bus dati), indirizzi di memoria
(bus indirizzi), istruzioni di controllo del processo o gestione delle priorità
(bus di controllo)
Inoltre per agire più velocemente sui dati, quelli di interesse in un certo
momento sono salvati in piccoli blocchi di memoria detti registri. Alcuni
registri inoltre sono specializzati per racchiudere un certo tipo di informazioni:
I Flag: registri che contengono un controllo sull'output di un'elaborazione per
verificare se è andata a buon fine e non vi sono errori
Il Program Counter : un registro che contiene sempre l'indirizzo dell'istruzione
successiva da eseguire (è un puntatore → punta all'istruzione successiva)
Lo stack Pointer invece contiene l'indirizzo della cima di uno stack pila,
particolare struttura di dati che torna utile nella gestione di chiamate a
sottoprogrammi.
L'IR (Instruction Register) è utilizzato invece per conservare il codice
operativo dell'istruzione da eseguire, da qui poi la sequanza di bit del op code
verrà decodificata per mezzo di un decodificatore che ricevute le n linee di
ingresso attiva i (2^n) circuiti appropriati per l'esecuzione dell'istruzione.
La alu infine è l'unità che svolge le operazioni aritmetiche e logiche tra
sequenze di bit, interagendo col registo dei flag per la rilevazione di errori.
Spesso utilizza un registro detto accumulatore nel quale mantiene
temporaneamente gli operandi o il risultato.
La fetch è la prima fase di esecuzione di un programma e consiste nel
prelevare dalla memoria tutto ciò che serve per far partire la decodifica e
l'esecuzione dell'istruzione.
In un primo momento il PC (Program Counter) punta all'istruzione da
eseguire che avrà un certo indirizzo di memoria, il quale viene trasferito in un
particolare registro della memoria (principale) detto MAR (Memory Address
Register) quindi verrà prelevata l'istruzione relativa all'indirizzo contenuto nel
MAR e messa in un altro registro della memoria, il MBR (Memory Buffer
Register).
A questo punto il PC si autoincrementa per puntare all'istruzione successiva
mentre il contenuto dell'MBR, l'istruzione stessa, verrà scomposta nei vari
campi e il codice operativo verrà immesso nell'IR. Se tutti gli operandi sono
pronti e l'op code è nell'IR, termina la fase di FETCH e inizia quella di
decodifica.
Si elenchino i tipi di istruzioni presenti tipicamente in una CPU
descrivendo in particolare le funzioni svolte dalle istruzioni di
“Controllo programma”.
In un calcolatore ci sono diversi tipi di istruzioni:
Aritmetiche
Logiche
Rotazione e Shift
Trasferimento dati
Controllo programma
Controllo macchina
Le istruzioni in genere sono memorizzate nel calcolatore usando un linguaggio,
intermedio tra il linguaggio di alto livello e il linguaggio macchina, detto
linguaggio assembler.
Le istruzioni di controllo programma sono quelle che vanno a modificare
l'ordine in cui le istruzioni di un programma vengono prelevate dalla
memoria. Se devo far partire un programma infatti questo verrà caricato dal
disco (memoria secondaria) in RAM, che è più veloce. Le istruzioni vengono
eseguite in maniera sequenziale, ma spesso è utile imporre delle decisioni al
calcolatore che possono andare a intaccare la sequenzialità, facendo si che
istruzioni successive debbano essere prelevate in altre zone della memoria
RAM (zone non contigue). Per far ciò si utilizzano le istruzioni di controllo
programma. Sono istruzioni di tipo SALTO e possono essere incondizionati;
ovvero a un certo punto del programma si salta all'inidirizzo indicato in ogni
caso, o condizionati; ovvero si salta a una certa istruzione solo se è verificata
una certa condizione. Inoltre possono essere con ritorno o meno; infatti non è
sempre necessario ritornare al punto in cui il programma aveva effettuato il
salto. Il salto può essere anche relativo a una posizione, in tal caso è
necessario riportare l'entità dello spostamento (displacement)
Salto condizionato JP -condizione-indirizzo
Salto incondizionato JP -indirizzo
Salto relativo incondizionato JR -displacement
Salto relativo condizionato JR- condizione-displacement
Le Istruzioni di salto con ritorno sono dei casi in cui un programma chiama
dei sottoprogrammi che ricevono i dati dal main, li elaborano e restutuiscono i
risultati al programma principale.
Nella chiamata a sottoprogramma è necessario non perdere il contenuto del
PC relativo all'istruzione successiva a quella in esecuzione nel main appena
prima della chiamata, questo costituirà l'indirizzo di ritorno e verrà salvato
come primo elemento (ultimo che uscirà) in una struttura stack pila.
Es. di salto con ritorno: Lo Stack Pointer viene decrementato per far spazio
all'indirizzo di ritorno che sarà PC+4( 4 byte = 1 word) SP-4 -> SP ; SP ->
MAR ; PC+4 -> MBR; MBR -> MAR
Con questi passaggi abbiamo liberato uno spazio nella stack pila per inserire
l'istruzione di ritorno (PC+4); a questo punto, essento il ritorno salvato nello
stack, possiamo scrivere l'indirizzo di inizio routine nel program counter.
Si dimostri perché l’operatore NOR sia considerato universale. Si
elenchino gli elementi usati dall’algebra di Boole, gli operatori e le
proprietà note.
L'operatore NOR si definisce universale perchè insieme all'operatore NAND
possono costituire tutte le operazioni di base dell'algebra booleana (AND,
NOT e OR). Questa si basa su due valori che possono essere on/off, 1/0,
Vero/Falso ecc...Si Basa su più operandi e le relative tabelle di verità indicano
per ciascuno degli ingressi il valore in uscita.
Esempio. AND: 1*1=1; 1*0=0*1=0*0=0
Si descrivano e si confrontino i sistemi operativi dedicati,
multiprogrammati e a condivisione di tempo (time sharing)
I sistemi operativi sono il software di base di ogni calcolaatore e sono
l'intermediario tra l'utente e la macchina. I primi calcolatori erano spaziosi e
molto costosi, per cui erano condivisi da molti utenti, e il fatto che questi
eseguissero un solo programma alla volta creava sempre lunghe attese tra gli
utilizzatori. Ogni programma doveva essere caricato sul calcolatore dalla
memoria di massa e il calcolatore doveva essere resettato. Per snellire queste
procedure si iniziarono a sviluppare i sistemi operativi. Quelli dedicati sono i
primi, e gestiscono ancora un solo programma alla volta, presentano un nucleo
semplice. Dopo ulteriori evoluzioni (batch-code di lavori riunite in un lotto ed
eseguite senza interruzioni) per gestire il problema della lentezza del
trasferimento di dati da massa, poichè la CPU più veloce rimaneva in attesa,si
passò ai sistemi operativi multiprogrammati che mentre eseguivano una task
preparavano l'altro tramite un canale che gestisce l'I/O, in particolare quando
viene richiesto da un processo un servizio di I/O da un programma in
esecuzione, l'esecuzione si blocca per gestire gli ingressi e parte un altra
operazione in attesa che i dati siano pronti. La coda è gestita secondo delle
priorità (scheduling) ma il sistema non differenzia tra programi che effettuano
maggiori accessi in memoria e sono quindi più lenti, da ciò deriva un
rallentamento nell'esecuzione. Per ovviare anche a questo problema si
svilupparono i sistemi operativi time sharing in cui il tempo di esecuzione
veniva diviso in quanti e a ogni quanto la cpu veniva riservata ciclicamente
per ogni programma, dando l'illusione di parallelismo dell'esecuzione.
Si descriva l’architettura di una generica CPU evidenziando in
particolare le funzioni che vengono svolte dall’IR e dall’unità di
controllo e commentando il coinvolgimento delle risorse della CPU
durante la fase di execute dell’istruzione. Si motivi infine la
necessità di prevedere un collegamento bidirezionale fra PC e bus