42
Parte 1 Gestione della memoria Linguaggi dinamici – A.A. 2009/2010 1

T5 memoria

Embed Size (px)

Citation preview

Page 1: T5 memoria

Parte 1

Gestione della memoria

Linguaggi dinamici – A.A. 2009/20101

Page 2: T5 memoria

Introduzione

� Ciascun linguaggio di programmazione mette a disposizione meccanismi per la gestione delladisposizione meccanismi per la gestione della memoria (principale)

Funzionalità ad alto livello di un gestore della� Funzionalità ad alto livello di un gestore della memoria:

All i di i� Allocazione di risorse

� Rilascio di risorse

Linguaggi dinamici – A.A. 2009/20102

Page 3: T5 memoria

Due diverse filosofie

� C: la gestione della memoria è troppo importante per questo va lasciata alimportante per questo va lasciata al programmatore

� Smalltalk: la gestione della memoria è troppo� Smalltalk: la gestione della memoria è troppo importante per questo va lasciata al sistema

Linguaggi dinamici – A.A. 2009/20103

Page 4: T5 memoria

Gestione manuale della memoria

� Nei linguaggi di “vecchio stampo”, sono messe a disposizione del programmatore lemesse a disposizione del programmatore le funzioni di allocazione e deallocazione della memoria, che usano le primitive del sistema e o a, c e usa o e p t e de s ste aoperativo sottostante� C: malloc(), free()� C: malloc(), free()

� La gestione della memoria è interamente lasciata al programmatorelasciata al programmatore� Gestione eccezionalmente veloce

G ti i l t tt d i di� Gestione eccezionalmente soggetta ad errori di violazione di segmento

Linguaggi dinamici – A.A. 2009/20104

Page 5: T5 memoria

Gestione manuale della memoria

� Schema di gestione manuale della memoria<Acquisizione della memoria>� <Acquisizione della memoria>

� <Uso della memoria>

� <Rilascio della memoria>

� Esempio (C):

ptr = malloc(size);

<uso di memoria tramite ptr, *ptr>;uso di memoria tramite ptr, ptr ;

free(ptr);

Linguaggi dinamici – A.A. 2009/20105

Page 6: T5 memoria

Gestione manuale della memoria

