linguaggi/s02/20260214.md
... ...
@@ -0,0 +1,277 @@
1
+# Gestione della memoria (da slide 7)
2
+
3
+Allocazione dinamica (pila)
4
+
5
+con la ricorsione l'allocazione statica non basta (a runtime possono esistere piu istanze della stessa variabile locale di una procedura)
6
+ogni istanza di un sottoprogramma a run time ha una porzione di memoria detta **record di attivazione** (o frame) contenente le informazioni relative alla specifica istanza (indirizzo di ritorno)
7
+Analogalmente ogni blocco ha un suo record di attivazione (piu semplice)
8
+La pila (lifo) e' la struttura e' la struttura dati naturale per gestire i recordd did attivazione perche le chiamate di procedura ed i blocchi sono annidati uno dentro laltro
9
+
10
+La pila puo essere usata anche in un linguaggio senza ricorsione
11
+
12
+Record di attivazione per blocchi anonimi
13
+
14
+![20260214_2026-02-24_13-33-52](assets/imgs/20260214_2026-02-24_13-33-52.png)
15
+
16
+Allocazione dinamica con pila
17
+
18
+La gestione della pila e' compiuta mediante:
19
+
20
+- sequenza di chiamata (codice eseguito dal chiamante immediatamente prima della chiamata)
21
+- prologo (codice eseguito all'inizio del blocco)
22
+- epilogo (codice eseguito alla fine del blocco)
23
+- sequenza di ritorno (codice eseguito dal chiamante immediatamente dopo la chiamata)
24
+
25
+Indirizzo di un RdA non e' noto a compile-time
26
+Il puntatore RdA o SP punta al RdA del blocco attiva
27
+Le info contenute in un RdA sono accessibili per offset rispetto allo SP (indirizzo-info = contenuto(SP)+offset)
28
+offset determinabile staticamente dal compilatore
29
+Somma SP+offset eseguita con unica istruzione macchina load o store
30
+
31
+Record di attivazione per blocchi in-line
32
+Link dinamico (o control link) puntatore al precedente record sullo stack
33
+ingresso nel blocco: push (link dinamico del nuovo Rda := SP – SP aggiornato a nuovo RdA)
34
+Uscita dal blocco: Pop
35
+– Elimina RdA puntato da SP
36
+– SP := link dinamico del Rda tolto dallo stack
37
+![20260214_2026-02-24_13-45-16](assets/imgs/20260214_2026-02-24_13-45-16.png)
38
+
39
+In realtà…
40
+• In molti linguaggi non c’è manipolazione
41
+della pila per i blocchi anonimi !
42
+• Tutte le dichiarazioni dei blocchi annidati
43
+sono raccolte dal compilatore
44
+• Allocazione di spazio per tutte
45
+• Potenziale spreco di memoria, ma…
46
+• Nessuna perdita di efficienza per la
47
+gestione della pila
48
+
49
+Record di attivazione per procedure
50
+![20260214_2026-02-24_13-46-08](assets/imgs/20260214_2026-02-24_13-46-08.png)
51
+
52
+Gestione della pila:
53
+![20260214_2026-02-24_13-46-37](assets/imgs/20260214_2026-02-24_13-46-37.png)
54
+
55
+Esempio
56
+![20260214_2026-02-24_13-47-19](assets/imgs/20260214_2026-02-24_13-47-19.png)
57
+
58
+![20260214_2026-02-24_13-47-58](assets/imgs/20260214_2026-02-24_13-47-58.png)
59
+
60
+non e' possibile determinare prima il numero massimo di record di attivazione
61
+Se la chiamata ricorsiva e' lultima cosa che viene fatta es. else return fact(n-1) non devo generare un nuovo record di attivazione. Si chiama ricorsione in coda. Posso usare un solo record did attivazione per la ricorsione in coda. e'possibilie trasformare una chiamata ricorsiva in una ricorsiva con ricorsione in coda (spesso aggiungendo un paramentro accumulatore che salvi il risultato)
62
+La complessita in termini di spazio e' lineare con n (fib e' esponenziale)
63
+
64
+Gestione pila: ingresso in blocco
65
+
66
+- modifica contatore programma
67
+- allocazione RdA sulla pila (modifica puntatore a top (visto che e' una pila il top e' lultimo elemento))
68
+- modifica del putatore al TdA
69
+- passaggio dei parametri
70
+- salvataggio dei registri
71
+- eventuali inizializzazioni
72
+- trasferimento del controllo
73
+
74
+Gestione della pila: uscita da blocco
75
+• Sequenza di uscita ed epilogo si dividono i seguenti compiti:
76
+– Restituzione dei valori dal chiamato al chiamante, oppure il
77
+valore calcolato dalla funzione
78
+– Ripristino dei registri
79
+• In particolare deve essere ripristinato il vecchio valore del
80
+puntatore al RdA.
81
+– Eventuale finalizzazione
82
+– Deallocazione dello spazio sulla pila
83
+– Ripristino del valore del contatore programma
84
+
85
+Allocazione dinamica con heap
86
+
87
+Heap: regione di memoria i cui sotto blocchi possono essere allocati e deallocati in momenti arbitrari
88
+Necessario quando il linguaggio permette allocazione esplicita di memoria a run time (puntatotri e strutture dati dinamiche tipo alberi e liste)
89
+Oggetti di dimensione variabili (stringhe, insiemi)
90
+Oggetti la cui vita non ha un regime definito a priori (cioe' con vita non lifo)
91
+La gestione dell heap non e'banale (gestione efficiente dello spazio: frammentazione e Velocita' di accesso)
92
+
93
+Heap: blocchi di dimensione fissa
94
+Heap suddiviso in blocchi di dimensione fissa (e abbastanza limitata: qualche parola)
95
+In origine: tutti i blocchi collegati nella lista libera
96
+![20260214_2026-02-24_14-15-17](assets/imgs/20260214_2026-02-24_14-15-17.png)
97
+
98
+Heap: blocchi di dimensione fissa
99
+• Allocazione di uno o più blocchi contigui
100
+• Deallocazione: restituzione alla lista liber
101
+
102
+Problema: frammentazione della memoria
103
+
104
+Heap: blocchi di dimensione variabile
105
+Inizialmente unico blocco nello heap
106
+Allocazione: determinazione di un blocco libero della dimensione opportuna
107
+Deallocazione: restituzione alla lista libera
108
+
109
+Problemi:
110
+
111
+- le operazioni devono essere efficienti
112
+- evitare lo spreco di memoria (frammentazione interma e esterna)
113
+
114
+Frammentazione
115
+Interna: lo spazio richiesto e' x: - viene allocato un blocco di dimensione y dove y>x - spreco dello spazio
116
+Esterna:
117
+
118
+- ci sarebbe lo spazio necessario ma e' inusabile perche diviso in pezzi troppo piccoli
119
+ La memoria deve essere contigua (per accedere in modo efficiente ad un array lo si fa tramite offset)
120
+
121
+![20260214_2026-02-24_14-21-17](assets/imgs/20260214_2026-02-24_14-21-17.png)
122
+Cosa posso fare? Spostare tutti gli indirizzi e ricompattare il tutto? molto costoso
123
+
124
+Gestione della lista libera: unica lista
125
+Inizialmente contiene un solo blocco, della dimensione dello heap
126
+Ad ogni richiesta di allocazione:cerca blocco di dimensione opportuna, due modi di ricerca
127
+
128
+- first fit: primo blocco grande abbastanza (molto veloce)
129
+- best fit: quello di dimensione più piccola, grande abbastanza (molto efficiente)
130
+
131
+Se il blocco scelto è molto più grande di quello che serve, viene diviso in due e la parte inutilizzata è aggiunta alla LL
132
+• Quando un blocco è de-allocato, viene restitutito alla LL (se un blocco adiacente è libero, i due blocchi sono ``fusi’’ in un unico blocco).
133
+
134
+Liste libere multiple
135
+Per blocchi di dimensione diversa (la ripartizione dei blocchi fra le varie liste puo essere statica o dinamica (buddy system o fibonacci system))
136
+Buddy system: k liste; la lista k ha blocchi di dimensione $2^k$
137
+
138
+- se richiesta allocazione per blocco di $2^k$ è tale dimensione non è disponibile, blocco di 2k+1 diviso in 2
139
+- se un blocco di 2k e’ de-allocato è riunito alla sua altra metà (buddy), se disponibile
140
+
141
+Fibonacci simile, ma si usano numeri di Fibonacci invece di potenze di 2 (crescono più lentamente)
142
+
143
+Implementazione delle regole di scope
144
+• Scope statico
145
+– catena statica
146
+– display
147
+• Scope dinamico
148
+– A-list
149
+– Tabella centrale dell’ambiente (CRT)
150
+
151
+Come si determina il legame corretto?
152
+
153
+```
154
+{int x=10;
155
+void foo () {
156
+x++;
157
+}
158
+void fie (){
159
+int x=0;
160
+foo();
161
+}
162
+fie();
163
+foo();
164
+}
165
+```
166
+
167
+Il codice di foo deve accedere sempre alla stessa
168
+variabile x
169
+• Tale x è memorizzato in un certo RdA (in questo caso in
170
+quello del main)
171
+• In cima alla pila abbiamo il RdA di foo (perché foo è in
172
+esecuzione)
173
+
174
+- Determina prima il corretto RdA dove trovare x
175
+ •Accedi a x tramite offset relativo a tale RdA (e non relativo a SP)
176
+ ![20260214_2026-02-24_14-50-43](assets/imgs/20260214_2026-02-24_14-50-43.png)
177
+
178
+Record di attivazione per scoping statico
179
+![20260214_2026-02-24_14-52-46](assets/imgs/20260214_2026-02-24_14-52-46.png)
180
+Link dinamico:
181
+– puntatore all’RdA precedente sulla pila (RdA del chiamante)
182
+• Link statico:
183
+– puntatore all’RdA del blocco che contiene immediatamente il testo del blocco in esecuzione
184
+• Osserva:
185
+– link dinamico dipende dalla sequenza di esecuzione del programma
186
+– link statico dipende dall’annidamento statico (nel testo) delle dichiarazioni delle procedure
187
+
188
+Catena Statica: esempio
189
+Sequenza di chiamate a run time A, B, C, D, E, C
190
+![20260214_2026-02-24_14-55-43](assets/imgs/20260214_2026-02-24_14-55-43.png)
191
+le linee tratteggiate sono link statici
192
+
193
+![20260214_2026-02-24_14-56-18](assets/imgs/20260214_2026-02-24_14-56-18.png)
194
+Se un sottoprogramma è annidato a livello k, allora la catena è lunga k
195
+
196
+se sono in e e sto cercando una var x non locale allora vado in c e poi vado in a
197
+questo grazie ai link statici (questi puntatori sono determinati a runtime)
198
+Esempio
199
+
200
+```
201
+{int x;
202
+void A(){
203
+ x=x+1;}
204
+void B(){
205
+ int x;
206
+ void C (int y){
207
+ int x;
208
+ x=y+2; A();
209
+ }
210
+ x=0; A(); C(3);
211
+}
212
+x=10;
213
+B();
214
+}
215
+```
216
+
217
+Struttura main con dentro a e b e b con dentro c
218
+
219
+![20260214_2026-02-24_15-05-26](assets/imgs/20260214_2026-02-24_15-05-26.png)
220
+la x che viene modificata e' sempre quella del main visto che viene modificata da A e il puntatore di catena statica di A punta al main. Le altre x non vengono modificate da A.
221
+C modifica la propria x (visto che la dichiara ed e'quindi locale)
222
+
223
+il compilatore dice di risalire di 1 il record di attivazione. A lo fa e trova a x del main (con un offset)
224
+
225
+se in C avessi la variabile pippo chee e' definita nel main il compilatore mi direbbe che pippo e' definito in main (2 livelli sopra) e quindi quando devo manipolarla o chiamarla salgo due livelli e ne uso il valore
226
+
227
+Il compilatore sa dove sono dichiarate le variabili ma non sa la loro posizione a runtime (quindi ci dice solo quanto andare in su ma il dove va deciso a runtime grazie alla catena statica)
228
+
229
+Dal punto di vista del supporto a run time
230
+Come viene determinato il link statico del chiamato?
231
+
232
+es sopra
233
+sono nel main, chiamo B devo inizializzre il puntatore di catena statica di B, so che B e' inizializzato dentro al main quindi inizializzo il suo puntatore al main (me)
234
+Ora B chiama A, come posso inizializzare il suo puntatore? B sa che A e' allo stesso livello di annidamento di A e quindi gli basta risalire di (0) livelli e passare il puntatore a A.
235
+In generale o X e' inizializzato dentro a A (e quindi il suo indirizzo e' A) oppure Si calcola livello di annidamento di A - X e si risalgono i A-X livelli e si assegna l'indirizzo a X
236
+
237
+e'il chiamante a determinare il link statico del chiamato
238
+Info a disposizione del chiamante:
239
+
240
+- annidamento statico dei blocchi (determinata dal compilatore)
241
+- proprio RdA
242
+
243
+Come determinare il puntatore di Catena statica (CS)
244
+il chiamante Ch conosce l'annidamento dei blocchi:
245
+
246
+- quando Ch chiama P sa se la definizione di P e':
247
+ - immediatamente inclusain Ch (k=0)
248
+ - in un blocco k passi fuori da Ch
249
+
250
+– nessun altro caso possibile:
251
+• perché P deve essere in scope!
252
+– nel caso a destra:
253
+• chiamate: A, B, C, D, E, C
254
+– con i dati di catena statica:
255
+• A; (B,0); (C,1); (D,0); (E,1); (C,2)
256
+
257
+Se k=0:
258
+– Ch passa a P il proprio SP
259
+•Se k>0:
260
+– Ch risale la propria catena statica di k passi e passa il puntatore così determinato
261
+![20260214_2026-02-24_15-32-13](assets/imgs/20260214_2026-02-24_15-32-13.png)
262
+
263
+> Nota: Se B chiamasse D non potrebbe farlo perche' non lo puo' vedere.
264
+
265
+Ripartizione dei compiti
266
+Compilatore:
267
+
268
+- associa l'informazione k ad ogni chiamata
269
+- associa ad ogni nome un indice h:
270
+ - h=0: nome locale
271
+ - h diverso da 0: nome non locale definito h blocchi sopra
272
+- sequenza chiamata/prologo
273
+ - risale la catena statica
274
+ - inizializza il puntatore di catena statica
275
+- Costi:
276
+ - per ogni chiamata: k passi di catena statica
277
+ - ad ogni accesso ad una variabile non locale:(h passi di catena statica in piu rispetto all'accesso ad un locale)
linguaggi/s02/assets/imgs/20260214_2026-02-24_13-33-52.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_13-33-52.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_13-45-16.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_13-45-16.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_13-46-08.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_13-46-08.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_13-46-37.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_13-46-37.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_13-47-19.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_13-47-19.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_13-47-58.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_13-47-58.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_14-15-17.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_14-15-17.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_14-21-17.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_14-21-17.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_14-50-43.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_14-50-43.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_14-52-46.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_14-52-46.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_14-55-43.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_14-55-43.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_14-56-18.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_14-56-18.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_15-05-26.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_15-05-26.png differ
linguaggi/s02/assets/imgs/20260214_2026-02-24_15-32-13.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260214_2026-02-24_15-32-13.png differ