vuoi
o PayPal
tutte le volte che vuoi
GERARCHIE DI MEMORIA:
Accade com'è ragionevole pensare che la velocità di una memoria è inversamente proporzionale al suo prezzo. Pertanto la memoria (RAM e di massa) viene organizzata in gerarchie:
- Registri (max velocità, max costo, min capacità) nella CPU
- Cache
- RAM
- Disco magnetico
- Disco ottico
- Nastro (min velocità, min costo, max capacità)
Un sistema siffatto ha una capacità di memorizzazione pari alla capacità della memoria più lenta (che è elevata per i bassi costi), ma prestazioni non lontane da quelle di un sistema che abbia sola memoria veloce, ed il tutto ad un costo contenuto!
SCHEDA MADRE:
È un insieme di:
- CPU
- Connettori per inserire memoria
- Chip di supporto, prese per connettori I/O
- Vari bus
Un programma eseguito dalla macchina di von Neumann segue il ciclo fetch-decode-execute:
FETCH: La CPU legge dalla memoria la prossima istruzione da eseguire.
Per fare ciò,
L'unità di controllo (una parte della CPU) invia alla memoria, tramite il bus, la richiesta di una operazione di lettura, indicando l'indirizzo della cella che deve essere letta.
La memoria centrale (RAM) esegue l'operazione di lettura, inviando il valore letto all'unità di controllo.
DECODE: L'unità di controllo decodifica l'istruzione letta, ovvero ne determina il tipo e si prepara ad eseguirla.
EXECUTE: L'unità di controllo coordina tutti i componenti coinvolti chiedendo loro di eseguire delle micro-operazioni.
BIT: è una cifra binaria, ovvero è 0 oppure 1. Ogni bit è memorizzato in una cella elementare di memoria della RAM.
BYTE: equivale a 2^3 bit, ovvero 1 Byte = 8 bit.
Le possibili combinazioni degli otto bit in un byte sono 2^8 = 256.
Dunque 1 byte può essere utilizzato per rappresentare un valore tra 0 e 255.
Insomma, può rappresentare fino a 256 numeri, 256 caratteri, l'intervallo
-128,127ecc.E' utile pertanto assegnare un tipo ad ogni sequenza di bit: - Numeri naturali [0,255] 8 bit - Numeri interi [-128,127] 8 bit - Numeri e caratteri (ASCII) a più bit 16,32,64 bit - Valori logici di vero o falso MEMORIE DI MASSA: Sono usate per leggere dati e per conservare i programmi. All'atto dell'avvio di un programma i dati vengono trasferiti dalla memoria di massa alla RAM. Il sistema operativo, che è un particolare tipo di programma, si occupa del trasferimento di dati dalla memoria di massa alla RAM. Le memorie di massa sono più lente ed economiche rispetto alla RAM. Vediamo alcuni tipi: - Hard disk - Dischi ottici - Nastri magnetici - Floppy disk HARD DISK: Sono dei tipi di memoria di massa e sono organizzati in: - Tracce - Settori Un blocco è l'unità di informazione trasferita da disco a CPU. La loro natura è elettromeccanica, per cui sono lenti, anche se economici. Le loro prestazioni sono caratterizzate da: - Tempo diaccesso (ms)Seek time, la testina deve arrivare alla traccia, dipende dalla meccanicao (5-15 ms)
Latenza, il disco deve ruotare fino a portare il dato nella posizione giusta,o dipende dalla velocità di rotazione.
Transfer Rate (MBps), indica quanti dati vengono trasportati al secondoDipende dalla densità di registrazione e dalla velocità di rotazioneo Un settore di 512 byte richiede da 25 a 100 microsecondi.
Per aumentare tali prestazioni si aumentano i piatti presenti nel singolo hard diskoppure si memorizza l’informazione su più hard disk che vengono letti in parallelo.
Si esegue la deframmentazione, ovvero si ri-ordinano gli spazi liberi di memoria.
Da notare che le testine sono solidali e che vengono letti i settori di più dischi inun’unica operazione.
Un cilindro è l’insieme delle tracce lette contemporaneamente.
RAPPRESENTAZIONE DEI NUMERIPartiamo dalla base 10: essa è posizionale, ovvero è costituita da un
primo e scrivendoli in ordine inverso. Il numero in base 2 ottenuto sarà quindi (A6A5A4A3A2A1Ao) = (1111011).primo!(123)in base 10 è = (1111011) in base 2!
Ricordiamo ora che se ho n bit posso rappresentare 2^n numeri da 0 a 2^n – 1.
- Numeri interi senza segno
Utilizzo la notazione posizionale in base 2 su 2^2 cifre nell’intervallo [0,o 2^n-1]
- Numeri interi
Per codificare il segno ho bisogno di un bit. Il primo bit di sinistra vale 0o se è positivo e 1 se è negativo. Rappresento con n bit l’intervallo[-2^(n-1)+1 , 2^(n-1)-1]
ATTENZIONE!
Se faccio 101 +001 =110
In realtà tale numero non corrisponde a (-1) + 1 = 0, ma 110 vale -2.
Per non cambiare l’algoritmo della somma, il calcolatore non rappresenta i numeri in modulo e segno, ma utilizza il complemento a due.
Se x>=0, allora si usa la normale notazione posizionale su n bit
Se x<0, allora si prende il modulo e si scambiano gli 0 con gli 1 e viceversa e si somma 1
Con questo strumento non abbiamo la doppia rappresentazione di 10 e 00.
L’intervallo di rappresentazione va da [-2^(n-1),
2^(n-1)-1].Anche in questo caso comunque i numeri negativi iniziano per 1 da sinistra.Un numero rappresentabile in NP non è detto che lo sia in C2 (a parità di bit)
Esempio) Rappresentare in Notazione Posizionale (NP) su 4 bit il numero 33 = 1*2^0 + 1*2^1 + 0*2^2 + 0*2^3 = (0011)
Esempio) Rappresentare in NP e C2 in 2 bit il numero 2 e il numero -2
NP: (10) C2:(10)-2) NP: non rappresentabile C2: non rappresentabile in 2 bit
-2) in C2 su 4 bit invece è: |-2| = 2 = (0010) ==> (-2) in C2 = 1101 + 1 = 1110
PORTARE DA C2 A DECIMALE
Se X>=0 guardo la notazione posizionale
Se X<0 vale -|X+1|
Esempio) Quanto vale 0010 in decimale?
Esso è positivo (inizia per 0), vale semplicemente 0*10^0 + 1*10^1 + 0*10^2 +0*10^3 = 10
Esempio) Quanto vale 1110 in base 2?
Esso è negativo, devo fare – (0001)+1 = - 0010 = -2
Esempio) Sommare 0010 e 1110 in C2.
0010= 2, 1110 = -(0001)+1 = - 0010 = -2
0010+1110= il riporto di 1 viene perso, il numero risultante è
proprio 0 (2-2)0000
Notiamo che per leggere un numero dobbiamo sapere come viene codificata la memoria.
NOTAZIONE FLOATING POINT: serve per scrivere i numeri reali, ad esempio per scrivere 3,1 scrivo 31*10^(-1). Ho bisogno di parecchi bit, infatti uno mi serve per il segno, n per la mantissa (nel caso precedente era 31), e m per l'esponente. Il problema nasce quando c'è da fare m1*2^e1 + m2*2^e2, la ALU in realtà non fa la somma bit a bit ma usa un suo algoritmo.
PROGRAMMAZIONE JAVA
ECLIPSE: Ambiente di sviluppo per creare programmi Java. Esso permette di:
- Creare un progetto
- Creare una classe (un nuovo file .java)
- Scrivere il codice, compilarlo
- Eseguire il programma
Nello scrivere un programma in Java, si usano SEMPRE queste 3 grandi classi di elementi:
- White spaces (spazi bianchi)
- Comment (commenti che si mettono solo per il programmatore per facilitare la leggibilità)
- Token (elementi del linguaggio)
TOKEN: possono essere:
- Identificatori
- Keyword
IDENTIFICATORI: Sequenza di caratteri che NON inizia con una cifra, né sono una keyword. Tra essi riconosciamo il nome del programma, il System.out.println() ecc.
KEYWORD: hanno un significato preciso e particolare del linguaggio, nient'altro può essere chiamato come una keyword. (es. public, class, static, void, main, args)
LETTERALI: I letterali sono le costanti, ad esempio i numeri interi sono scritti come letterale intero, la sequenza di caratteri invece è un letterale stringa. I tipi di letterali sono:
- STRING
- INTERI
- FLOATING POINT
OPERATORI: sono usati tra una o più variabili (unari, binari)
- + somma, concatenazione tra stringhe
- - differenza
- * prodotto
- = assegnamento
- == verifico se ciò che è sinistra è uguale a ciò che è a destra
- != verifico se ciò che è a sinistra è diverso da ciò che a destra
- <=, <, >, >= simboli usati per verificare una
SEPARATORI: {} oppure []
STRINGHE: sequenze di caratteri UNICODE racchiusi fra “ ”.
TIPI PRIMITIVI/PREDEFINITI: sono tipi che contengono 1 sola variabile, i primitivi sono detti atomici, mentre quelli predefiniti sono quelli di Java. Tra questi tipi ricordiamo:
- Byte, int, long
- Float, double
- Boolean
- Char
TIPI DI RIFERIMENTO: Sono i tipi definiti dall’utente tramite le classi. In generale non sono “atomici”, ma costituiti da più valori.
VARIABILI: tutto ciò che può ricevere un valore. Per operare con le variabili è necessario definire il loro tipo.
NB: per accedere al valore di una variabile, questa deve essere INIZIALIZZATA, ovvero deve esserle dato un valore, anche di default.
VARIABILI DI RIFERIMENTO: oggetti. Per loro gli unici operatori ammessi sono:= == != .
VARIABILI LOCALI: sono quelle definite dentro il main con cui normalmente si
lavora.VARIABILI FORMALI (DI ISTANZA): sono quelle definite all'interno di una classe.
STRINGHE: Sono sequenze di caratteri. Costruzioni di una stringa:
String s = new String("ciao"); (tramite costruttore)
String a = "ciao"; (tramite assegnamento di un literal)
Vediamo alcuni metodi importanti definiti sulle stringhe:
- Int l = stringa.length(); ritorna la lunghezza della stringa
- char c = stringa.charAt(i); ritorna il carattere alla posizione i-esima (da sxconsiderando anche 0)
- boolean e=equals(string Str); ritorna un