Garbage collection: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
ortografia |
m lavoro sporco |
||
Riga 4:
Nota: la voce non sembra essere stata ottenuta COMPLETAMENTE mediante traduzione automatica (vedi [[Teplate:Da correggere]])
-->
In [[informatica]] per '''garbage collection''' (termine
Questo meccanismo ha condotto ad un notevole cambio nello stile di [[Programmazione (informatica)|programmazione]] dei [[Linguaggio di programmazione|linguaggi]] che lo implementano. Infatti non è più necessario richiedere esplicitamente la liberazione della memoria utilizzata da un [[programmazione orientata agli oggetti|oggetto]], ovvero ''terminare'' tale oggetto in modo deterministico, ma si lascia che il sistema esegua questa operazione automaticamente, nel momento in cui lo riterrà più opportuno al fine di migliorare le prestazioni complessive. Tale azione viene definita nell'ambito delle ''finalizzazioni non deterministiche''.
Riga 13:
# Recuperare le [[risorsa informatica|risorse]] utilizzate da questi oggetti.
Attuando il processo di ''garbage collection'', l'ambiente nel quale viene eseguito il programma gestisce la memoria automaticamente, liberando il [[programmatore]] dalla necessità di prevedere quando rilasciare le risorse utilizzate da un oggetto, non più necessario all'[[elaborazione dati|elaborazione]]. Tale modalità automatica
Alcuni [[linguaggio di programmazione|linguaggi di programmazione]]
=== Benefici ===
Riga 21:
La ''garbage collection'' esonera il programmatore dall'eseguire manualmente l'allocazione (richiesta) e la deallocazione (rilascio) di aree di memoria, riducendo o eliminando del tutto alcune categorie di bugs:
* ''[[Dangling pointer|'''Dangling pointers''']]'': persistenza nel programma di puntatori che si riferiscono ad aree di memoria che contenevano oggetti, ormai deallocate. Utilizzare tali aree di memoria deallocate può, nel migliore dei casi, provocare un errore fatale dell'applicazione
* '''''Doppia deallocazione''''': il programma tenta di liberare nuovamente una zona di memoria già rilasciata.
* '''''Alcuni tipi di [[memory leak]]s'':''' il programma perde traccia di alcune aree di memoria allocate<ref>Ad esempio nel caso in cui il puntatore ad esse viene modificato.</ref>, perdendo la possibilità di deallocarle nel momento in cui non servono più. Questo tipo di problema può accumularsi nel corso dell'esecuzione del programma
La maggior parte degli errori di programmazione nei linguaggi che non prevedono la garbage collection
=== Svantaggi ===
Riga 31:
La ''garbage collection'' presenta tuttavia anche alcuni svantaggi:
* '''Consumo di risorse di calcolo''' : il processo consuma risorse di calcolo
* '''Incertezza del momento in cui viene effettuata la Garbage Collection''': Il momento in cui viene effettuata tale operazione non è prevedibile: questa incertezza può determinare improvvisi blocchi o ritardi nell'esecuzione. Problemi di questo genere sono inaccettabili in ambienti [[real-time]], nel rilevamento di [[driver|driver periferici]], e nell'[[transaction processing|elaborazione di transazioni]];
* '''Rilascio della memoria non deterministico''': analogamente, sia il momento in cui una data area di memoria viene rilasciata, sia l'ordine di rilascio delle varie aree non più utilizzate, dipendono dal particolare [[algoritmo]] implementato dal ''garbage collector''. Si può dire che il rilascio di memoria avviene in modo non deterministico.
* '''Presenza di memory leak''': i [[memory leak]], perdita o fuoriuscita di memoria, possono comunque verificarsi
== Tracing garbage collection ==
Il metodo più comune per attuare la ''garbage collection'' è il metodo del tracciamento
=== Raggiungibilità di un oggetto ===
Siano "'''p"''' e "'''q"''' due oggetti, e sia q un oggetto raggiungibile. Diremo che p è raggiungibile in maniera ricorsiva
* Quando viene creato all'avvio del programma (oggetto globale) o di una sua sotto-procedura (oggetti di [[scope]], creati sullo [[stack]]); l'oggetto in questione viene detto in tal caso '''radice''';
* Quando un altro oggetto, raggiungibile, trattiene un riferimento ad esso; in modo più formale
L'identificazione delle aree di memoria ''spazzatura'' con quelle non raggiungibili non è ottimale, in quanto potrebbe accadere che un programma utilizzi per l'ultima volta una certa area molto prima che questa diventi irraggiungibile. A volte si distingue perciò fra spazzatura '''sintattica''', quando l'oggetto ''non può'' essere raggiunto dal programma, e '''semantica''', quando il programma ''non vuole'' più utilizzare l'oggetto. Ad esempio:
Riga 73:
==== Naïve mark-and-sweep ====
Nel ''mark-and-sweep'' ogni oggetto in memoria possiede un [[flag]]
Questo metodo ha diversi svantaggi, per esempio, l'intero sistema viene sospeso durante la Garbage
==== Tri-colour marking ====
Riga 82:
# '''Crea set di livelli di bianco, grigio e nero''' utilizzati per segnare i vari progressi effettuati durante il ciclo.
#* Il '''set bianco''' è l'insieme di oggetti candidati al riciclo.
#* Il '''set nero''' è l'insieme di oggetti privi di riferimenti in uscita a oggetti del set bianco, raggiungibili dalla radice. Gli oggetti del set nero non sono candidati per essere riciclati; in molte implementazioni
#* Il '''set grigio''' contiene tutti gli oggetti raggiungibili dalla radice
#* Gli oggetti possono passare soltanto dal bianco al grigio e dal grigio al nero
# '''Raccoglie gli oggetti dal set di grigio''' e sposta questi nel set di nero (Blacken) se questi non possono essere garbage collected.
# '''Ripete i vari passaggi''' fino a quando il set di grigio diventa vuoto.
# '''Quando non vi sono più oggetti nel set di grigio''', per tutti i rimanenti oggetti nel set bianco è stato dimostrato che non sono raggiungibili per cui lo spazio di memoria da essi occupato viene recuperato.
Dal momento che tutti gli oggetti non immediatamente raggiungibili dalla radice sono tipicamente assegnati al set di bianco, e gli oggetti possono muoversi solo dal bianco al grigio e dal grigio al nero, l'algoritmo conserva un [[Invarianza|invariante]] importante - ''nessun oggetto nero punta direttamente ad un oggetto bianco''. Questo garantisce che gli oggetti bianchi possono essere distrutti in modo sicuro una volta che il set grigio è vuoto.▼
▲Dal momento che tutti gli oggetti non immediatamente raggiungibili dalla radice sono tipicamente assegnati al set di bianco
L'algoritmo presenta un vantaggio importante: può essere eseguito '''''on-the-fly,''''' senza che sia arrestato il sistema per periodi di tempo significativo. Ciò si ottiene marcando gli oggetti nel momento in cui vengono allocati e durante le modifiche, mantenendo i tre insiemi. Monitorando la dimensione degli insiemi, il sistema può effettuare ''garbage collection'' periodicamente o quando necessario. Inoltre, viene eliminata la necessità di toccare l'intero insieme degli oggetti durante ciascun ciclo di Garbage Collected.▼
▲L'algoritmo presenta un vantaggio importante: può essere eseguito '''''on-the-fly
=== Strategia di attuazione ===
Al fine di attuare l'algoritmo ''tri-colour marking'' si prendono importanti decisioni al momento della progettazione e ciò può incidere sensibilmente sulle caratteristiche delle prestazioni del garbage collector.
==== Movimento contro non movimento ====
Una volta che il set è stato classificato irraggiungibile, il Garbage Collector può semplicemente rilasciare gli oggetti irraggiungibili
A prima vista una strategia di Garbage Collector in movimento può sembrare inefficiente e costosa rispetto all'approccio di ''non movimento,''
* Non è necessario ulteriore tempo macchina per recuperare lo spazio liberato dagli oggetti irraggiungibili, l'intera regione viene così considerata libera. Viceversa un Garbage Collector in ''non movimento'' deve controllare ogni oggetto irraggiungibile e registrare che la memoria da essi occupata sia disponibile.
|