How does my computer store things in memory? | Cerca per titolo, autore, parola chiave | ||||||||
How does my computer store things in memory? di Eric Raymond. Probabilmente, sapete già che un computer memorizza qualsiasi cosa come una sequenza (stringa) di bit (binary digit; una sequenza di interruttori spenti o accesi). Innanzitutto, occorre comprendere il termine word size (dimensione della parola) del computer. Tecnicamente, la word size del computer esprime la dimensione dei registri del processore. I registri del processore rappresentano l'area di memoria in cui il processore esegue i suoi calcoli. Un registro può contenere 32 o 64 bit. E questa diventa la dimensione della parola (word size) del vostro computer. Oggi, la gran parte dei computer lavorano a 64 bit. Nei primi anni 2000, molti PC lavoravano a 32-bit. Le vecchie macchine 286, negli anni 80, avevano dimensioni di parola di 16 bit. I mainframe di un tempo spesso raggiungevano i 36-bit. Il computer vede la memoria come una sequenza di parole (word), numerate da zero ad un valore massimo che dipende dalle dimensioni della memoria stessa. Quel valore, tuttavia, è dipendente anche dalla dimensione della parola (word size) del computer: le vecchie macchine 286 costringevano i programmatori a terribili contorsioni per poter gestire memorie grandi. I numeri interi vengono rappresentati da una o due word (parola), a seconda della dimensione di parola del processore. La più diffusa word è, oggi, di 64-bit. La rappresentazione dei numeri interi è a base due. Il bit meno significativo è 1, il successivo 2, il successivo 4 e così via. 00000001 00000010 00000100 Ma i numeri con segno vengono rappresentati nella notazione twos-complement, dove il bit più significativo indica il segno (più o meno): con il bit impostato (1), la quantità diventa negativa, con il numero negativo ottenuto dal suo corrispondente positivo, invertendo tutti i bit e aggiungendo 1. 00000011 (+3) 11111101 (-3) Ecco perchè, in una macchina a 64-bit, possono essere rappresentati i numeri con segno compresi nel range: -263 >> 263 -1 Il 64esimo bit viene usato come segno: 0 indica un numero positivo, 1 un numero negativo. Alcuni linguaggi di programmazione permettono l'uso dell'aritmetica senza segno, un'aritmetica realmente a base due, composta solo da numeri positivi. La gran parte dei processori di oggi e molti linguaggi di programmazione permettono l'uso dei floating-point number (che richiedono chip dedicati), grazie ai quali è possibile lavorare con i numeri decimali e frazionali. In genere, il numero viene codificato nella sua notazione scientifica, con una mantissa (per esempio: 1.234) e un esponente (per esempio: 23). L'esponente indica la potenza di 10 alla quale va moltiplicata la mantissa. Quindi, nel nostro esempio, il numero reale espresso avrà 20 zero, 23 meno le 3 cifre decimali. I caratteri vengono, normalmente, rappresentati come stringhe (sequenze) di sette bit, codificate in ASCII (American Standard Code for Information Interchange). Nei computer di oggi, ciascuno dei 128 caratteri ASCII è rappresentato nei 7 bit meno significativi (low seven bit) di un ottetto (8-bit: byte); gli ottetti vengono salvati nelle word di memoria: una stringa testuale di 6 caratteri, quindi, può essere conservata in una sola word di 64-bit. Il termine ottetto, pur essendo formalmente corretto, viene, in realtà, utilizzato raramente; molta gente utilizza il termine byte, al posto di ottetto, aspettandosi che un byte sia sempre composto da otto bit. in realtà, il termine ‘byte’ ha un significato più generale: esistevano macchine, per esempio, a 36 bit, dove il byte aveva dimensioni di 9-bit. Per quanto riguarda la codifica ASCII, c'è da precisare che, ormai, nella gran parte del pianeta, non può più essere usata, visto che non è in grado di rappresentare nemmeno le lettere accentate. Ci sono stati diversi tentativi, per risolvere questo problema: il più diffuso è quello di utilizzare anche l'ottavo bit, il più significativo, che ASCII non usa, portando a 256 il set di caratteri, con 128 caratteri nuovi a disposizione. La più usata tra queste estensioni di ASCII è il set di caratteri chiamato 'Latin-1' (o, più tecnicamente, ISO 8859-1). Latin-1 riesce a rappresentare le lingue dell'Europa dell'ovest: inglese, francese, tedesco, spagnolo, italiano, olandese, norvegese, svedese, danese, islandese, ma, per rappresentare lingue quali il greco, l'arabo, l'ebraico, l'esperanto, il serbo croato, si è dovuto ricorrere ad altre estensioni di ASCII, creando una serie di nuove codifiche: dal Latin-2 fino al Latin-9. La soluzione definitiva è rappresentata da uno standard omnicomprensivo: Unicode (e ISO/IEC 10646-1:1993). Nei primi 256 caratteri, Unicode è identico a Latin-1. Oltre a questi, in uno spazio aggiuntivo di 16 bit, Unicode riesce a rappresentare: greco, cirillico, armeno, ebraico, arabo, Devanagari, Bengali, Gurmukhi, Gujarati, Oriya, Tamil, Telugu, Kannada, Malayalam, Thai, Lao, georgiano, tibetano, giapponese Kana, il moderno coreano Hangul, oltre ad un set unificato di ideogramma cinesi, giapponesi, coreani (CJK). Le versioni recenti di Linux usano una codifica di Unicode chiamata UTF-8. In UTF, i caratteri 0-127 sono ASCII, mentre i caratteri 128-255 vengono usati solo in sequenze di 2, 3, 4 byte che identificano tutti i restanti caratteri non-ASCII. Come vengpono immagazzinate le informazioni sul disco fisso? La superficie del disco fisso è divisa in aree, molto simili a quelle che troviamo nei bersagli del gioco delle freccette: tracce circolari, a loro volta suddivise in settori. Naturalmente, visto che in prossimità dei confini esterni del disco fisso c'e' molto più spazio disponibile di quanto ce ne sia al centro del disco, intorno all'albero, le tracce più esterne contengono più settori di quanti ce ne siano nelle tracce più interne. Tutti i settori (o blocchi) hanno le stesse dimensioni, normalmente 1 KB (1024 byte da 8-bit) e ciascun settore, o blocco, ha un indirizzo univoco (disk block number). Unix divide il disco fisso in partizioni. Una partizione è un arco continuo di blocchi contigui che viene usato separatamente da ogni altra partizione, o come file system oppure come spazio di swap. Il motivo per cui originariamente vennero create le partizioni è un motivo di sicurezza: in un mondo in cui i dischi fissi erano molto più lenti e molto più esposti ad errore, le partizioni limitavano le porzioni di disco che potevano restare danneggiate, inaccessibili o corrotte da un casuale danneggiamento della superficie. La partizione più bassa come numerazione è spesso trattata in modo speciale, come partizione di boot, dove installare un kernel da caricare in memoria. Le partizioni utilizzate come aree di swap vengono trattate come una sequenza lineare di blocchi. Per i file system, invece, è necessario creare collegamenti tra i nomi di file e le sequenze di blocchi che li contengono. Queste sequenze di blocchi non sempre sono sequenze lineari: visto che i file possono essere modificati, un file può crescere, diminuire, modificarsi ed occupare, quindi, settori del disco non contigui, ma distribuiti casualmente nell'intero disco fisso. È questa distribuzione casuale dei blocchi che viene chiamata frammentazione. In un file system, la corrispondenza tra nome e blocchi è contenuta in una struttura chiamata i-node. Gli i-node vengono memorizzati nei blocchi adiacenti ai blocchi di numerazione più bassa di ogni file system (i blocchi di numerazione più bassa vengono utilizzati per l'amministrazione). Ogni i-node descrive un file. I blocchi di dati occupano i blocchi di numerazione più alta. Ogni i-node contiene l'elenco dei numeri (indirizzi) dei blocchi del disco occupati dal file che descrive (in realtà, questo non è del tutto vero, se non per i file di piccole dimensioni, ma per ora non ce ne preoccuperemo).Un i-node NON contiene il nome del file che descrive. I nomi dei file, infatti, vengono conservati nelle strutture chiamate directory, che conservano le corrispondenze tra nomi di file e numeri i-node. Ecco perchè, in Unix, un file può avere più nomi (o hard link); i differenti nomi puntano tutti allo stesso i-node. I Mount point. Nel caso più semplice, l'intero Unix file system risiede in un'unica partizione del disco fisso, ma questo accade raramente. Normalmente, il filesystem viene distribuito su più partizioni, in alcuni casi su partizioni montate su dischi fissi diversi. In una partizione, piccola, ci sarà il kernel, in un'altra, un po' più grande, ci saranno le utility (programmi) del sistema operativo, in una terza verranno installate le home directory degli utenti. La sola partizione alla quale avrete accesso immediatamente dopo il boot del sistema (accensione) è la vostra partizione root (radice), dove è installata la directory root del vostro file system, il top node (primo nodo) dal quale discende tutto il resto. Attenzione a non confondere la directory root, denominata: / con la directory dell'utente root, che è altra cosa ed è denominata: root Tutte le altre partizioni del sistema devono essere attaccate alla directory root, affinchè il sistema operativo possa raggiungerle. Nel corso del processo di boot, Unix renderà accessibili queste partzioni non-root, eseguendo un mount per ciascuna di esse, collegando ciascuna di esse ad una directory raggiungibile dalla partizione di root. Quindi, se, per esempio, avete una directory chiamata: /usr è probabile che si tratti di un mount point per una partizione che contiene diversi programmi utili a Unix, ma non necessari in fase di boot. Vediamo cosa accade quando apriamo un file, per esempio: /home/esr/WWW/ldp/fundamentals.xml Il kernel parte dalla radice del filesystem (la root partition) e cerca una directory chiamata: home che, normalmente, è un mount point per una partizione utente, posta da qualche parte. Nella struttura della directory di più alto livello di quella partizione utente, il kernel cercherà un record chiamato: esr dove troverà un numero di i-node. Verificando le informazioni contenute in quel i-node, il kernel scoprirà che i blocchi di dati associati a quel file sono, in realtà, una struttura di directory, struttura all'interno della quale il kernel cercherà la directory: WWW Anche lo i-node di questa directory rivelerà una struttura di directory, all'interno della quale il kernel cercherà la directory: ldp Anche lo i-node di questa directory rivelerà una struttura di directory, all'interno della quale il kernel troverà, finalmente, un numero i-node assegnato al file: fundamentals.xml Quest'ultimo i-node conterrà l'elenco dei blocchi di dati associati al file.
|
|||||||||
How does my computer store things in memory? | Disclaimer: questo è un link a contenuti ospitati su server esterni. |