SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Gestione della
  memoria
(Classi di memorizzazione,
  Record di attivazione,
 Spazio di indirizzamento)
Classi di memorizzazione
• Stiamo per vedere la classificazione di un oggetto in
  funzione del suo tempo di vita
• In funzione del proprio tempo di vita un oggetto
  appartiene ad una delle seguenti classi di
  memorizzazione:
    1) Automatica
    2) Statica
    3) Dinamica




Programmazione I - Paolo Valente, 2008/2009          2
Oggetti automatici
• Oggetti definiti nei blocchi e parametri formali
• Creati al raggiungimento della loro definizione
  durante l'esecuzione del programma, distrutti al
  termine dell'esecuzione del blocco in cui sono
  definiti
• Se non inizializzati hanno valori casuali
   – Dimenticare di inizializzarli è una classica
     fonte di errori




Programmazione I - Paolo Valente, 2008/2009          3
Oggetti statici
• Oggetti globali (definiti al di fuori di ogni funzione)
  o definiti nelle funzioni utilizzando la parola chiave
  static (di quest'ultima non vedremo i dettagli)
• Creati all'inizio dell'esecuzione del programma,
  distrutti al termine dell'esecuzione del programma
• Se non inizializzati hanno valore zero




Programmazione I - Paolo Valente, 2008/2009             4
Oggetti dinamici
• Allocati nella memoria libera
• Esistono dal momento dell'allocazione fino alla
  deallocazione (o al più fino alla fine dell'esecuzione
  programma)
• Se non inizializzati hanno valori casuali
   – Come per gli oggetti automatici, dimenticare di
     inizializzarli è una classica fonte di errori




Programmazione I - Paolo Valente, 2008/2009           5
I tre elementi fondamentali per
               comprendere le funzioni

• Definizione/Dichiarazione della funzione

• Uso della funzione (chiamata)

• Esecuzione della funzione (record di
  attivazione)




Programmazione I - Paolo Valente, 2008/2009   6
Istruzioni e memoria
• Così come gli oggetti, anche le istruzioni (in
  linguaggio macchina) stanno in memoria
• Sono eseguite nell'ordine in cui compaiono in
  memoria
   – con l'eccezione delle istruzioni di salto che
     possono far continuare l'esecuzione da una
     istruzione diversa da quella che le segue
• Definiamo indirizzo di una funzione l'indirizzo
  in cui è memorizzata la prima istruzione della
  funzione

Programmazione I - Paolo Valente, 2008/2009     7
Esecuzione funzioni
• Prima dell'inizio dell'esecuzione di una funzione,
  viene creato in memoria il corrispondente record di
  attivazione

    – Struttura dati contenente fondamentalmente gli oggetti
      locali alla funzione (variabili/costanti con nome locali
      nonché parametri formali)
    – Tipicamente memorizzata in una zona contigua di
      memoria

• I record di attivazione sono a loro volta memorizzati
  in una zona della memoria del processo chiamata
  stack (pila)
Programmazione I - Paolo Valente, 2008/2009                      8
Record di attivazione
Un record di attivazione rappresenta l’ambiente
della funzione, e contiene:
                           Parametri formali,
  Parametro formale 1
                           inizializzati con i
  Parametro formale 2      parametri attuali
             ...
                                              Variabili (costanti)
  Parametro formale M
                                              locali
Variabile/costante locale 1
                                              Indirizzo del record di
Variabile/costante locale 2
                                              attivazione del chiamante, per
             ...
                                              ripristinarne l'ambiente alla fine
Variabile/costante locale N                   dell'esecuzione della funzione
 Collegamento dinamico                          Indirizzo dell'istruzione del
    Indirizzo di ritorno                        chiamante a cui tornare alla
                                                fine dell'esecuzione
Programmazione I - Paolo Valente, 2008/2009                                    9
Record di attivazione (cont.)
• Quando la funzione termina, il controllo torna al
  chiamante, che deve:
      – riprendere la sua esecuzione dall'istruzione successiva alla
        chiamata della funzione
      – trovare tutti suoi dati inalterati
• E' questo il motivo per cui, quando il chiamante chiama la
  funzione, prima di tutto si inseriscono nel record di
  attivazione della funzione:
      – indirizzo di ritorno, ossia l’indirizzo della prossima istruzione del
        chiamante che andrà eseguita quando la funzione terminerà
      – collegamento dinamico, ossia un collegamento al record di
        attivazione del chiamante, in modo da poter ripristinare l’ambiente
        del chiamante quando la funzione terminerà
• La sequenza dei collegamenti dinamici costituisce la
  cosiddetta catena dinamica, che rappresenta la storia
  delle attivazioni (“chi ha chiamato chi”)
Programmazione I - Paolo Valente, 2008/2009                                     10
Record di attivazione (cont.)
• La dimensione del record di attivazione:
      – varia da una funzione all’altra
      – ma, per una data funzione, è fissa e calcolabile a priori

• Il record di attivazione:
      – viene creato dinamicamente nel momento in cui la funzione viene
        chiamata
      – rimane sullo stack per tutto il tempo in cui la funzione è in
        esecuzione
      – viene deallocato alla fine quando la funzione termina

• Funzioni che chiamano altre funzioni danno luogo a
  una sequenza di record di attivazione
      – allocati secondo l’ordine delle chiamate
      – de-allocati in ordine inverso
            → i record di attivazione sono innestati

Programmazione I - Paolo Valente, 2008/2009                           11
Esempio
int x = 4;
                                                    ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
main() { P(); }
                                                          STACK



                                                    ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                 12
Esempio
int x = 4;
                                                        ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
main() { P(); }
                                                              STACK


                                                    main()
                                                        ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                     13
Esempio
int x = 4;
                                                          ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
main() { P(); }
                                                                STACK
                                                    P()
                                                    main()
                                                          ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                       14
Esempio
int x = 4;
                                                          ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
                                                    Q()
main() { P(); }
                                                                STACK
                                                    P()
                                                    main()
                                                          ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                       15
Esempio
int x = 4;
                                                          ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
                                                    R()
void P() { int a=10; Q(a); }
                                                    Q()
main() { P(); }
                                                                STACK
                                                    P()
                                                    main()
                                                          ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                       16
Esempio
int x = 4;
                                                          ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
                                                    Q()
main() { P(); }
                                                                STACK
                                                    P()
                                                    main()
                                                          ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                       17
Esempio
int x = 4;
                                                          ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
main() { P(); }
                                                                STACK
                                                    P()
                                                    main()
                                                          ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                       18
Esempio
int x = 4;
                                                        ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
main() { P(); }
                                                              STACK


                                                    main()
                                                        ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                     19
Esempio
int x = 4;
                                                    ...
void R(int A) { x = A; }
void Q(int x) { R(x); }
void P() { int a=10; Q(a); }
main() { P(); }
                                                          STACK



                                                    ...
Sequenza di attivazioni
( Sist. Oper. → ) main → P → Q → R




Programmazione I - Paolo Valente, 2008/2009                 20
Uso dello Stack (Pila)
• Si ricorda che nel linguaggio C/C++ tutto si basa
  su funzioni (anche il main() è una funzione)
• Per catturare la semantica delle chiamate
  annidate (una funzione che chiama un’altra
  funzione, che ne chiama un’altra ...), è necessario
  gestire l’area di memoria che contiene i record di
  attivazione relative alle varie chiamate di funzioni
  come una pila (stack):
             Last In, First Out → LIFO
          (L’ultimo record ad entrare è il primo a uscire)


Programmazione I - Paolo Valente, 2008/2009                  21
Esecuzione fattoriale
• Programma che calcola il fattoriale di un valore
  naturale N
                                                  Nota: n viene inizializzato con il VALORE di x.
                                                  n viene modificato, mentre x rimane inalterato
     int fattoriale(int n)                        dopo l’esecuzione della funzione fattoriale()
      { int p=1;
                                                                              record di
                                                         3   21
                                              n
        while (n>1)                                                           attivazione di
            { p=p*n; n-- }                                                    fattoriale()
                                                         1   3        6
                                              p
        return p;
                                                   ritorno main Colle. main
      }
                                                                              record di
     main()                                   x                   3
                                                                              attivazione di
      { int x=3, y;                                                           main()
                                                             casuale
                                              y




                                                                                               STACK
        y=fattoriale(x);
                                                   ritorno S.O.           -
       cout<<y<<endl; }

     La figura illustra la situazione nello stack nel momento di massima
     espansione, quando la funzione sta per terminare. Quando la
     funzione fattoriale() termina, il suo record viene deallocato e il risultato
     viene trasferito (tramite un registro della CPU) nella cella di nome y
Programmazione I - Paolo Valente, 2008/2009                                                    22
Memorizzazione valore di ritorno
• Spesso prima di chiamare una funzione si
  aggiunge un ulteriore elemento nel record di
  attivazione del chiamante, destinato a contenere il
  valore di ritorno della funzione che si sta per
  chiamare
• Tale risultato viene copiato dal chiamante
  (ovviamente) all'interno di tale elemento prima di
  distruggere il record della funzione appena
  terminata
• Altre volte, il risultato viene restituito dalla
  funzione al chiamante semplicemente lasciandolo
  in un registro della CPU
Programmazione I - Paolo Valente, 2008/2009            23
Prologo ed epilogo
• Il codice che crea il record di attivazione di una
  funzione prima di saltare all'indirizzo della (prima
  istruzione) della funzione si chiama tipicamente
  prologo
