T5 memoria

597 views
509 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
597
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

T5 memoria

  1. 1. Parte 1 Gestione della memoria Linguaggi dinamici – A.A. 2009/2010 1
  2. 2. Introduzione T Ciascun linguaggio di programmazione mette a disposizione meccanismi per la gestione della memoria (principale) T Funzionalità ad alto livello di un gestore della memoria: T Allocazione di risorse All i i T Rilascio di risorse Linguaggi dinamici – A.A. 2009/2010 2
  3. 3. Due diverse filosofie T C: la gestione della memoria è troppo importante per questo va lasciata al programmatore T Smalltalk: la gestione della memoria è troppo importante per questo va lasciata al sistema Linguaggi dinamici – A.A. 2009/2010 3
  4. 4. Gestione manuale della memoria T Nei linguaggi di “vecchio stampo”, sono messe a disposizione del programmatore le funzioni di allocazione e deallocazione della memoria, c e usa o le p e o a, che usano e primitive de s ste a t e del sistema operativo sottostante T C: malloc(), free() T La gestione della memoria è interamente lasciata al programmatore T Gestione eccezionalmente veloce T Gestione eccezionalmente soggetta ad errori di G ti i l t tt d i violazione di segmento Linguaggi dinamici – A.A. 2009/2010 4
  5. 5. Gestione manuale della memoria T Schema di gestione manuale della memoria <Acquisizione della memoria> T T <Uso della memoria> T <Rilascio della memoria> T Esempio (C): ptr = malloc(size); <uso di memoria tramite ptr, *ptr>; uso ptr ; free(ptr); Linguaggi dinamici – A.A. 2009/2010 5
  6. 6. Gestione manuale della memoria T Vantaggi: T La velocità delle operazioni di gestione è elevata (in sostanza, è quella del kernel sottostante) T I pattern di acquisizione/rilascio sono espliciti T Svantaggi: T Onere di programmazione non indifferente, legato O i i diff t l t all'uso della memoria (aritmetica dei puntatori : segmentation fault, fault puntatore a memoria liberata : dangling reference) T Gestione manuale non scala con le dimensioni del programma (è molto facile dimenticarsi qualche free() : memory leak) Linguaggi dinamici – A.A. 2009/2010 6
  7. 7. Gestione automatica della memoria T Nei linguaggi più moderni, una macchina virtuale fornisce l'astrazione portabile di un l astrazione calcolatore T La macchina virtuale implementa il proprio gestore della memoria, che svolge le operazioni di allocazione e deallocazione in maniera automatica, a tempo di esecuzione T Non esiste più il concetto di allocazione N i t iù tt ll i dinamica della memoria T Il programmatore deve solo preoccuparsi di dichiarare ed utilizzare variabili semplici o complesse, mutevoli in tipo e dimensione Linguaggi dinamici – A.A. 2009/2010 7
  8. 8. Gestione automatica della memoria T Schema di gestione automatica della memoria Dichiarazione di una variabile (semplice o T complessa) T <U <Uso d ll variabile> della i bil > T Esempio (Perl): my @array = (); push @array, 10; push @array, “ciao”; Linguaggi dinamici – A.A. 2009/2010 8
  9. 9. Gestione automatica della memoria T Vantaggi: T L uso L'uso della memoria occupata dalle strutture dati è controllato dall'interprete (assenza di violazioni di segmento) T La memoria viene prenotata quando serve ( (dichiarazione di una variabile) e rilasciata quando ) q non serve più (uscita da un blocco di codice) (è molto più difficile avere memory leak) T Svantaggi: T La velocità delle operazioni di gestione è molto p g bassa (interviene l'interprete) T I pattern di acquisizione/rilascio non sono espliciti Linguaggi dinamici – A.A. 2009/2010 9
  10. 10. Parte 1 Garbage Collection g Linguaggi dinamici – A.A. 2009/2010 10
  11. 11. Definizione T La garbage collection è una forma di gestione automatica della memoria T John McCarthy, LISP, 1959 T Un U modulo software appartenente al run time d l ft t t l ti environment, detto garbage collector, si preoccupa di effettuare (più o meno ff tt ( iù periodicamente) le seguenti operazioni: T Individua variabili, strutture dati, oggetti che sono usciti dallo scope attuale del programma e non potranno mai più essere referenziati t i iù f i ti dall'applicazione T Rilascia l memoria relativa a tali entità Ril i la i l ti t li tità Linguaggi dinamici – A.A. 2009/2010 11
  12. 12. Uso T Linguaggi con un garbage collector T Java, C#, Smalltalk, Lisp, Java C# Smalltalk Lisp Haskell T Python, Ruby, Lua, Tcl T Delphi (dynamic array, long string, variant, interface) T Linguaggi nati con una gestione manuale, estendibili con un garbage collector: T C, C++ (Boehm Garbage Collector) T Linguaggi che fanno uso di tecniche dinamiche alternative alla garbage collection: T Perl, Perl PHP Linguaggi dinamici – A.A. 2009/2010 12
  13. 13. Tracing Garbage Collector g g Linguaggi dinamici – A.A. 2009/2010 13
  14. 14. Introduzione T La stragrande maggioranza dei garbage collector segue una strategia detta tracing garbage collection T Un tracing garbage collector esegue il seguente flusso di operazioni 1)Determina quali oggetti sono raggiungibili ( 1)D t i li tti i ibili (o potenzialmente tali) 2)Scarta tutti gli altri oggetti (rilasciandone la 2)S t t tti li lt i tti ( il i d l relativa memoria) T Per P oggetto si intende un qualunque tipo di ii d l i entità richiedente memoria principale (numero, struttura d ti complessa, istanza di classe) t tt dati l i t l ) Linguaggi dinamici – A.A. 2009/2010 14
  15. 15. Raggiungibilità di un oggetto T Un oggetto è detto raggiungibile se esiste una variabile che lo referenzia T Il riferimento può essere diretto (una variabile contiene l'oggetto) l oggetto) T Il riferimento può essere indiretto (una variabile contiene un “puntatore” all'oggetto) puntatore all oggetto) Linguaggi dinamici – A.A. 2009/2010 15
  16. 16. Raggiungibilità di un oggetto T In altre parole, in un dato istante temporale, un oggetto può essere raggiungibile solamente nei seguenti due modi T Raggiungibilità diretta T Alcuni oggetti (detti radice) si assume siano raggiungibili T Tutti gli oggetti dello stack frame corrente (variabili locali parametri della funzione locali, correntemente in esecuzione) T Tutte le variabili globali Linguaggi dinamici – A.A. 2009/2010 16
  17. 17. Raggiungibilità di un oggetto T In altre parole, in un dato istante temporale, un oggetto può essere raggiungibile solamente nei seguenti due modi T Raggiungibilità indiretta T Ogni oggetto riferito da un oggetto raggiungibile direttamente è a sua volta un è, volta, oggetto raggiungibile T La raggiungiblità è pertanto una chiusura è, pertanto, transitiva Linguaggi dinamici – A.A. 2009/2010 17
  18. 18. Problemi legati alla raggiungibilità T La raggiungibilità di un oggetto si può intendere in due modi T In senso sintattico (syntactic garbage): T quali oggetti possono essere raggiunti o no per li tti i ti via dei vincoli sintattici del linguaggio T Semplice (dal punto di vista teorico) da S li (d l i i )d verificare T La raggiungibilità è intesa in senso sintattico dalla stragrande maggioranza dei garbage collector ll t Linguaggi dinamici – A.A. 2009/2010 18
  19. 19. Problemi legati alla raggiungibilità T La raggiungibilità di un oggetto si può intendere in due modi T In senso semantico (semantic garbage): T quali oggetti possono essere raggiunti o no per li tti i ti via del flusso del codice eseguito T Richiede l Ri hi d la soluzione dell'halting problem: d l i d ll'h l i bl dato un programma ed un ingresso, decidere se il programma esegue per sempre o finisce T Tale problema è indecidibile: non esiste un algoritmo in grado di risolvere l'halting problem l it i d i l l'h lti bl per ciascun programma e per ciascun ingresso T Euristiche i E i ti h nei garbage collector di ricerca b ll t i Linguaggi dinamici – A.A. 2009/2010 19
  20. 20. Algoritmo Mark and Sweep T Ciascun oggetto presente in memoria ha un flag (tipicamente un bit) riservato per le (tipicamente, attività di garbage collection T Il flag assume due distinti valori: T 0: l'oggetto corrispondente non è stato ancora riconosciuto come raggiungibile T 1: l'oggetto corrispondente è stato riconosciuto come raggiungibile T Quando non è in esecuzione il garbage collector, tale flag è sempre mantenuto al ll l fl l valore 0 Linguaggi dinamici – A.A. 2009/2010 20
  21. 21. Algoritmo Mark and Sweep T Prima fase dell'algoritmo T Si individua ciascun oggetto raggiungibile direttamente o indirettamente T Si i imposta il relativo flag al valore 1 t l ti fl l l T Seconda fase dell'algoritmo T Si esaminano tutti gli oggetti presenti in memoria T Gli oggetti con flag pari a 0 si considerano non raggiungibili, e la relativa memoria viene liberata T g Terza fase dell'algoritmo T Viene azzerato il flag degli oggetti superstiti Linguaggi dinamici – A.A. 2009/2010 21
  22. 22. Manchevolezze dell'algoritmo T L'interprete si deve interrompere durante l esecuzione dell algoritmo l'esecuzione dell'algoritmo di garbage collection T I programmi in esecuzione si “congelano” in congelano maniera imprevedibile T La scrittura di applicazioni a bassa latenza e real-time è impossibile T L'intero insieme degli oggetti deve essere esaminato una volta linearmente T L'insieme degli oggetti sopravvissuti deve L'i i d li i i id essere esaminato una volta linearmente Linguaggi dinamici – A.A. 2009/2010 22
  23. 23. Algoritmo Tri-colour Marking T L'insieme degli oggetti presenti in memoria viene partizionato in tre sottoinsiemi T White set: T Oggetti candidati alla rimozione O tti did ti ll i i T Black set: T Oggetti che non hanno (dimostrabilmente) riferimenti ad altri oggetti nel white set T Gray set: T 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/2010 23
  24. 24. Algoritmo Tri-colour Marking T Prima fase dell'algoritmo T L'insieme degli oggetti presenti in memoria viene partizionato in tre sottoinsiemi T White t Oggetti candidati alla rimozione (ad Whit set: O tti did ti ll i i ( d es. sono usciti dallo scope); alla fine dell algoritmo dell'algoritmo saranno tutti distrutti T Black set: Oggetti non candidati alla rimozione che non hanno riferimenti diretti ad oggetti nel white set (all'inizio il black set è vuoto) T Grey set: Oggetti che non sono nel white o nel black set Linguaggi dinamici – A.A. 2009/2010 24
  25. 25. Algoritmo Tri-colour Marking T Seconda fase dell'algoritmo T Si sceglie un oggetto O dal grey set T L'oggetto O non è un candidato alla rimozione, pertanto va salvato spostandolo nel black set t t l t t d l l bl k t T Si identificano tutti gli oggetti R1, ..., Rk referenziati direttamente da O f i ti di tt t d T Si considerano gli oggetti W1, ..., Wj del sottoinsieme R1, ..., Rk appartenenti al white set tt i i t ti l hit t T W1, ..., Wj sarebbero da eliminare, ma sono riferenziati da un oggetto che non si può rimuovere (O); essi vanno spostati nel grey set Linguaggi dinamici – A.A. 2009/2010 25
  26. 26. Algoritmo Tri-colour Marking T Terza fase dell'algoritmo T Si ripete la seconda fase fino a quando il grey set non si svuota T Quarta fase d ll' l Q t f dell'algoritmo it T Gli oggetti nel white set sono dimostrabilmente: T candidati alla rimozione T non collegati ad un oggetto da salvare (quindi, non raggiungibili da parte di un oggetto ancora utilizzato dal programma) T La memoria relativa agli oggetti nel white set può essere rilasciata Linguaggi dinamici – A.A. 2009/2010 26
  27. 27. Vantaggi dell'algoritmo T L'algoritmo Tri-colour Marking può essere eseguito senza richiedere l interruzione l'interruzione completa dell'interprete T Il run time mantiene continuamente i tre insiemi black, white, grey T Le i L prime tre fasi dell'algoritmo di garbage t f i d ll' l it b collection vengono eseguite contestualmente all'allocazione ed alla modifica di oggetti ll' ll i d ll difi tti T La quarta fase viene invocata quando il grey set si svuota T Non viene mai scandito l'intero insieme degli g oggetti, bensì solo il white set Linguaggi dinamici – A.A. 2009/2010 27
  28. 28. Generational Garbage Collector Linguaggi dinamici – A.A. 2009/2010 28
  29. 29. Introduzione T Uno studio empirico mostra che, per diverse tipologie di programmi, gli oggetti creati più di programmi recente hanno la maggiore probabilità di d e ta e ag u g b diventare irragiungibili nell'immediato futuro e ed ato utu o T Gli oggetti hanno una mortalità infantile elevata T Tale osservazione può essere presa come una vera e propria ipotesi di lavoro: l'ipotesi generazionale Linguaggi dinamici – A.A. 2009/2010 29
  30. 30. Generazioni T Gli oggetti nell'heap vengono divisi in zone di memoria distinte, dette generazioni distinte T Generazioni diverse contengono oggetti con diversa “vecchiaia” vecchiaia T New Generation: oggetti nuovi T Eden: oggetti appena creati T Survivor Space 1 e 2: oggetti sopravvissuti ad alcune garbage collection “minori” T Old generation: oggetti più vecchi g gg p T Perm: oggetti permanenti usati dalla VM (definizioni di classi e metodi) Linguaggi dinamici – A.A. 2009/2010 30
  31. 31. Generazioni Linguaggi dinamici – A.A. 2009/2010 31
  32. 32. Minor collection T Quando la generazione New tende a riempirsi, viene invocata una minor collection T Gli oggetti raggiungibili dell'Eden vengono copiati nel Survivor Space 1 T L'Eden si svuota e può essere nuovamente utilizzato per allocazioni di nuovi oggetti tili t ll i i i tti T Nelle minor collection successive, gli oggetti raggiungibili dell'Eden e del Survivor Space 1 vengono copiati nel Survivor Space 2 T Dopo alcune minor collection, gli oggetti sono considerati anziani (tenured) e vengono ( ) g spostati nella generazione Old Linguaggi dinamici – A.A. 2009/2010 32
  33. 33. Minor collection Linguaggi dinamici – A.A. 2009/2010 33
  34. 34. Major collection T Quando la generazione Old si riempie, viene invocata una major collection T Primo passo: il garbage collector scandisce l intero l'intero heap alla ricerca di oggetti non raggiungibili T Secondo passo: t tti gli oggetti non S d tutti li tti raggiungibili vengono rimossi, e la memoria corrispondente liberata i d t lib t Linguaggi dinamici – A.A. 2009/2010 34
  35. 35. Major collection Linguaggi dinamici – A.A. 2009/2010 35
  36. 36. Alternative al GC: Reference Counting Linguaggi dinamici – A.A. 2009/2010 36
  37. 37. Algoritmo Reference Counting T Alcuni linguaggi dinamici adottano alternative più snelle di un garbage collector classico T La più interessante di tali alternative è il reference counting T Perl, PHP T A ciascun oggetto viene associato un contatore degli oggetti che lo stanno referenziando T Quando il contatore vale 0, nessuno sta , referenziando l'oggetto, che può essere distrutto Linguaggi dinamici – A.A. 2009/2010 37
  38. 38. Vantaggi dell'algoritmo T L'algoritmo di reference counting è molto più veloce di un qualunque algoritmo di garbage collection T Ci si può letteralmente dimenticare di chiudere i descrittori dei file T Quando si esce da un blocco di codice, il Q d i d bl di reference count della variabile va a 0 T La L variabile d i bil descrittore viene i itt i immediatamente di t t distrutta T Con un garbage collector, l'operazione non è C b ll t l' i necessariamente immediata Linguaggi dinamici – A.A. 2009/2010 38
  39. 39. Svantaggi dell'algoritmo T È necessario mantenere e gestire un contatore in ogni oggetto T L'algoritmo di reference counting presenta il problema dei riferimenti circolari T Si considerino due oggetti A e B che puntano l'uno all'altro T Sia A che B hanno due riferimenti: T Quello della variabile che li contiene T Quello dell'oggetto che punta a loro gg p Linguaggi dinamici – A.A. 2009/2010 39
  40. 40. Riferimento circolare ref A f ref B f ref B ref A Linguaggi dinamici – A.A. 2009/2010 40
  41. 41. Svantaggi dell'algoritmo T Quando uno dei due oggetti (ad esempio, A) esce dal suo scope T Non è più accessibile tramite la sua variabile T la l sua memoria non può essere liberata, dal i ò lib t d l momento che un altro oggetto la sta referenziando T L'effetto esterno è quello di un memory leak (consumo memoria, ma non ho la variabile) ( i h l i bil ) T Devo cancellare A e B per liberare memoria Linguaggi dinamici – A.A. 2009/2010 41
  42. 42. Riferimenti deboli T Una soluzione a tale problema consiste nell adozione nell'adozione dei riferimenti deboli (weak reference) T Modulo Scalar::Utils (Perl) T I riferimenti circolari sono esplicitamente marcati come deboli (dal programmatore o dall'interprete), e non sono considerati dall'algoritmo di reference counting T Quando l'oggetto esce dal suo scope, può essere didistrutto T Caveat: tutti I link all'oggetto diventano nulli! Linguaggi dinamici – A.A. 2009/2010 42

×