Libro "VB 2010 spiegato a mia nonna" (34)

Garbage Collector

la tecnologia COM, precedente all’avvento del Framework .NET, utilizza un meccanismo basato sul conteggio dei riferimenti a ciascun oggetto (reference counter). In COM, un oggetto viene caricato una sola volta in memoria, mentre le applicazioni possono fare riferimento direttamente all’unica copia dell’oggetto.

Alla creazione di un riferimento all’oggetto il reference counter viene incrementato di una unità, mentre alla distruzione di un oggetto viene decrementato, sempre di una unità. Di conseguenza, se il reference counter è un numero maggiore di zero esiste ancora almeno un riferimento a tale oggetto, mentre se il reference counter viene azzerato non esistono più riferimenti a questo oggetto. Quest’ultimo, quindi, può essere eliminato dalla memoria.

Questa semplice tecnica è compromessa da un serio problema sui cosiddetti “riferimenti incrociati”. Per esempio: A fa riferimento a B e contemporaneamente B fa riferimento ad A. Con la tecnologia COM non è possibile risolvere lo stallo (“deadlock”), ottenendo perdite di memoria e quindi compromettendo la stabilità dell’intero sistema. Inoltre, se un’applicazione si arresta bruscamente prima di poter rilasciare correttamente gli oggetti, il reference counter di tali oggetti non potrà essere decrementato e quindi il sistema avrà in memoria degli “oggetti orfani”. Tali oggetti potranno essere eliminati solo riavviando il sistema o con l’intervento dell’utente, se costui sarà capace di distinguere quali sono i processi da terminare con il task manager.

Il Framework .NET risolve questo problema brillantemente con l’introduzione del Garbage Collector (per gli amici: “GC”), una funzionalità in grado, tra le altre competenze, di accorgersi dell’esistenza di riferimenti incrociati e che permette di rilasciare le risorse utilizzate da oggetti che non servono più e di distruggere gli oggetti stessi. le conseguenze immediate sono una migliore gestione della memoria e una riduzione drastica, se non eliminazione assoluta, dei rischi di perdita di spazi di memoria.

la nota negativa (ma nemmeno tanto) deriva dal fatto che l’azione del Garbage Collector non è deterministica. Questo significa che esso non distrugge immediatamente gli oggetti che non servono più, riservandosi questa operazione in un momento non ben precisato nel futuro.

Gli oggetti vengono resi indisponibili e sono distrutti soltanto nel momento in cui diviene necessario liberare la memoria centrale.

un’operazione che il Garbage Collector è in grado di fare molto bene è quella della deframmentazione e compattazione della memoria.

Chi utilizza da un po’ di tempo windows, quindi probabilmente tutti i lettori di questo libro, sa che ogni tanto è utile avviare la deframmentazione dei dischi fissi, in modo tale da riorganizzare i file archiviati sui dischi stessi.

Tale riorganizzazione permette di recuperare eventuali blocchi persi occasionalmente, di riordinare nella giusta sequenza i blocchi di dati assegnati a ciascun file e di ricompattare tutti i file nelle prime tracce del disco. Avere un file, magari di grande dimensione, frammentato in tantissime parti sparse su tutto il disco fisso, significa far lavorare di più la testina del disco fisso per recuperare tutte le parti necessarie. Avere i blocchi riordinati e compattati in blocchi vicini, invece, permette di leggere un intero file con pochi giri del disco o addirittura in un’unica passata.

Supponiamo di rappresentare lo spazio su hard disk come nella Figura 2.7, dove ogni riga rappresenta un diverso stato del disco stesso.

image

Figura 2.7 – Esempio di deframmentazione e compattazione dei file su hard disk.

Vediamo passo passo la sequenza temporale delle modifiche apportate all’hard disk:

✥ nella prima riga abbiamo otto blocchi, da 4 kilobyte ciascuno, occupati da altrettanti file di piccole dimensioni;

✥ nella seconda riga notiamo che è stato memorizzato un nuovo file (rappresentato dal numero nove) con una dimensione pari a tre blocchi;

✥ nella terza riga sono stati cancellati alcuni file di dimensione pari a un blocco ed è stato aggiunto un file di dimensione quattro blocchi;

✥ nella quarta riga abbiamo avuto la necessità di salvare un file (indicato con il numero undici) di dimensione pari a quattro blocchi. Poiché non esisteva più un blocco libero di dimensione di almeno quattro blocchi, il file “undici” è stato frammentato in più parti;

✥ nella quinta riga viene eliminato il file numero nove;

✥ infine, nell’ultima riga è intervenuta un’operazione di deframmentazione e di compattazione che ha spostato i file in modo tale da riunirli tutti all’inizio dello spazio disponibile, eliminando anche la frammentazione del file “undici”.

Dopo tale operazione è possibile salvare un file di dimensione pari a quattro blocchi, senza doverlo frammentare. ovviamente questa è una esemplificazione di meccanismi più complessi, ma è utile per comprendere il lavoro che il Garbage Collector compie nella memoria centrale.

(…segue…)

Fonte: Cap. 2 – libro “Visual Basic 2010 spiegato a mia nonna”, Edizioni FAG Milano, Autore Mario De Ghetto, 2011, http://bit.ly/NRO6Cn.

About these ads

Pubblicato il 16 agosto 2012, in Programmazione, VB2010SAMN, VS 2010 con tag , , , , . Aggiungi il permalink ai segnalibri. Lascia un commento.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 844 follower

%d blogger cliccano Mi Piace per questo: