programmazione ii - lezione 7groups.di.unipi.it/~daniele/teaching/pr2-10/pr2-07.pdf ·...
TRANSCRIPT
Programmazione IILezione 7
Daniele Sgandurra
9/11/2010
1/24 Programmazione II Lezione 7 9/11/2010
Sommario
1 Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
2/24 Programmazione II Lezione 7 9/11/2010
Gestione della Memoria
Parte I
Gestione della Memoria
3/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Obiettivi
Capire la gestione della memoria nella macchina astratta.
Tecniche di gestione della memoria:
gestione statica;gestione dinamica.
Implementazione dell’ambiente e delle regole dello scope.
4/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Gestione della Memoria
Funzionalita dell’interprete associato a una macchina astratta.
Allocazione della memoria per i programmi e i dati:
disposizione in memoria;per quanto tempo;strutture dati ausiliarie.
Macchina astratta di basso livello:
gestione statica: dati e programmi in memoria prima dell’esecuzionee fino alla fine.
Macchina astratta di alto livello:
gestione dinamica: allocazione e deallocazione decisa durantel’esecuzione:
ricorsione: il compilatore non puo stabilire un numero massimodi sottoprogrammi attivi; uso di una pila (politica LIFO).allocazione dinamica esplicita: uso dell’heap.
5/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Gestione Statica della Memoria
Gestione a cura del compilatore.
Tutti gli oggetti in una zona fissata:
variabili globali;istruzioni del codice oggetto;costanti;tabelle interne prodotte dal compilatore:
gestione nomi;controllo sui tipi;garbage collection.
Inoltre, se il linguaggio non prevede ricorsione:
zona di memoria fissata per ogni sottoprogramma:
variabili locali;parametri;indirizzo di ritorno;informazioni di bookkepping (valore registri, debugging, etc).
6/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Linguaggio con Allocazione Statica della Memoria
7/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Gestione Dinamica della Memoria
Per i linguaggi con strutturazione a blocchi dei programmi:
in-line;corpi di sottoprogrammi.
Apertura e chiusura:
politica LIFO: uso di una pila.
Esempio:
1 A :{ i n t a = 1 ;2 i n t b = 0 ;34 B :{ i n t c = 3 ;5 i n t b = 3 ;6 }7 b = a+1;8 }
8/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Esempio (1)
9/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Esempio (2)
10/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Esempio (3)
11/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Record di Attivazione
Record di attivazione (RdA) o frame:
spazio di memoria allocato su pila:
blocchi in-line,corpi di sottoprogramma,associati a ogni attivazione (dinamicamente) e non alladichiarazione (staticamente):
valori salvati nel RdA sempre diversi per ogni chiamata.
Pila di run-time (o di sistema).
Anche per linguaggi senza ricorsione:
conviene per ottimizzare l’occupazione della memoria rispetto a unapolitica interamente di tipo statico.
12/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Record di Attivazione per Blocchi In-Line
Risultati intermedi:
calcoli complessi semplificati dal compilatore.
Variabili locali:
dichiarate nel blocco;dimensioni note a compile-time:
eccezione: dimensione array dinamici gestite tramite (partefissa, parte variabile).
Puntatore catena dinamica:
detto anche link dinamico o di controllo;punta al precedente RdA sulla pila.
necessario date le dimensioni potenzialmente diverse dei RdA.
13/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Record di Attivazione per Blocchi In-Line
14/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Esempio: Spazio per Risultati Intermedi
i n t a = 3 ;b = ( a + x ) / ( x + y ) ;
15/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Record di Attivazione per Procedure
Risultati intermedi, variabili locali, puntatore di catena dinamica.
Puntatore di catena statica:
necessario per le regole di scope statico.
Indirizzo di ritorno:
prima istruzione da eseguire dopo l’uscita.
Indirizzo del risultato:
nel RdA del blocco chiamante;solo nel caso di funzioni.
Parametri:
valore dei parametri effettivi usati dal sottoprogramma.
16/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Record di Attivazione per Procedure
Osservazioni:
la disposizione effettiva dipende dalle implementazioni;
si usano offset per individuare i vari campi:
di norma, non compaiono identificatori di variabili (locali e non);il compilatore calcola gli offset.
possibili ottimizzazioni:
es.: salvataggio di informazioni nei registri anziche nel RdA.
17/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Record di Attivazione per Procedure
18/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Pila dei Recordi di Attivazione
19/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Gestione della Pila
Puntatore di RdA (o frame pointer): si riferisce all’ambiente corrente.
Stack pointer: posizione dell’inizio della memoria libera (puo essereomesso).
Inserimento di un RdA:
entrata in un blocco;chiamata di sottoprogramma.
Eliminazione di un RdA:
uscita dal blocco;uscita da sottoprogramma.
20/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Gestione della Pila
Fatta sia dal chiamante che dal chiamato: frammenti di codice aggiunto dalcompilatore.
Nel chiamante (o blocco esterno):
sequenza di chiamata:
eseguita, in parte, prima della chiamata (entrata);eseguita, in parte, dopo il ritorno dalla chiamata (uscita).
Nel chiamato (o blocco interno):
prologo:
eseguito subito dopo la chiamata (entrata);
epilogo:
eseguito subito prima del ritorno dalla chiamata (uscita).
Preferibilmente, delegare al chiamato: codice aggiunto una sola volta.
21/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Gestione della Pila: Azioni
Chiamata di procedura (sequenza di chiamata + prologo):
modifica del PC;allocazione spazio su pila;modifica puntatore RdA;passaggio parametri;salvataggio registri;esecuzione codice inizializzazione.
Ritorno dalla procedura (ritorno controllo di chiamata + epilogo):
ripristino del PC;restituzione dei valori (funzioni);ripristino registri (+ modifica puntatore RdA);esecuzione codice finalizzazione;deallocazione spazio su pila.
22/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Gestione Dinamica Mediante Heap
Continua...
23/24 Programmazione II Lezione 7 9/11/2010
Gestione della MemoriaGestione StaticaGestione Dinamica Mediante PilaGestione Dinamica Mediante Heap
Riferimenti
[1] Linguaggi di programmazione: principi e paradigmi (Cap. 5).
Maurizio Gabbrielli, Simone Martini.
24/24 Programmazione II Lezione 7 9/11/2010