� Vantaggi:La velocità delle operazioni di gestione è elevata (in� La velocità delle operazioni di gestione è elevata (in sostanza, è quella del kernel sottostante)

I pattern di acquisizione/rilascio sono espliciti� I pattern di acquisizione/rilascio sono espliciti

� Svantaggi:O di i i diff t l t� Onere di programmazione non indifferente, legato all'uso della memoria(aritmetica dei puntatori : segmentation fault(aritmetica dei puntatori : segmentation fault, puntatore a memoria liberata : dangling reference)

� Gestione manuale non scala con le dimensioni del� Gestione manuale non scala con le dimensioni del programma (è molto facile dimenticarsi qualche free() : memory leak)

Linguaggi dinamici – A.A. 2009/20106

Page 7: T5 memoria

Gestione automatica della memoria

� Nei linguaggi più moderni, una macchina virtuale fornisce l'astrazione portabile di unvirtuale fornisce l astrazione portabile di un calcolatore

La macchina virtuale implementa il proprio� La macchina virtuale implementa il proprio gestore della memoria, che svolge le operazioni di allocazione e deallocazione inoperazioni di allocazione e deallocazione in maniera automatica, a tempo di esecuzione

N i t iù il tt di ll i� Non esiste più il concetto di allocazione dinamica della memoria

� Il programmatore deve solo preoccuparsi di dichiarare ed utilizzare variabili semplici o

Linguaggi dinamici – A.A. 2009/20107

complesse, mutevoli in tipo e dimensione

Page 8: T5 memoria

Gestione automatica della memoria

� Schema di gestione automatica della memoriaDichiarazione di una variabile (semplice o� Dichiarazione di una variabile (semplice o complessa)

<U d ll i bil >� <Uso della variabile>

� Esempio (Perl):

my @array = ();

push @array, 10;

push @array, “ciao”;

Linguaggi dinamici – A.A. 2009/20108

Page 9: T5 memoria

Gestione automatica della memoria

� Vantaggi:L'uso della memoria occupata dalle strutture dati è� L uso della memoria occupata dalle strutture dati è controllato dall'interprete (assenza di violazioni di segmento)segmento)

� La memoria viene prenotata quando serve (dichiarazione di una variabile) e rilasciata quando ( ) qnon serve più (uscita da un blocco di codice) (è molto più difficile avere memory leak)

� Svantaggi:� La velocità delle operazioni di gestione è molto p g

bassa (interviene l'interprete)

� I pattern di acquisizione/rilascio non sono espliciti

Linguaggi dinamici – A.A. 2009/20109

Page 10: T5 memoria

Parte 1

Garbage Collectiong

Linguaggi dinamici – A.A. 2009/201010

Page 11: T5 memoria

Definizione

� La garbage collection è una forma di gestione automatica della memoriaautomatica della memoria� John McCarthy, LISP, 1959

U d l ft t t l ti� Un modulo software appartenente al run time environment, detto garbage collector, si

di ff tt ( iùpreoccupa di effettuare (più o meno periodicamente) le seguenti operazioni:� Individua variabili, strutture dati, oggetti che

sono usciti dallo scope attuale del programma e t i iù f i tinon potranno mai più essere referenziati

dall'applicazione

Ril i l i l ti t li titàLinguaggi dinamici – A.A. 2009/2010

11

� Rilascia la memoria relativa a tali entità

Page 12: T5 memoria

Uso

� Linguaggi con un garbage collectorJava C# Smalltalk Lisp Haskell� Java, C#, Smalltalk, Lisp, Haskell

� Python, Ruby, Lua, Tcl

� Delphi (dynamic array, long string, variant, interface)

� Linguaggi nati con una gestione manuale, estendibili con un garbage collector:� C, C++ (Boehm Garbage Collector)

� Linguaggi che fanno uso di tecniche� Linguaggi che fanno uso di tecniche dinamiche alternative alla garbage collection:� Perl PHP

Linguaggi dinamici – A.A. 2009/201012

� Perl, PHP

Page 13: T5 memoria

Tracing Garbage Collectorg g

Linguaggi dinamici – A.A. 2009/201013

Page 14: T5 memoria

Introduzione

� La stragrande maggioranza dei garbage collector segue una strategia detta tracingcollector segue una strategia detta tracing garbage collection

Un tracing garbage collector esegue il� Un tracing garbage collector esegue il seguente flusso di operazioni1)D t i li tti i ibili (1)Determina quali oggetti sono raggiungibili (o

potenzialmente tali)

2)S t t tti li lt i tti ( il i d l2)Scarta tutti gli altri oggetti (rilasciandone la relativa memoria)

P i i d l i di� Per oggetto si intende un qualunque tipo di entità richiedente memoria principale (numero,

t tt d ti l i t di l )Linguaggi dinamici – A.A. 2009/2010

14

struttura dati complessa, istanza di classe)

Page 15: T5 memoria

Raggiungibilità di un oggetto

