La gestione della memoria dinamica Heap

Documenti analoghi
Laboratorio di Algoritmi e Strutture Dati. La gestione della memoria dinamica Heap

Gestione dinamica della memoria

Allocazione dinamica della memoria

La gestione della memoria

Uso avanzato dei puntatori Allocazione dinamica della memoria

Il linguaggio C. Puntatori e dintorni

Strutture Dati Dinamiche

Introduzione al C. Unità Gestione Dinamica della Memoria

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Puntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Allocazione dinamica della memoria

L Allocazione Dinamica della Memoria

Allocazione Dinamica della Memoria

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

I puntatori e l allocazione dinamica di memoria

Struct, enum, Puntatori e Array dinamici

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Allocazione della memoria. Allocazione dinamica della memoria. Allocazione della memoria. Allocazione automatica

Il linguaggio C. Puntatori e dintorni

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Programmazione I - Laboratorio

Perché il linguaggio C?

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Implementazione di Liste puntate

L'allocazione dinamica della memoria

Processi - II. Franco Maria Nardini

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Allocazione dinamica della memoria - riepilogo

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Introduzione al linguaggio C Puntatori

Ottenere una modifica del parametro attuale

Allocazione dinamica. VLA, malloc() e dintorni

Introduzione ai puntatori in C Definizione

Il linguaggio C. Puntatori e Array

Linguaggio C: PUNTATORI

Prof.Ing.S.Cavalieri Puntatori e Heap in Linguaggio C. Puntatori e Heap

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

System call per la gestione di processi

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Stringhe e allocazione dinamica della memoria

Architettura dei calcolatori e sistemi operativi. M2 Organizzazione della memoria virtuale Struttura dello spazio virtuale kernel e utente

Parametri Formali di una Funzione e Record di Attivazione

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

I Processi nel Sistema Operativo Unix. Gerarchie di processi Unix. Stati di un processo Unix. Stati di un processo Unix.

Fondamenti di Informatica T. Linguaggio C: i puntatori

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Allocazione Dinamica della Memoria

IL PRIMO PROGRAMMA IN C

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Strutture Dinamiche. Fondamenti di Informatica

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Il linguaggio C Strutture

Puntatori in C Lucidi della Pof.ssa Pazienza

Il linguaggio C. Notate che...

Il puntatore. Il puntatore

Linguaggio C: puntatori

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Puntatori. Fondamenti di Programmazione

INTERPROCESS COMMUNICATION 27

Consideriamo un vettore allocato dinamicamente

Programmazione (imperativa)

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Introduzione al C. Tipi derivati

Funzioni, Stack e Visibilità delle Variabili in C

Passaggio parametri puntatore

Tempo di vita e scope delle variabili

Lezione 8 Struct e qsort

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

Esercizi di programmazione in linguaggio C English Dictionary

Linguaggio C - sezione dichiarativa: costanti e variabili

Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Il linguaggio C Puntatori

Programmazione I - Laboratorio

Esonero di Informatica I. Ingegneria Medica

Linguaggio C I puntatori

Esercizi Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2) Fondamenti di Informatica.

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Operatore di indirizzo

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Programmazione I - Laboratorio

puntatori Lab. Calc. AA 2007/08 1

Allocazione dinamica

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Il C nel C++: Funzioni

Fondamenti di Informatica II

Array e puntatori in C

Introduzione al C. Ancora puntatori, allocazione dinamica, e tipi derivati

Corso di Fondamenti di Informatica

Transcript:

Laboratorio di Algoritmi e Strutture Dati La gestione della memoria dinamica Heap Prof. Luigi Lamberti 2005 Cenni sui Processi Un Programma è un insieme di Istruzioni memorizzato in un file con le costanti del problema. Quando il Sistema Operativo porta in esecuzione un programma: 1. Legge l intestazione del file con le richieste del programma. 2. Alloca in memoria spazio sufficiente per collocare: a. il codice eseguibile del programma b. le costanti, le variabili globali e le variabili dichiarate static; c. uno Stack per le variabili locali, per il passaggio di parametri alle sub, e per gli indirizzi di ritorno dalle stesse; d. una zona di memoria dinamica Heap. 3. Riserva tutte le altre eventuali risorse. 4. Inizia l esecuzione. Un Programma in stato di esecuzione è un Task o Processo. Al termine del Processo tutte le risorse occupate vengono rilasciate. 1