• Il codice che immette il valore di ritorno di una
  funzione nel record di attivazione del chiamante o
  in un registro di memoria, e poi dealloca il record
  di attivazione della funzione stessa si chiama
  tipicamente epilogo
• Dato un programma in C/C++, sia il prologo che
  l'epilogo sono inseriti automaticamente dal
  compilatore nel file oggetto
Programmazione I - Paolo Valente, 2008/2009          24
Uno sguardo verso il basso …
• La macchina virtuale del linguaggio C/C++ fa vedere al
  programmatore la memoria come un contenitore di celle in
  cui si creano automaticamente le variabili con classe di
  memorizzazione statica e automatica (queste ultime si
  distruggono anche automaticamente), ed in cui si possono
  allocare dinamicamente oggetti
• Per ottenere queste funzionalità il compilatore inserisce nel
  programma eseguibile del codice aggiuntivo
   – Prologo ed epilogo per le gestione dei record di
      attivazione
   – Chiamate a funzioni del sistema operativo per gestire la
      memoria dinamica
• Non entriamo nei dettagli di questo codice, ma vediamo solo
  la struttura tipica dello spazio di indirizzamento di un
  processo
Programmazione I - Paolo Valente, 2008/2009                 25
Spazio di indirizzamento
• Lo spazio di indirizzamento di un processo è l'insieme di
  locazioni di memoria accessibili dal processo
   Testo, ossia istruzioni
           Costanti
 Oggetti statici inizializzati                 Automaticamente messi
                                               a 0, per questioni di
