Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Task
Corso di informatica
2
il libro si estende sul web
Gli archivi
non sequenziali
Lorganizzazione
non sequenziale
LEZIONE
File
Blocco
iniziale
Lunghezza
14
LEZIONE 1
Questo tipo di allocazione rimuove il problema della frammentazione tipico dellallocazione contigua, poich
consente un tipo di allocazione sparsa, ma purtroppo non esente da inconvenienti; uno di essi legato alladozione della tecnica di memorizzazione prevista per la lista concatenata: in questo modo, infatti, per accedere al blocco N occorre necessariamente percorrere tutti i blocchi sino al blocco di posizione N1. Ci significa che, pur con unorganizzazione logica ad accesso diretto, le prestazioni saranno limitate.
Un ulteriore problema nasce dal fatto che i riferimenti al blocco successivo presenti nei singoli blocchi che compongono il file potrebbero andare persi, compromettendo il reperimento dellintero file. Una soluzione prevede di inserire in ogni blocco interessato alla memorizzazione del file non solo il collegamento al blocco successivo, ma anche quello al precedente e lo stesso nome del file, in modo che il sistema operativo abbia pi
informazioni per poter recuperare il file in caso di perdita di collegamenti.
La soluzione pi utilizzata fa ricorso a una specifica tabella denominata FAT (File Allocation Table) che rappresenta limmagine virtuale dei blocchi su disco e che contiene i riferimenti tra i vari blocchi, evitando, cos, di
memorizzare gli stessi allinterno del file. La FAT il tipico file system dei sistemi DOS, di alcune versioni di
Windows e dei sistemi MacOS.
FAT
File
Blocco
iniziale
8
0
1
2
...
7
9
...
13
14
15
...
25
26
27
28
...
35
36
...
35
25
14
EOF
13
28
Lapproccio basato sulla FAT, pur eliminando molti problemi, pu influire negativamente sulle prestazioni quando i file sono grandi e soprattutto quando i dischi sono di notevoli dimensioni. Per risolvere il problema viene
adottata unulteriore tecnica che prende il nome di allocazione indicizzata, la quale consente di raccogliere tutti i riferimenti relativi ai blocchi allocati per i file allinterno di un vettore chiamato blocco indice. In altri termini, questo tipo di allocazione prevede un blocco indice per ogni file presente sul filesystem. In questo modo,
il recupero dei blocchi diviene semplice, veloce ed efficiente: per reperire il blocco N di un file occorre solo accedere allelemento N del blocco indice e leggere lindirizzo di memoria di massa in esso presente. Solitamente
il blocco indice memorizzato in un file per accedere al quale si memorizza lindirizzo fisico nella directory che
lo contiene (come si vede nella figura). Nel caso in cui lindice dovesse avere dimensioni molto grandi diviene
necessario avere un blocco indice per il blocco indice.
Questo metodo di allocazione usato nei sistemi Unix dove i blocchi indici sono chiamati i-node.
File
Blocco
indice
8
FAT
0
1
2
3
4
5
25
2
35
28
13
14
Lorganizzazione
relative e
lorganizzazione hash
LEZIONE
Lorganizzazione relative
Nellorganizzazione relative la chiave primaria di ogni record identifica univocamente sia il record stesso ,sia lindirizzo logico in cui il record registrato.
In altri termini, questo tipo di organizzazione possibile solo quando la chiave
corrisponde alla posizione del record allinterno dellarchivio.
Ad esempio, un foglio di calendario strutturato in modo che a ogni giorno k corrisponda la k-esima riga dello stesso foglio. Quindi il giorno 5 si trova in quinta
riga, il giorno 28 in ventottesima riga. Supponiamo di dover registrare un tabulato con le temperature di una localit rilevate ogni ora. chiaro che troveremo la
temperatura delle ore 12 nella dodicesima riga, quella delle 20 nella ventesima
riga e cos via. Con tale organizzazione, larchivio pu essere paragonato a una
specie di vettore memorizzato su dispositivi di memoria di massa.
TABULATO TEMPERATURE
Ore 1
Ore 2
Ore 3
...
Ore 23
Ore 24
Lorganizzazione relative
e lorganizzazione hash
LEZIONE 2
Tra gli svantaggi, invece, ricordiamo che gli archivi relative presentano un inconveniente: spesso molto difficile riuscire a impostare una relazione univoca tra la
chiave primaria e la posizione nella quale memorizzare il record. Questo inconveniente obbliga il programmatore a utilizzare chiavi legate strettamente alla posizione relativa del singolo record allinterno dellarchivio, oppure a utilizzare particolari metodi di randomizzazione.
Ricordiamo, infine, che nellorganizzazione relative la cancellazione pu avvenire
solo logicamente, a eccezione dellultimo record.
Lorganizzazione hash
La tecnica hash si basa sullutilizzo di funzioni che trasformano la chiave primaria di ciascun record in un numero intero, che rappresenta lindirizzo logico, detto indirizzo hash, del record stesso.
Pi in generale, applicare la tecnica hash significa definire una funzione di randomizzazione H (funzione hash) che associ a ogni record lindirizzo di un record logico in cui possibile memorizzarlo, attraverso la trasformazione della chiave K
in un intero X compreso tra 1 e N, dove N il numero di indirizzi logici che sono
a disposizione.
H(K) = X
Lindirizzo X deve essere calcolato tutte le volte che occorre accedere al record di
chiave K per effettuare operazioni di I/O.
Numero
conto
REGISTRA
Numero conto
GESTIONE
ARCHIVIO
AGGIORNA
CONTI
Numero conto
CANCELLA
Somma
VISUALIZZA
La funzione hash
LEZIONE
Chiave K
Chiave Z
Funzione
hash
Archivio
Rec 1
Rec 2
Rec 3
...
Rec 100
...
La funzione hash
LEZIONE 3
Quando ci accade si produce una collisione, per risolvere la quale occorre disporre di particolari procedure che collochino le registrazioni in conflitto, dette sinonimi, in record di indirizzo diverso. I requisiti descritti precedentemente per la
scelta della funzione hash al punto 4 e al punto 5 rappresentano la condizione necessaria per contenere il fenomeno della collisione.
A tal proposito, possiamo anche formulare un settimo requisito dicendo che scegliere una funzione hash ottimale significa scegliere una funzione che:
7. generi il minor numero possibile di collisioni e definisca apposite procedure
per lallocazione dei sinonimi (gestione delle collisioni).
Supponiamo di dover stabilire lindirizzo logico corrispondente a record aventi le
seguenti chiavi (BOLOGNA, LECCO, OTRANTO, BAGNOLO) per un archivio composto al massimo da 200 record. Per allocare le suddette chiavi ci serviamo del
seguente metodo:
1. si associa a ogni carattere della chiave il corrispondente valore ASCII;
2. si sommano tutti i valori ottenuti;
3. si moltiplica tale somma per il numero di cifre che compongono il nome della
chiave;
4. si calcola il resto della divisione del numero ottenuto per il numero di record
inseribili, cio 200, e si somma + 1, ottenendo il valore dellindirizzo.
Cominciamo con la prima chiave: BOLOGNA
66 + 79 + 76 + 79 + 71 + 78 + 65 = 514
514 x 7 = 3598
B
66
O
79
L
76
O
79
G
71
N
78
A
65
L
76
E
69
C
67
C
67
O
79
O
79
T
84
R
82
A
65
N
78
T
84
O
79
B
66
A
65
G
71
N
78
O
79
L
76
O
79
Collisione
79 + 84 + 82 + 65 + 78 + 84 + 79 = 551
551 x 7 = 3857
3857 MOD 200 = 57 + 1
Quarta chiave: BAGNOLO
66 + 65 + 71 + 78 + 79 + 76 + 79 = 514
514 x 7 = 3598
(3598 MOD 200) +1 = 198 + 1
LEZIONE
Lorganizzazione hash:
calcolo degli indirizzi
Assodato che quasi impossibile realizzare funzioni che consentano una trasformazione perfetta e che, di conseguenza, il problema delle collisioni sar sempre
presente (indipendentemente dalla funzione), occorre concentrare le nostre forze sullo sviluppo di funzioni efficienti, piuttosto che perfette. Esistono molti metodi per calcolare gli indirizzi; esaminiamone solo alcuni.
...
...
...
...
25
Sinonimi
Questo semplicissimo metodo molto efficiente nel caso in cui le chiavi numeriche siano essenzialmente consecutive e con poche interruzioni. Gli svantaggi di
tale funzione risiedono nel fatto che essa produce sinonimi ogni volta che si incontrano chiavi aventi le ultime tre cifre uguali e che il numero di indirizzi logici a disposizione deve essere sempre una potenza di 10. Ci richiede (come spesso accade) che larchivio debba essere composto da un numero di record superiore a
quello effettivamente necessario. Riferiamoci allesempio precedente: se la palestra ha solo 130 soci, deve prevedere sempre un archivio composto da 1000: utile sovradimensionare larchivio (magari prevederne 160), ma predisporre 1000 record , ovviamente, un enorme spreco di memoria! Applichiamo questo metodo a
una chiave alfanumerica. Supponiamo che la chiave da trasformare debba essere
composta da quattro caratteri ottenuti estraendo gli ultimi quattro caratteri della
chiave primaria. Per procedere alla trasformazione, si pu utilizzare il semplicissimo metodo che pone in corrispondenza le 26 lettere dellalfabeto con i primi 26
numeri naturali, proprio come riportato nella tabella riportata a lato.
A questo punto, proprio come nei sistemi di numerazione pesati, si procede alla
costruzione di una funzione che calcoli la sommatoria dei prodotti di ogni carattere per il suo peso, ossia per 26 elevato alla posizione occupata allinterno della
parola. Proviamo a calcolare lindirizzo, o meglio, il numero corrispondente alla
chiave HELLOCIAO.
Estraiamo gli ultimi quattro caratteri dalla chiave HELLOCIAO:
CIAO = C x 263 + 1 x 262 + A x 261 + O x 260 =
= 2 x 263 + 8 x 262 + 0 x 261 + 14 x 260 =
= 2 x 17576 + 8 x 676 + 0 + 14 x 1 =
= 35152 + 5408 + 14 =
= 40574
A questo punto, per calcolare il reale indirizzo, si pu applicare il metodo del troncamento, ma, per farlo, il programmatore deve aver stabilito a priori qual il numero massimo di record che pu contenere larchivio, in modo da poterlo approssimare in modo migliore. Come per il caso di una chiave numerica, anche in
Lorganizzazione hash:
calcolo degli indirizzi
LEZIONE 4
Il metodo folding
Questo metodo consiste nel dividere la chiave numerica in due o pi parti.
Successivamente, tali parti vengono sommate tra loro e il valore ottenuto (o una
sua parte), viene utilizzato come indirizzo. Il nome folding (termine inglese che
significa piegare) si spiega se si immagina di piegare la chiave congiungendo le
sue estremit, proprio come se fosse scritta su un foglio di carta, e di sommare
tra loro le cifre che ricadono nella stessa posizione. Se la somma ottenuta supera
il numero massimo di cifre di cui deve essere composto lindirizzo, si procede al
troncamento delle prime cifre.
Supponiamo che la chiave sia 563710:
H(563710) = 365 + 710 = 1075
Graficamente abbiamo quanto riportato a lato.
Il valore dellindirizzo , quindi, 1075. Anche questo metodo genera diverse collisioni, poich, ad esempio, H(563710) = H(349132). Inoltre, presenta gli stessi
svantaggi del metodo di troncamento poich, anche in questo caso, allindirizzo
viene riservato uno spazio pari a una potenza di 10. Ribadiamo, infine, che la
scelta di suddividere la chiave in due o pi parti in relazione alla specifica applicazione. Tale suddivisione deve essere attentamente valutata, al fine di consentire una distribuzione uniforme degli indirizzi, per ridurre il pi possibile il numero delle collisioni.
64
21
80
12
13
88
11
58
Lorganizzazione hash:
gestione delle collisioni
LEZIONE
Anche ponendo il massimo scrupolo nella scelta della funzione hash, praticamente impossibile evitare il verificarsi delle collisioni.
Le tecniche di gestione delle collisioni sono metodi che consentono di individuare un indirizzo libero per la chiave K nel caso in cui la funzione hash H(K)
restituisca un valore gi ottenuto per unaltra chiave, cio lindirizzo logico di
un record gi occupato.
La gestione corretta di questa specifica situazione riveste particolare importanza
sia nella fase di inserimento dei record, sia in quella di ricerca di una chiave. Nel
caso dellinserimento, si applica a ogni chiave da inserire nellarchivio uno dei
metodi descritti in precedenza (o altri ancora). Ottenuto il valore dellindirizzo, si
effettua un test nella posizione indicata per controllare se occupata (collisione)
o meno. Se non occupata, il record pu essere inserito, mentre se il posto non
libero va ricercata una nuova posizione, sino a quando non se ne incontra una
libera. Per la ricerca il discorso analogo: si applica la funzione alla chiave da ricercare e si accede al record indicato dal valore restituito dalla funzione. Se la
chiave in esso contenuta coincide con quella cercata, il problema risolto, altrimenti si esegue la scansione dellarchivio andando su altre posizioni, sino a quando non si trova la chiave cercata. Come per la funzione hash, esistono vari metodi anche per gestire le collisioni: ne esaminiamo alcuni.
28
29
35
24
48
71
64
Per generare gli indirizzi ci serviamo del metodo della divisione modulo 9. Abbiamo:
9
28
29
35
24
48
71
10
(9 mod 9) + 1 = 0 + 1 = 1
(28 mod 9) + 1 = 1 + 1 = 2
(29 mod 9) + 1 = 2 + 1 = 3
(35 mod 9) + 1 = 8 + 1 = 9
(24 mod 9) + 1 = 6 + 1 = 7
(48 mod 9) + 1 = 3 + 1 = 4
(71 mod 9) + 1 = 8 + 1 = 9
Lorganizzazione hash:
gestione delle collisioni
LEZIONE 5
A questo punto, in base alla tecnica della scansione lineare con passo unitario, dobbiamo spostarci sul record
successivo per vedere se la posizione libera: dobbiamo andare sulla posizione 10. Ci, ovviamente, non realizzabile in quanto abbiamo supposto che larchivio sia composto al massimo da 9 record. Occorre, pertanto,
applicare la divisione anche allindirizzo prodotto. Abbiamo:
71
(71 mod 9) + 1 = 8 + 1 = 9
(9 mod 9) + 1 = 0 + 1 = 1
(1 mod 9) + 1 = 1 + 1 = 2
(2 mod 9) + 1 = 2 + 1 = 3
(3 mod 9) + 1 = 3 + 1 = 4
(4 mod 9) + 1 = 4 + 1 = 5
Poich lindirizzo 2 interno allintervallo, si cominciano a esaminare una a una le successive posizioni, sino a
incontrare un posto libero.
Vengono quindi scandite le posizioni 3, 4, 5 e, infine, la posizione 6, sulla quale la chiave 64 viene memorizzata. Come si pu constatare, la chiave 64 ha dovuto attraversare una parte della catena precedente, anche se i
record individuati da questi indirizzi erano occupati.
4 Chiave3
5
6
7 Chiave5
8 Chiave4
Funzione
di rehash
La funzione di rehash
genera casualmente
la posizione 7 che libera
11
LEZIONE
B-alberi
Nel corso della trattazione delle varie organizzazioni abbiamo notato che loperazione di ricerca diviene sempre pi efficiente se i record sono identificati per
mezzo delle loro chiavi di accesso e abbiamo visto come lutilizzo degli indici possa essere di valido aiuto per implementare archivi dinamici.
La gestione degli indici viene resa molto efficiente se si usano gli alberi binari di
ricerca per le chiavi, e pu essere ottimizzata se si mantiene lalbero bilanciato.
La seguente figura mostra un esempio di albero binario di ricerca. La caratteristica
che appare che partendo dalla chiave di valore 32 a sinistra si va verso chiavi di
valore minore e a destra verso chiavi di valore maggiore. Ci valido per qualsiasi
nodo dellalbero e per qualsiasi chiave che abbia delle altre chiavi sotto di s.
Quindi gli alberi binari di ricerca hanno una caratteristica ben precisa: possono essere facilmente osservati scorrendoli a partire dalla radice, nodo pi in alto.
32
45
43
54
17
Infatti a sinistra di ogni nodo si trovano sempre nodi di valore minore mentre a
destra si trovano sempre nodi di maggior valore.
Considerando ad esempio il nodo 45 si osserva che alla sinistra si incontra il nodo
43 e alla destra il nodo 54. Si potrebbe per notare come la ricerca di un record
che si trova pi in profondit (a un livello pi basso) rispetto a un altro impieghi
tempi pi lunghi, in quanto aumentano i nodi da attraversare.
Nel caso della figura precedente, cercare il nodo 17 differente dal cercare il
nodo 2, in quanto si attraversa un numero diverso di nodi.
Per rendere minimo il percorso di ricerca nasce quindi lesigenza di particolari alberi in cui la profondit si mantenga limitata per tutti i nodi. Una soluzione bilanciare lalbero, cio fare s che tutti i percorsi massimi abbiano la stessa lunghezza.
La figura seguente mostra la versione bilanciata del precedente albero binario di
ricerca. Ora, per prelevare il nodo 17 si effettuano tre accessi al file, contro i quattro accessi della versione precedente. Indubbiamente aumenta la complessit
delle operazioni di gestione degli alberi. Con laggiunta di nuovi nodi, la struttura
dellalbero binario aumenta sempre pi di dimensioni.
32
12
45
17
43
54
B-alberi
LEZIONE 6
200
137
185
198
203
217
220
218
268
300
286
223
254
400
305
346
399
457
488
558
255
13
Inserimento e ricerca
in un b-albero
LEZIONE
La ricerca
La ricerca di un record con una data chiave K in un B-albero viene eseguita con
criteri analoghi a quelli visti per gli alberi binari di ricerca; si cerca infatti la chiave K tra le chiavi dei record memorizzati in un dato nodo del B-albero a partire
dalla radice.
Nel caso che il nodo attualmente esaminato non contenga il record di chiave K si
sceglie quale debba essere il nodo del B-albero da esaminare successivamente in
base alla posizione della chiave K rispetto a quelle gi memorizzate nel nodo; il
criterio per stabilire se una ricerca termina senza successo analogo a quello per
gli alberi binari di ricerca.
Per comprendere meglio il criterio di ricerca in un B-albero si pu fare riferimento alla situazione descritta nella seguente figura.
200
Puntatore al nodo
con chiavi K < 200
300
400
Puntatore al nodo
con chiavi 300 < K < 400
Puntatore al nodo
con chiavi 200 < K < 300
Puntatore al nodo
con chiavi K > 400
La figura illustra che una qualunque chiave che non appartenga alla radice deve
necessariamente trovarsi in una delle parti nelle quali la linea suddivisa dalle
chiavi che si trovano in essa. A ciascuna suddivisione della linea associato il
puntatore che si riferisce al sottoalbero dellalbero di ordine 3 nel quale sono memorizzati tutti e soli i record che hanno la chiave nellintervallo corrispondente.
Per continuare la ricerca del record con chiave K si deve pertanto accedere al sottoalbero corrispondente allintervallo nel quale K si trova; il procedimento prosegue finch non si ritrova il record con chiave K (ricerca con successo) oppure pi
possibile procedere allinterno dellalbero di ordine n (ricerca senza successo).
Pi in dettaglio, il nodo di un B-albero ha la seguente struttura:
P0
K1
P1
K2
P2
...
Ki
Pi
Ki+1
...
Km
Pm
dove:
n rappresenta il numero di voci presenti nel nodo;
il puntatore P0 al primo figlio di sinistra consente di accedere al sottoalbero
che contiene tutte le chiavi aventi valore minore della pi piccola (ossia di K1);
i puntatori intermedi Pi permettono laccesso al sottoalbero che contiene tutte
le chiavi aventi valori compresi tra Ki e Ki+1;
il puntatore Pm allultimo figlio di destra consente di accedere al sottoalbero
che contiene tutte le chiavi aventi valore maggiore della chiave pi grande (ossia di Km).
14
LEZIONE 7
Alla luce di queste prime definizioni, possiamo concludere che un B-albero gode
delle seguenti propriet:
14
11
16
12
18
21
17
13
14
10
15
22
23
24
28
Chiavi > 11
Chiavi < 5
4
19
20
15
Tutto in test...a
b-tree
relative
hash
3. Nellallocazione concatenata:
20. Descrivi il procedimento seguito dal metodo pseudorandom o scansione non lineare.
16
Diamoci il voto!!!
Con questa scheda puoi autovalutare il tuo livello di acquisizione delle conoscenze e delle abilit insegnate nellUnit formativa. Attribuisci un punto a ogni risposta esatta. Se totalizzi un punteggio:
<4
Tra 4 e 6
Tra 6 e 8
Ripeti il questionario
>8
Tutto OK
Ripeti il questionario
1.
2.
3.
4.
5.
6.
La FAT:
a
memorizzata in RAM
7.
copiare
tagliare
piegare
incollare
funzione has
funzione di rehash
funzione di reload
funzione di recol
8.
9.
Un b-albero di ordine m:
a
ha due radici
rehashing
splitting
dumping
pseudo-random
17