


Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
sintesi dell'allocazione in memoria
Tipologia: Slide
1 / 4
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!



La memoria allocata ad un processo è divisa in varie sezioni: text section comprende il codice del programma compilato, che viene letto quando il programma è lanciato; è a sola lettura. data section memorizza le variabili globali e statiche, allocate e inizializzate prima dell’esecuzione del main; heap è utilizzata per l’allocazione dinamica della memoria, ed è gestita attraverso chiamate come malloc(), free(), etc. stack è gestita come una pila (last-in-first-out), usata per le variabili locali: viene liberato quando diventano out-of-scope (variabili automatiche) e per i parametri formali ed i valori di ritorno delle funzioni: viene liberato quando si ritorna dall'invocazione.
Stack ed heap partono da locazioni opposte dello spazio disponibile per il processo, e crescono in direzioni opposte Nel caso di sovrapposizioni, si verifica uno stack overflow (se fallisce un'allocazione statica/automatica) oppure una chiamata a malloc può fallire per memoria insufficiente - out of memory NOTA: ci sono molte varianti di comportamento di sistemi operativi, per es. linux fa optimistic allocation con OOM-killer Lo stack è gestito tramite i registri della CPU (rapido!) con politica LIFO (no buchi). Lo heap è gestito tramite funzioni di libreria, che invocano chiamate di sistema: è il sistema operativo a gestire la memoria; lo spazio è soggetto a frammentazione (potenziale spreco di memoria, lento) allocazione della memoria variabili I compilatori C considerano 3 diversi tipi di allocazione della memoria: 2 per le variabili (allocazione statica, automatica), ed 1 tramite puntatori (allocazione dinamica). Per le variabili si parla di storage class che può essere static o automatic
L'allocazione statica avviene quando si dichiara una variabile globale o statica (static). Ogni variabile statica o globale individua un blocco di memoria di dimensioni fisse. Lo spazio viene allocato quando il programma viene avviato e non viene mai deallocato, fino a fine del programma. L'allocazione automatica avviene quando si dichiara una variabile automatica, che è un parametro di funzione o una variabile locale. Lo spazio per una variabile automatica viene allocato quando si entra nel blocco di codice contenente la dichiarazione e viene deallocato quando si esce da quel blocco di codice. (ricordiamo: un blocco di codice è individuato dalle parentesi graffe {...} ) In alcuni compilatori (es. GNU C) variabili con storage automatico possono avere come dimensione una variabile (Variable Length Arrays); In altre implementazioni di C, deve essere un valore letterale. Allocazione memoria dinamica L'allocazione dinamica della memoria è una tecnica in cui i programmi decidono, durante l'esecuzione, dove memorizzare alcune informazioni. L'allocazione dinamica è necessaria quando la quantità di memoria richiesta, o la durata per cui occorre, dipendono da fattori non noti prima dell'esecuzione del programma. L'allocazione dinamica non è supportata dalle variabili C; non esiste una classe di storage "dinamica", e non può esistere una variabile C il cui valore sia memorizzato in uno spazio allocato dinamicamente. L'unico modo per fare riferimento a uno spazio di memoria allocato dinamicamente è tramite un puntatore. Attenzione: un puntatore è una variabile, con la sua storage class, e suo scope (e quindi sua durata nell'esecuzione del programma). La possibilità di accedere (e liberare) la memoria allocata dinamicamente dipende dall'esistenza e visibilità di un puntatore che vi fa riferimento. Gestione della memoria dinamica Con i puntatori, ed utilizzando funzioni della libreria standard, è possibile allocare dinamicamente la memoria: L'allocazione dinamica va effettuata esplicitamente. Bisogna invocare una funzione o una macro per allocare spazio, specificando la dimensione tramite un argomento. Per liberare lo spazio (deallocazione), si invoca un'altra funzione o macro usando il puntatore. dimenticare di deallocare la memoria che non serve più può portare a memory leak (esaurimento graduale della memoria, con conseguente crash dei programma)