Oggetti statici non inizializzati
                                               sicurezza e ripetibilità
          Memoria dinamica
                                              • Direzioni di crescita:
                                              – lo stack cresce man
              Spazio libero                     mano che si annidano
                                                chiamate di funzione
                                              – la memoria dinamica
                     Stack                      cresce man mano che
                                                vengono allocati oggetti
Programmazione I - Paolo Valente, 2008/2009                            26
Valore oggetti statici
• Gli oggetti statici non inizializzati sono inizializzati a zero
      – per questioni di sicurezza, perché altrimenti lanciando un
        nuovo programma potremmo usarli per leggere il
        precedente contenuto di locazioni di memoria della
        macchina
      – per rendere più deterministico e ripetibile il
        comportamento dei programmi
• Ora abbiamo una spiegazione operativa del fatto che gli
  oggetti statici sono automaticamente inizializzati a 0




Programmazione I - Paolo Valente, 2008/2009                         27
Valore oggetti automatici e dinamici
• Memoria dinamica e stack possono crescere finché lo spazio
  libero non si esaurisce
      – sia quando un record di attivazione è rimosso che quando
        un oggetto dinamico è deallocato, le locazioni di memoria
        precedentemente occupate non sono settate a 0
                sono invece lasciate inalterate per efficienza
            o

      – ora abbiamo una spiegazione del fatto che gli oggetti
        dinamici ed automatici hanno valori casuali
                il valore di un oggetto automatico/dinamico allocato in
            o

                una certa zona di memoria dipende dai valori
                precedentemente memorizzati in quella zona di
                memoria
                cambia quindi a seconda di quello che è successo
            o

                prima che l'oggetto in questione venisse allocato