� Un oggetto è detto raggiungibile se esiste una variabile che lo referenziavariabile che lo referenzia� Il riferimento può essere diretto (una variabile

contiene l'oggetto)contiene l oggetto)

� Il riferimento può essere indiretto (una variabile contiene un “puntatore” all'oggetto)contiene un puntatore all oggetto)

Linguaggi dinamici – A.A. 2009/201015

Page 16: T5 memoria

Raggiungibilità di un oggetto

� In altre parole, in un dato istante temporale, un oggetto può essere raggiungibile solamenteoggetto può essere raggiungibile solamente nei seguenti due modi

Raggiungibilità diretta� Raggiungibilità diretta� Alcuni oggetti (detti radice) si assume siano

raggiungibiliraggiungibili

� Tutti gli oggetti dello stack frame corrente (variabili locali parametri della funzione(variabili locali, parametri della funzione correntemente in esecuzione)

Tutte le variabili globali� Tutte le variabili globali

Linguaggi dinamici – A.A. 2009/201016

Page 17: T5 memoria

Raggiungibilità di un oggetto

� In altre parole, in un dato istante temporale, un oggetto può essere raggiungibile solamenteoggetto può essere raggiungibile solamente nei seguenti due modi

Raggiungibilità indiretta� Raggiungibilità indiretta� Ogni oggetto riferito da un oggetto

raggiungibile direttamente è a sua volta unraggiungibile direttamente è, a sua volta, un oggetto raggiungibile

La raggiungiblità è pertanto una chiusura� La raggiungiblità è, pertanto, una chiusura transitiva

Linguaggi dinamici – A.A. 2009/201017

Page 18: T5 memoria

Problemi legati alla raggiungibilità

� La raggiungibilità di un oggetto si può intendere in due modiintendere in due modi

� In senso sintattico (syntactic garbage):li tti i ti� quali oggetti possono essere raggiunti o no per

via dei vincoli sintattici del linguaggio

S li (d l di i i ) d� Semplice (dal punto di vista teorico) da verificare

� La raggiungibilità è intesa in senso sintattico dalla stragrande maggioranza dei garbage

ll tcollector

Linguaggi dinamici – A.A. 2009/201018

Page 19: T5 memoria

Problemi legati alla raggiungibilità

� La raggiungibilità di un oggetto si può intendere in due modiintendere in due modi

� In senso semantico (semantic garbage):li tti i ti� quali oggetti possono essere raggiunti o no per

via del flusso del codice eseguito

Ri hi d l l i d ll'h l i bl d� Richiede la soluzione dell'halting problem: dato un programma ed un ingresso, decidere se il programma esegue per sempre o finisceprogramma esegue per sempre o finisce

� Tale problema è indecidibile: non esiste un l it i d di i l l'h lti blalgoritmo in grado di risolvere l'halting problem

per ciascun programma e per ciascun ingresso

E i ti h i b ll t di iLinguaggi dinamici – A.A. 2009/2010

19

� Euristiche nei garbage collector di ricerca

Page 20: T5 memoria

Algoritmo Mark and Sweep

� Ciascun oggetto presente in memoria ha un flag (tipicamente un bit) riservato per leflag (tipicamente, un bit) riservato per le attività di garbage collection

Il flag assume due distinti valori:� Il flag assume due distinti valori:� 0: l'oggetto corrispondente non è stato ancora

riconosciuto come raggiungibilericonosciuto come raggiungibile

� 1: l'oggetto corrispondente è stato riconosciuto come raggiungibilecome raggiungibile

� Quando non è in esecuzione il garbage ll l fl è lcollector, tale flag è sempre mantenuto al

valore 0

Linguaggi dinamici – A.A. 2009/201020

Page 21: T5 memoria

Algoritmo Mark and Sweep

� Prima fase dell'algoritmoSi individua ciascun oggetto raggiungibile� Si individua ciascun oggetto raggiungibile direttamente o indirettamente

Si i t il l ti fl l l 1� Si imposta il relativo flag al valore 1

� Seconda fase dell'algoritmo� Si esaminano tutti gli oggetti presenti in

memoria

� Gli oggetti con flag pari a 0 si considerano non raggiungibili, e la relativa memoria viene liberata

� Terza fase dell'algoritmo

Linguaggi dinamici – A.A. 2009/201021

g� Viene azzerato il flag degli oggetti superstiti

Page 22: T5 memoria

Manchevolezze dell'algoritmo

� L'interprete si deve interrompere durante l'esecuzione dell'algoritmo di garbagel esecuzione dell algoritmo di garbage collection� I programmi in esecuzione si “congelano” in� I programmi in esecuzione si congelano in

maniera imprevedibile

La scrittura di applicazioni a bassa latenza e� La scrittura di applicazioni a bassa latenza e real-time è impossibile

L'intero insieme degli oggetti deve essere� L'intero insieme degli oggetti deve essere esaminato una volta linearmente

L'i i d li i i i d� L'insieme degli oggetti sopravvissuti deve essere esaminato una volta linearmente

Linguaggi dinamici – A.A. 2009/201022

Page 23: T5 memoria

Algoritmo Tri-colour Marking

� L'insieme degli oggetti presenti in memoria viene partizionato in tre sottoinsiemiviene partizionato in tre sottoinsiemi

� White set:O tti did ti ll i i� Oggetti candidati alla rimozione

� Black set:� Oggetti che non hanno (dimostrabilmente)

riferimenti ad altri oggetti nel white set

� Gray set:� Oggetti che non sono nel white o nel black set� Oggetti che non sono nel white o nel black set

(non si è ancora scoperto se hanno o no riferimenti al white set)

Linguaggi dinamici – A.A. 2009/201023

)

Page 24: T5 memoria

Algoritmo Tri-colour Marking

� Prima fase dell'algoritmoL'insieme degli oggetti presenti in memoria� L'insieme degli oggetti presenti in memoria viene partizionato in tre sottoinsiemi

Whit t O tti did ti ll i i ( d� White set: Oggetti candidati alla rimozione (ad es. sono usciti dallo scope); alla fine dell'algoritmo saranno tutti distruttidell algoritmo saranno tutti distrutti

� Black set: Oggetti non candidati alla rimozione che non hanno riferimenti diretti ad oggetti nelche non hanno riferimenti diretti ad oggetti nel white set (all'inizio il black set è vuoto)

Grey set: Oggetti che non sono nel white o nel� Grey set: Oggetti che non sono nel white o nel black set

Linguaggi dinamici – A.A. 2009/201024

Page 25: T5 memoria

Algoritmo Tri-colour Marking

� Seconda fase dell'algoritmoSi sceglie un oggetto O dal grey set� Si sceglie un oggetto O dal grey set

� L'oggetto O non è un candidato alla rimozione, t t l t t d l l bl k tpertanto va salvato spostandolo nel black set

� Si identificano tutti gli oggetti R1, ..., Rkf i ti di tt t d Oreferenziati direttamente da O

� Si considerano gli oggetti W1, ..., Wj del tt i i R R t ti l hit tsottoinsieme R1, ..., Rk appartenenti al white set

� W1, ..., Wj sarebbero da eliminare, ma sono jriferenziati da un oggetto che non si può rimuovere (O); essi vanno spostati nel grey set

Linguaggi dinamici – A.A. 2009/201025

Page 26: T5 memoria

Algoritmo Tri-colour Marking

� Terza fase dell'algoritmoSi ripete la seconda fase fino a quando il grey� Si ripete la seconda fase fino a quando il grey set non si svuota

Q t f d ll' l it� Quarta fase dell'algoritmo� Gli oggetti nel white set sono dimostrabilmente:

� candidati alla rimozione

� non collegati ad un oggetto da salvare (quindi, non raggiungibili da parte di un oggetto ancora utilizzato dal programma)

� La memoria relativa agli oggetti nel white set può essere rilasciata

Linguaggi dinamici – A.A. 2009/201026

Page 27: T5 memoria

Vantaggi dell'algoritmo

� L'algoritmo Tri-colour Marking può essere eseguito senza richiedere l'interruzioneeseguito senza richiedere l interruzione completa dell'interprete

Il run time mantiene continuamente i tre� Il run time mantiene continuamente i tre insiemi black, white, grey

L i t f i d ll' l it di b� Le prime tre fasi dell'algoritmo di garbage collection vengono eseguite contestualmente

ll' ll i d ll difi di ttiall'allocazione ed alla modifica di oggetti

� La quarta fase viene invocata quando il grey set si svuota

� Non viene mai scandito l'intero insieme degli

Linguaggi dinamici – A.A. 2009/201027

goggetti, bensì solo il white set

Page 28: T5 memoria

Generational Garbage CollectorCollector

Linguaggi dinamici – A.A. 2009/201028

Page 29: T5 memoria

Introduzione

� Uno studio empirico mostra che, per diverse tipologie di programmi gli oggetti creati più ditipologie di programmi, gli oggetti creati più di recente hanno la maggiore probabilità di diventare irragiungibili nell'immediato futurod e ta e ag u g b e ed ato utu o

� Gli oggetti hanno una mortalità infantile elevataelevata

� Tale osservazione può essere presa come una vera e propria ipotesi di lavoro: l'ipotesivera e propria ipotesi di lavoro: l'ipotesi generazionale

Linguaggi dinamici – A.A. 2009/201029

Page 30: T5 memoria

Generazioni

� Gli oggetti nell'heap vengono divisi in zone di memoria distinte dette generazionimemoria distinte, dette generazioni

� Generazioni diverse contengono oggetti con diversa “vecchiaia”diversa vecchiaia

� New Generation: oggetti nuovi� Eden: oggetti appena creati

� Survivor Space 1 e 2: oggetti sopravvissuti ad alcune garbage collection “minori”

� Old generation: oggetti più vecchig gg p

� Perm: oggetti permanenti usati dalla VM (definizioni di classi e metodi)

Linguaggi dinamici – A.A. 2009/201030

(definizioni di classi e metodi)

Page 31: T5 memoria

Generazioni

Linguaggi dinamici – A.A. 2009/201031

Page 32: T5 memoria

Minor collection

� Quando la generazione New tende a riempirsi, viene invocata una minor collectionviene invocata una minor collection

� Gli oggetti raggiungibili dell'Eden vengono copiati nel Survivor Space 1copiati nel Survivor Space 1

� L'Eden si svuota e può essere nuovamente tili t ll i i di i ttiutilizzato per allocazioni di nuovi oggetti

� Nelle minor collection successive, gli oggetti raggiungibili dell'Eden e del Survivor Space 1 vengono copiati nel Survivor Space 2

� Dopo alcune minor collection, gli oggetti sono considerati anziani (tenured) e vengono

Linguaggi dinamici – A.A. 2009/201032

( ) gspostati nella generazione Old

Page 33: T5 memoria

Minor collection

Linguaggi dinamici – A.A. 2009/201033

Page 34: T5 memoria

Major collection

� Quando la generazione Old si riempie, viene invocata una major collectioninvocata una major collection

� Primo passo: il garbage collector scandisce l'intero heap alla ricerca di oggetti nonl intero heap alla ricerca di oggetti non raggiungibili

S d t tti li tti� Secondo passo: tutti gli oggetti non raggiungibili vengono rimossi, e la memoria

i d t lib tcorrispondente liberata

Linguaggi dinamici – A.A. 2009/201034

Page 35: T5 memoria

Major collection

Linguaggi dinamici – A.A. 2009/201035

Page 36: T5 memoria

Alternative al GC:Reference CountingReference Counting

Linguaggi dinamici – A.A. 2009/201036

Page 37: T5 memoria

Algoritmo Reference Counting

� Alcuni linguaggi dinamici adottano alternative più snelle di un garbage collector classicopiù snelle di un garbage collector classico

� La più interessante di tali alternative è il reference countingreference counting� Perl, PHP

� A ciascun oggetto viene associato un contatore degli oggetti che lo stanno referenziando

� Quando il contatore vale 0, nessuno sta ,referenziando l'oggetto, che può essere distrutto

Linguaggi dinamici – A.A. 2009/201037

Page 38: T5 memoria

Vantaggi dell'algoritmo

� L'algoritmo di reference counting è molto più veloce di un qualunque algoritmo di garbageveloce di un qualunque algoritmo di garbage collection

Ci si può letteralmente dimenticare di chiudere� Ci si può letteralmente dimenticare di chiudere i descrittori dei file

Q d i d bl di di il� Quando si esce da un blocco di codice, il reference count della variabile va a 0

L i bil d itt i i di t t� La variabile descrittore viene immediatamente distrutta

C b ll t l' i è� Con un garbage collector, l'operazione non è necessariamente immediata

Linguaggi dinamici – A.A. 2009/201038

Page 39: T5 memoria

Svantaggi dell'algoritmo

� È necessario mantenere e gestire un contatore in ogni oggettoin ogni oggetto

� L'algoritmo di reference counting presenta il problema dei riferimenti circolariproblema dei riferimenti circolari

� Si considerino due oggetti A e B che puntano l'uno all'altrol'uno all'altro

� Sia A che B hanno due riferimenti:� Quello della variabile che li contiene

� Quello dell'oggetto che punta a lorogg p

Linguaggi dinamici – A.A. 2009/201039

Page 40: T5 memoria

Riferimento circolare

f A f Bref A ref B

ref B

ref A

Linguaggi dinamici – A.A. 2009/201040

Page 41: T5 memoria

Svantaggi dell'algoritmo

� Quando uno dei due oggetti (ad esempio, A) esce dal suo scopeesce dal suo scope� Non è più accessibile tramite la sua variabile

l i ò lib t d l� la sua memoria non può essere liberata, dal momento che un altro oggetto la sta referenziandoreferenziando

� L'effetto esterno è quello di un memory leak ( i h l i bil )(consumo memoria, ma non ho la variabile)

� Devo cancellare A e B per liberare memoria

Linguaggi dinamici – A.A. 2009/201041

Page 42: T5 memoria

Riferimenti deboli

� Una soluzione a tale problema consiste nell'adozione dei riferimenti deboli (weaknell adozione dei riferimenti deboli (weakreference)� Modulo Scalar::Utils (Perl)� Modulo Scalar::Utils (Perl)

� I riferimenti circolari sono esplicitamente marcati come deboli (dal programmatore omarcati come deboli (dal programmatore o dall'interprete), e non sono considerati dall'algoritmo di reference countingdall'algoritmo di reference counting

� Quando l'oggetto esce dal suo scope, può diessere distrutto

� Caveat: tutti I link all'oggetto diventano nulli!

Linguaggi dinamici – A.A. 2009/201042