fabio ghidini — ghidini@ddattica.net
Il sistema di misura internazionale (SI) utilizza la notazione in base 10. Per esprimere misure di peso, lunghezza, capacità, etc., si utilizzano dei prefissi che rappresentano potenze di 10, o, meglio, potenze di 103. Ad esempio
1 kg = 1000 g, cioè 1 kg = 103 g
Da questo si evince che 1 kilo- = 103.
Di seguito sono riportati i prefissi standard utilizzati:
| Prefisso | Etimologia | Potenza | Valore |
|---|---|---|---|
| kilo- | dal greco khiloi = mille | 103 | 1 con 3 zeri (mille) |
| mega- | dal greco megas = grande, 'magno' | (103)2 = 106 | 1 con 6 zeri (un milione) |
| giga- | dal latino gigas = gigante | (103)3= 109 | 1 con 9 zeri (un miliardo) |
| tera- | dal greco teras = mostro | (103)4= 1012 | 1 con 12 zeri (mille miliardi) |
| peta- | dal greco pente = cinque, quinto- | (103)5= 1015 | 1 con 15 zeri (un milione di miliardi) |
| exa- | dal greco hex = sei, sesto- | (103)6= 1018 | 1 con 18 zeri (un miliardo di miliardi) |
| zetta- | dal latino, ultima lettera dell'alfabeto? | (103)7= 1021 | 1 con 21 zeri (mille miliardi di miliardi) |
| yotta- | dal latino, penultima lettera dell'alfabeto? | (103)8= 1024 | 1 con 24 zeri (un milione di miliardi di miliardi) |
I computer devono memorizzare delle informazioni, e per farlo utilizzano tutta una serie distinta di componenti:
Tutti questi sono componenti elettronici o supporti molto diversi tra loro per costruzione e funzionamento, ma hanno tutti lo stesso scopo: memorizzare le informazioni.
Ma cosa si intende col termine informazioni? Per informazioni si intendono i dati o i programmi che servono al funzionamento del computer. Ad esempio i dati potrebbero essere una lettera scritta, un libro, una serie di dati numerici che rappresentano una fattura, delle immagini, etc etc.
Sia che si tratti di dati che di programmi, sia che vengano memorizzati su un componente/supporto piuttosto che su un altro, essi devono essere memorizzati in un qualche genere di memoria, ed esistono delle unità di misura specifiche per misurare la memoria dei vari componenti/supporti (e per misurare la "quantità di informazione"). E' utile ribadire che tali unità di misura si applicano a tutti i componenti/supporti che memorizzano informazioni, anche se in realtà questi componenti funzionano in modi e con tecnologie molto diverse.
L'unità di misura base in informatica è il bit (dall'inglese
binary digit, cifra binaria). Il bit è un numero binario costituito
da una sola cifra, uno 0 o un 1. Nel calcolatore il valore del bit sarà
rappresentato da due distinte tensioni di funzionamento dei circuiti elettronici.
Cosa è possibile memorizzare in 1 bit? Molte cose:
In realtà è chiaro che in un bit è possibile memorizzare ben poca informazione. E in più bit? Supponiamo di avere una serie di 4 bit: nel primo potremmo memorizzare il valore on o off, nel secondo il valore maschio o femmina, nel terzo di nuovo maschio o femmina e nel quarto 0 o 1. Si noti infatti che ogni bit potrebbe avere diversi significati e quindi rappresentare diversi tipi di valori. E' il calcolatore che si incarica di 'risalire' al significato di ogni bit.
Un byte è costituito da una sequenza di 8 bit. Ad esempio 1101 1000bin è un byte.
Cosa è possibile memorizzare in un byte? Ad esempio:
Un word è costituito da 16 bit, cioè da2 byte.
Un double word è costituito da 32 bit, cioè da 4 byte. Cosa è possibile memorizzare in un double word?
Utilizzando i prefissi metrici standard del Sistema Internazionale saremmo portati a pensare che 1.000 byte corrispondano ad 1 KB (kilobyte):
1.000 byte = 1 KB ?
In realtà le cose stanno un po' diversamente. Come abbiamo visto, nel sistema binario si utilizzano le potenze di 2, e 1.000dec non è una potenza di 2! Ma se proviamo a calcolare le potenze di 2 scopriamo che:
210= 1.024dec
In informatica i prefissi metrici assumono sempre i valori di potenze di 2:
| Prefisso | Potenza di 2 | Potenza di 1024 | Valoredec |
|---|---|---|---|
| kilo- | 210 | 1.024 | 1.024 |
| mega- | 220 = 210x210 | 1.0242 | 1.048.576 |
| giga- | 230 = 210x220 | 1.0243 | 1.073.741.824 |
| tera- | 240 = 210x230 | 1.0244 | 1.099.511.627.776 |
| peta- † | 250 = 210x240 | 1.0245 | 1.125.899.906.842.624 |
| exa- † | 260 = 210x250 | 1.0246 | 1.152.921.504.606.846.976 |
| zetta- † | 270 = 210x260 | 1.0247 | 1.180.591.620.717.411.303.424 |
| yotta- † | 280 = 210x270 | 1.0248 | 1.208.925.819.614.629.174.706.176 |
† Attualmente tali prefissi non sono usati, ma lo saranno probabilmente in futuro quando i dispositivi di memorizzazione raggiungeranno capacità superiori.
Applicati al byte, si ottiene che:
| Unità di misura | Potenza di 2 | Valoredec |
|---|---|---|
| 1 bit | ||
| 1 byte | 8 bit | |
| 1 kilobyte (KB) | 210 byte | 1.024 byte |
| 1 megabyte (MB) | 220 byte | 1.048.576 byte (1 milione di byte) |
| 1 gigabyte (GB) | 230 byte | 1024 MB (1 miliardo di byte o mille milioni di byte) |
| 1 terabyte (TB) | 240 byte | 1024 GB (mille miliardi di byte o mille GB) |
| 1 petabyte (PB) | 250 byte | 1024 TB (mille TB) |
| 1 exabyte (EB) | 260 byte | 1024 PB (mille PB) |
| 1 zettabyte (ZB) | 270 byte | 1024 EB (mille EB) |
| 1 yottabyte (YB) | 280 byte | 1024 ZB (mille ZB) |
Si noti quindi che, ad esempio,
1 MB = 1.000.000 byte
bensì è
1 MB = 1.048.576 byte
In realtà in prima approssimazione è consuetudine considerare che 1 MB corrisponde a 1 milione di byte.
Ed a quanti bit corrisponde 1 MB?
1 MB = 1.048.576 byte = 8x1.048.576 bit = 8.388.608 bit
Analogamente si possono fare tutte le possibili equivalenze tra bit, byte e multipli di byte. Ad esempio:
3 Mb = 3 x 1.048.576 bit = 3 x 1.048.576 / 8 byte = 393.216 byte
Si noti che, dovendo fare moltiplicazioni e divisioni (tipicamente tra potenze di 2) è possibile utilizzare le proprietà delle potenze per facilitare i calcoli manuali. Ad esempio:
5 Mb = 5 x 220 bit = 5 x 220 / 8 byte
ma sapendo che 8 = 23 ed applicando le proprietà delle potenze ottengo che...
= 5 x 220 / 23 byte = 5 x 220-3 byte = 5 x 217 byte = 5 x 27 x 210 byte = 640 KB = 640 x 1.024 byte = 655.360 byte
ATTENZIONE: questa non è una trattazione rigorosa e tecnicamente corretta dell'argomento, ma solo una spiegazione concettuale.
La domanda è lecita... perchè 1 KB sono 1.024 byte e non 1.000? Perchè la memoria (ad esempio la RAM) è venduta in moduli multipli di 2 (4-8-32-64-128-256 MB)? Perchè questa inutile complicazione? La risposta deriva da alcuni motivi tecnologico-matematici.
Supponiamo di avere un calcolatore a 16 bit, con 128 KB di memoria RAM. Vogliamo calcolare la somma 6548dec + 187dec.
Che significa avere un calcolatore a 16 bit? Significa che il processore del computer è in grado di elaborare, per ogni ciclo di funzionamento, 16 bit alla volta (cioè 2 byte). Ad esempio può fare direttamente la somma di 2 numeri, ciascuno memorizzato in 16 bit.
Che range di valori può avere un numero memorizzato in 16 bit? Come
visto precedentemente, il range (per un numero positivo) memorizzato in 16 bit
va da 0dec a (216-1=65.535)dec.
In altri termini un processore a 16 bit potrebbe, ad esempio, sommare direttamente
2 numeri positivi il cui valore può andare a 0dec
a 65.535dec.
Quindi, dal momento che vogliamo sommare 6548dec + 187dec
(essendo entrambi compresi nel range), ciascuno di questi 2 numeri potrà
essere memorizzato in 16 bit.
Concentriamoci ora sulla memoria RAM. Il nostro calcolatore ne ha 128 KB, cioè 27 x 210 byte. Possiamo considerare la RAM come suddivisa in una serie di 'celle' di 16 bit ciascuna (cioè 2 byte): cominciando a numerarle da 0, c'è la cella 0 (costituita da 16 bit), la cella 1 (costituita da 16 bit), la cella 2, e così via. Il numero delle celle viene chiamato indirizzo.
Quante celle avremo in totale? Poichè la memoria è di 128 KB e le celle di 16 bit (2 byte) ciascuna, avremo 27 x 210 / 2 celle, cioè 26 x 210 celle, 64 x 210 celle (65.536 celle).
| Processore | 16 bit | Può elaborare contemporaneamente 16 bit per ciclo |
|---|---|---|
| Memoria | 128 KB | La memoria è suddivisa in 65.536dec celle da 16 bit ciascuna |
| Cella di memoria | 16 bit | 65.536 celle da 16 bit ciascuna, numerate da 0dec a 65.535dec. Ciascuna cella può memorizzare un numero nel range da 0dec a 65.535dec. |
Si noti l'ultima riga della precedente tabella:
E' una coincidenza il fatto che il range di valori che è possibile memorizzare in ogni cella (di 16 bit) coincide con il range di indirizzi delle celle di memoria? No, non lo è!
| (indirizzo cella)dec | (indirizzo cella)bin | dimensione |
|---|---|---|
| 0 | 0000 0000 0000 0000 | 16 bit |
| 1 | 0000 0000 0000 0001 | 16 bit |
| 2 | 0000 0000 0000 0010 | 16 bit |
| … | … | … |
| 65.535 | 1111 1111 1111 1111 | 16 bit |
Come fa il processore a recuperare dalla memoria i 2 numeri (6548dec e 187dec) su cui effettuare la somma? Ovviamente questi numeri saranno memorizzati da qualche parte nella RAM, cioè saranno memorizzati in 2 delle 65.536 celle di 16 bit, supponiamo rispettivamente nella cella di indirizzo 32dec e in quella di indirizzo 245dec.
Il fatto è che, in una cella di memoria (di 16 bit), possono essere memorizzati:
In altri termini, per recuperare i 2 numeri su cui effettuare la somma, il processore utilizza 2 celle di memoria (ovviamente diverse da quelle in cui sono inseriti i 2 numeri cercati) contenenti il numero 32dec e il numero 5.342dec, contenenti cioè gli indirizzi delle celle di memoria in cui ci sono i numeri voluti. Il processore tratterà questi 2 numeri come indirizzi, per accedere rispettivamente alle celle contenenti i numeri da sommare.
| (indirizzo cella)dec | (indirizzo cella)bin | dimensione | (contenuto)dec |
|---|---|---|---|
| 0 | 0000 0000 0000 0000 | 16 bit | ? |
| 1 | 0000 0000 0000 0001 | 16 bit | ? |
| 2 | 0000 0000 0000 0010 | 16 bit | ? |
| … | … | … | … |
| … | … | … | 32 |
| … | … | … | … |
| 32 | 0000 0000 0010 0000 | 16 bit | 6548 |
| … | … | … | … |
| 245 | 0000 0000 1111 0101 | 16 bit | 187 |
| … | … | … | … |
| … | … | … | 245 |
| … | … | … | … |
| 65.535 | 1111 1111 1111 1111 | 16 bit | ? |
Riassumendo:
Torniamo alla domanda di partenza: perchè 1 KB sono 1.024 byte e non 1.000? Perchè la memoria (ad esempio la RAM) è venduta in moduli multipli di 2 (4-8-32-64-128-256 MB)? Nel nostro esempio, perchè il nostro calcolatore a 16 bit ha 128 KB di memoria, e non ad esempio 100 KB?
Supponiamo che il nostro processore abbia 100 KB di RAM, suddivise in celle da 16 bit. Ogni cella potrebbe sempre memorizzare un numero nel range da 0dec a 65.535dec, ma in 100 KB di memoria ci sarebbero meno celle, cioè 51.200dec. In questo caso, quindi, ci sarebbe uno spreco di spazio inaccettabile: con 16 bit potrei memorizzare indirizzi da 0dec a 65.535dec, me avendo solo 51.200dec celle gli indirizzi da 51.200dec a 65.535dec sarebbero del tutto inutilizzati. Inoltre 51.200dec in binario non corrisponde a nessuna configurazione di bit particolare (tutti 0 tranne pochi 1, tutti 1, o configurazioni simili). In questo modo avrei tutte le celle che contengono indirizzi che non vengono sfruttate al massimo.
E' questo il motivo per cui la memoria viene costruita in moduli di capacità multipla di 2, proprio per sfruttare al massimo la capacità di indirizzamento di ogni cella di memoria. Anche avendo 16 bit e installando, ad esempio, 64 KB di memoria (multiplo di 2, 32.768dec celle di memoria), potremmo indirizzare tutte le celle con i primi 15 bit (lasciando il 16o a sinistra per altri scopi), avendo una configurazione di bit "comoda". Lo stesso si avrebbe con tutti i moduli di memoria di capacità multipla di 2.
Si noti quindi che c'è uno strettissimo legame tra
sistema binario ⇔ potenze di 2 ⇔ dimensioni delle celle di memoria ⇔ range di valori memorizzabili ⇔ indirizzi di memoria ⇔ dimensioni della RAM