Programmazione I - Paolo Valente, 2008/2009                         28

Contenu connexe

En vedette (10)

Mappa mentale Gestione della memoria
Mappa mentale Gestione della memoriaMappa mentale Gestione della memoria
Mappa mentale Gestione della memoria
 
Lavoro modugno
Lavoro modugnoLavoro modugno
Lavoro modugno
 
Presentazione TAG Lucca 24.11.2012
Presentazione TAG Lucca 24.11.2012Presentazione TAG Lucca 24.11.2012
Presentazione TAG Lucca 24.11.2012
 
TechnologyBiz 2011 Minigrafie ITA
TechnologyBiz 2011 Minigrafie ITATechnologyBiz 2011 Minigrafie ITA
TechnologyBiz 2011 Minigrafie ITA
 
Attrarre studenti e neolaureati v3.0 vale
Attrarre studenti e neolaureati v3.0 valeAttrarre studenti e neolaureati v3.0 vale
Attrarre studenti e neolaureati v3.0 vale
 
Chi controlla l'informazione in Italia?
Chi controlla l'informazione in Italia?Chi controlla l'informazione in Italia?
Chi controlla l'informazione in Italia?
 
Save The Cheerleader, Save The World
Save The Cheerleader, Save The WorldSave The Cheerleader, Save The World
Save The Cheerleader, Save The World
 
Diego Orzalesi
Diego OrzalesiDiego Orzalesi
Diego Orzalesi
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
Asp.net gestione della_memoria
Asp.net gestione della_memoriaAsp.net gestione della_memoria
Asp.net gestione della_memoria
 

Plus de Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 

Plus de Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

Dernier

ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIinfogdgmi
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 

Dernier (6)

ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AI
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 