Allineamento dei dati Secondo il Microprocessore e il S.O. utilizzato, l accesso ottimale alla memoria avviene a gruppi di 2, 4, 8, 16 byte. Le variabili devono essere dichiarate in modo da allinearsi agli indirizzi multipli 2, 4, 8, 16 byte. Ad esempio, se l accesso ottimale è a 4 byte, la dichiarazione char a, b, s[31]; andrebbe sostituita con char a, b, a1, b1, s[32]; Alcuni compilatori possono ottimizzare per spazio o per velocità: nel secondo caso allineano automaticamente i dati inserendo spazi vuoti. Memoria Heap Un Heap è un lotto di memoria assegnato ad un processo, per i dati, la cui esistenza o dimensione non è conosciuta a priori. Quando sono richiesti blocchi di memoria, un processo 1. richiama una funzione per allocare memoria nell heap 2. utilizza lo spazio ottenuto 3. libera la memoria con un altra funzione. Se necessario, il processo può chiedere heap aggiuntivi al S.O. Il S.O. gestisce la memoria in paragrafi minimi (16, 32 o 64 byte); ogni richiesta viene arrotondata al multiplo successivo del paragrafo, oltre un paragrafo per informazioni accessorie. L uso continuo di allocazione e rilascio di memoria causa un frazionamento dello spazio disponibile con conseguente peggioramento delle prestazioni. Valutare costi e benefici della gestione Heap, sostituendola, se è il caso, con un assegnazione iniziale di tutto lo spazio necessario, o con la creazione dinamica di spazio sullo Stack. 2

Memoria Heap in #include <malloc.h> void *malloc ( size_t Size ); void *calloc ( size_t Numero, size_t Size ); void *realloc (void *BlockAddress, size_t NewSize ); void free ( void *BlockAddress ); void *malloc ( size_t Size ); Alloca Size byte di memoria, e restituisce : un puntatore void sullo spazio allocato correttamente; NULL se la memoria disponibile è insufficiente. Per assegnare lo spazio a tipi diversi da void, usare un operatore cast sul valore restituito. Occorre sempre controllare il valore restituito da malloc, anche se la memoria richiesta è piccola. Il blocco di memoria occupato può essere più grande di Size (allineamento dati e informazioni accessorie). 3

#include <stdio.h> #include <malloc.h> Esempio void main( void ) { char *Buffer; Buffer = (char *) malloc ( 200 ); if ( Buffer == NULL ) { printf( "Memoria insufficiente\n" ); else { printf( "Spazio allocato\n" ); gets ( Buffer ); printf( %s\n, Buffer ); free( Buffer ); printf( "Memoria liberata\n" ); void *calloc (size_t Numero, size_t Size ); Alloca memoria Heap per un array di Numero elementi, ciascuno di dimensioni Size byte, e restituisce: un puntatore void sullo spazio allocato correttamente; NULL se la memoria disponibile è insufficiente. Per assegnare lo spazio a tipi diversi da void, usare un operatore cast sul valore restituito. Ogni elemento è inizializzato a zero. Controllare sempre il valore restituit da calloc, anche se la memoria richiesta è piccola. 4

Esempio #include <stdio.h> #include <malloc.h> void main( void ) { long *Buffer; Buffer = (long *) calloc ( 40, sizeof(long) ); if (Buffer == NULL ) { printf ( "Memoria insufficiente\n" ); else { printf ( "Disponibili 40 longint\n" );...... free ( Buffer ); void *realloc (void *BlockAddress, size_t NewSize ); Ridimensiona un blocco Heap già allocato, portandolo a NewSize byte; restituisce un puntatore void al blocco di memoria riallocato ed eventualmente spostato. Il contenuto del blocco non è modificato per un numero di byte pari alla minore tra vecchia e nuova dimensione. Se BlockAddress è NULL e NewSize èdiverso da zero, realloc è equivalente a malloc. Se non c è abbastanza memoria disponibile per espandere il blocco alla dimensione richiesta, realloc restituisce NULL e il blocco non è modificato. Se BlockAddress è un puntatore valido e NewSize è zero, realloc libera il blocco e restituisce NULL. 5

void free ( void *BlockAddress ); Rilascia un blocco di memoria heap, di indirizzo BlockAddress, precedentemente allocato con chiamate a malloc, calloc o realloc. Se BlockAddress è NULL, il puntatore è ignorato e free esegue un immediato return. Tentativi di liberare memoria non allocata da malloc, calloc o realloc, ovvero già liberata, può influire sulle successive allocazioni e causare errori imprevedibili. La funzione free non restituisce alcun valore. ATTENZIONE Rilasciare lo spazio non più necessario per evitare il collasso del processo per mancanza di memoria. Un errore comune è la perdita dell indirizzo del blocco: int x, *Pt; Pt = (int *) malloc ( 200 ); // occupa 50 int.... Pt = &x; // Il puntatore perde il blocco *Pt = 12345;.... free ( Pt ); // errore nel gestore dell Heap 6