16 - Programmazione: Gestione memoria

  • 1. Gestione della memoria (Classi di memorizzazione, Record di attivazione, Spazio di indirizzamento)
  • 2. Classi di memorizzazione • Stiamo per vedere la classificazione di un oggetto in funzione del suo tempo di vita • In funzione del proprio tempo di vita un oggetto appartiene ad una delle seguenti classi di memorizzazione: 1) Automatica 2) Statica 3) Dinamica Programmazione I - Paolo Valente, 2008/2009 2
  • 3. Oggetti automatici • Oggetti definiti nei blocchi e parametri formali • Creati al raggiungimento della loro definizione durante l'esecuzione del programma, distrutti al termine dell'esecuzione del blocco in cui sono definiti • Se non inizializzati hanno valori casuali – Dimenticare di inizializzarli è una classica fonte di errori Programmazione I - Paolo Valente, 2008/2009 3
  • 4. Oggetti statici • Oggetti globali (definiti al di fuori di ogni funzione) o definiti nelle funzioni utilizzando la parola chiave static (di quest'ultima non vedremo i dettagli) • Creati all'inizio dell'esecuzione del programma, distrutti al termine dell'esecuzione del programma • Se non inizializzati hanno valore zero Programmazione I - Paolo Valente, 2008/2009 4
  • 5. Oggetti dinamici • Allocati nella memoria libera • Esistono dal momento dell'allocazione fino alla deallocazione (o al più fino alla fine dell'esecuzione programma) • Se non inizializzati hanno valori casuali – Come per gli oggetti automatici, dimenticare di inizializzarli è una classica fonte di errori Programmazione I - Paolo Valente, 2008/2009 5
  • 6. I tre elementi fondamentali per comprendere le funzioni • Definizione/Dichiarazione della funzione • Uso della funzione (chiamata) • Esecuzione della funzione (record di attivazione) Programmazione I - Paolo Valente, 2008/2009 6
  • 7. Istruzioni e memoria • Così come gli oggetti, anche le istruzioni (in linguaggio macchina) stanno in memoria • Sono eseguite nell'ordine in cui compaiono in memoria – con l'eccezione delle istruzioni di salto che possono far continuare l'esecuzione da una istruzione diversa da quella che le segue • Definiamo indirizzo di una funzione l'indirizzo in cui è memorizzata la prima istruzione della funzione Programmazione I - Paolo Valente, 2008/2009 7
  • 8. Esecuzione funzioni • Prima dell'inizio dell'esecuzione di una funzione, viene creato in memoria il corrispondente record di attivazione – Struttura dati contenente fondamentalmente gli oggetti locali alla funzione (variabili/costanti con nome locali nonché parametri formali) – Tipicamente memorizzata in una zona contigua di memoria • I record di attivazione sono a loro volta memorizzati in una zona della memoria del processo chiamata stack (pila) Programmazione I - Paolo Valente, 2008/2009 8
  • 9. Record di attivazione Un record di attivazione rappresenta l’ambiente della funzione, e contiene: Parametri formali, Parametro formale 1 inizializzati con i Parametro formale 2 parametri attuali ... Variabili (costanti) Parametro formale M locali Variabile/costante locale 1 Indirizzo del record di Variabile/costante locale 2 attivazione del chiamante, per ... ripristinarne l'ambiente alla fine Variabile/costante locale N dell'esecuzione della funzione Collegamento dinamico Indirizzo dell'istruzione del Indirizzo di ritorno chiamante a cui tornare alla fine dell'esecuzione Programmazione I - Paolo Valente, 2008/2009 9
  • 10. Record di attivazione (cont.) • Quando la funzione termina, il controllo torna al chiamante, che deve: – riprendere la sua esecuzione dall'istruzione successiva alla chiamata della funzione – trovare tutti suoi dati inalterati • E' questo il motivo per cui, quando il chiamante chiama la funzione, prima di tutto si inseriscono nel record di attivazione della funzione: – indirizzo di ritorno, ossia l’indirizzo della prossima istruzione del chiamante che andrà eseguita quando la funzione terminerà – collegamento dinamico, ossia un collegamento al record di attivazione del chiamante, in modo da poter ripristinare l’ambiente del chiamante quando la funzione terminerà • La sequenza dei collegamenti dinamici costituisce la cosiddetta catena dinamica, che rappresenta la storia delle attivazioni (“chi ha chiamato chi”) Programmazione I - Paolo Valente, 2008/2009 10
  • 11. Record di attivazione (cont.) • La dimensione del record di attivazione: – varia da una funzione all’altra – ma, per una data funzione, è fissa e calcolabile a priori • Il record di attivazione: – viene creato dinamicamente nel momento in cui la funzione viene chiamata – rimane sullo stack per tutto il tempo in cui la funzione è in esecuzione – viene deallocato alla fine quando la funzione termina • Funzioni che chiamano altre funzioni danno luogo a una sequenza di record di attivazione – allocati secondo l’ordine delle chiamate – de-allocati in ordine inverso → i record di attivazione sono innestati Programmazione I - Paolo Valente, 2008/2009 11
  • 12. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } main() { P(); } STACK ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 12
  • 13. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } main() { P(); } STACK main() ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 13
  • 14. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } main() { P(); } STACK P() main() ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 14
  • 15. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } Q() main() { P(); } STACK P() main() ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 15
  • 16. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } R() void P() { int a=10; Q(a); } Q() main() { P(); } STACK P() main() ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 16
  • 17. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } Q() main() { P(); } STACK P() main() ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 17
  • 18. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } main() { P(); } STACK P() main() ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 18
  • 19. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } main() { P(); } STACK main() ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 19
  • 20. Esempio int x = 4; ... void R(int A) { x = A; } void Q(int x) { R(x); } void P() { int a=10; Q(a); } main() { P(); } STACK ... Sequenza di attivazioni ( Sist. Oper. → ) main → P → Q → R Programmazione I - Paolo Valente, 2008/2009 20
  • 21. Uso dello Stack (Pila) • Si ricorda che nel linguaggio C/C++ tutto si basa su funzioni (anche il main() è una funzione) • Per catturare la semantica delle chiamate annidate (una funzione che chiama un’altra funzione, che ne chiama un’altra ...), è necessario gestire l’area di memoria che contiene i record di attivazione relative alle varie chiamate di funzioni come una pila (stack): Last In, First Out → LIFO (L’ultimo record ad entrare è il primo a uscire) Programmazione I - Paolo Valente, 2008/2009 21
  • 22. Esecuzione fattoriale • Programma che calcola il fattoriale di un valore naturale N Nota: n viene inizializzato con il VALORE di x. n viene modificato, mentre x rimane inalterato int fattoriale(int n) dopo l’esecuzione della funzione fattoriale() { int p=1; record di 3 21 n while (n>1) attivazione di { p=p*n; n-- } fattoriale() 1 3 6 p return p; ritorno main Colle. main } record di main() x 3 attivazione di { int x=3, y; main() casuale y STACK y=fattoriale(x); ritorno S.O. - cout<<y<<endl; } La figura illustra la situazione nello stack nel momento di massima espansione, quando la funzione sta per terminare. Quando la funzione fattoriale() termina, il suo record viene deallocato e il risultato viene trasferito (tramite un registro della CPU) nella cella di nome y Programmazione I - Paolo Valente, 2008/2009 22
  • 23. Memorizzazione valore di ritorno • Spesso prima di chiamare una funzione si aggiunge un ulteriore elemento nel record di attivazione del chiamante, destinato a contenere il valore di ritorno della funzione che si sta per chiamare • Tale risultato viene copiato dal chiamante (ovviamente) all'interno di tale elemento prima di distruggere il record della funzione appena terminata • Altre volte, il risultato viene restituito dalla funzione al chiamante semplicemente lasciandolo in un registro della CPU Programmazione I - Paolo Valente, 2008/2009 23
  • 24. Prologo ed epilogo • Il codice che crea il record di attivazione di una funzione prima di saltare all'indirizzo della (prima istruzione) della funzione si chiama tipicamente prologo • Il codice che immette il valore di ritorno di una funzione nel record di attivazione del chiamante o in un registro di memoria, e poi dealloca il record di attivazione della funzione stessa si chiama tipicamente epilogo • Dato un programma in C/C++, sia il prologo che l'epilogo sono inseriti automaticamente dal compilatore nel file oggetto Programmazione I - Paolo Valente, 2008/2009 24
  • 25. Uno sguardo verso il basso … • La macchina virtuale del linguaggio C/C++ fa vedere al programmatore la memoria come un contenitore di celle in cui si creano automaticamente le variabili con classe di memorizzazione statica e automatica (queste ultime si distruggono anche automaticamente), ed in cui si possono allocare dinamicamente oggetti • Per ottenere queste funzionalità il compilatore inserisce nel programma eseguibile del codice aggiuntivo – Prologo ed epilogo per le gestione dei record di attivazione – Chiamate a funzioni del sistema operativo per gestire la memoria dinamica • Non entriamo nei dettagli di questo codice, ma vediamo solo la struttura tipica dello spazio di indirizzamento di un processo Programmazione I - Paolo Valente, 2008/2009 25
  • 26. Spazio di indirizzamento • Lo spazio di indirizzamento di un processo è l'insieme di locazioni di memoria accessibili dal processo Testo, ossia istruzioni Costanti Oggetti statici inizializzati Automaticamente messi a 0, per questioni di Oggetti statici non inizializzati sicurezza e ripetibilità Memoria dinamica • Direzioni di crescita: – lo stack cresce man Spazio libero mano che si annidano chiamate di funzione – la memoria dinamica Stack cresce man mano che vengono allocati oggetti Programmazione I - Paolo Valente, 2008/2009 26
  • 27. Valore oggetti statici • Gli oggetti statici non inizializzati sono inizializzati a zero – per questioni di sicurezza, perché altrimenti lanciando un nuovo programma potremmo usarli per leggere il precedente contenuto di locazioni di memoria della macchina – per rendere più deterministico e ripetibile il comportamento dei programmi • Ora abbiamo una spiegazione operativa del fatto che gli oggetti statici sono automaticamente inizializzati a 0 Programmazione I - Paolo Valente, 2008/2009 27
  • 28. Valore oggetti automatici e dinamici • Memoria dinamica e stack possono crescere finché lo spazio libero non si esaurisce – sia quando un record di attivazione è rimosso che quando un oggetto dinamico è deallocato, le locazioni di memoria precedentemente occupate non sono settate a 0 sono invece lasciate inalterate per efficienza o – ora abbiamo una spiegazione del fatto che gli oggetti dinamici ed automatici hanno valori casuali il valore di un oggetto automatico/dinamico allocato in o una certa zona di memoria dipende dai valori precedentemente memorizzati in quella zona di memoria cambia quindi a seconda di quello che è successo o prima che l'oggetto in questione venisse allocato Programmazione I - Paolo Valente, 2008/2009 28