Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Σχετικά έγγραφα
Ανάπτυξη και Σχεδίαση Λογισμικού

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

ΗΥ-150. Προγραµµατισµός. υναµική ιαχείριση Μνήµης (1/2)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Διαδικασιακός Προγραμματισμός

ΗΥ-150. Προγραμματισμός

Διάλεξη 11η: Δείκτες, μέρος 1

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης (Κεφάλαιο , KNK-2ED)

Προγραμματισμός Ι (ΗΥ120)

Εισαγωγή στον Προγραμματισμό

Διάλεξη 18η: Διαχείρηση Αρχείων

Διάλεξη 15η: Αναδρομή, μέρος 1ο

ΠΡΟΗΓΜΕΝΟΙ ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΕΣ PROJECT 2: MEMORY MANAGEMENT

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Η γλώσσα C. Δείκτες και Διαχείριση Μνήμης (memory management)

Εισαγωγή στον δομημένο προγραμματισμό

Διάλεξη 9η: Πίνακες (arrays)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

Διάλεξη 8η: Αλφαριθμητικά (strings)

Διαδικασιακός Προγραμματισμός

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Διδάσκων: Παναγιώτης Ανδρέου

ιαφάνειες παρουσίασης #5 (β)

Διαδικαστικός Προγραμματισμός

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραµµατισµός Ι 1

Εισαγωγή στον Προγραμματισμό (με. τη C)

Προγραμματισμός Ι (ΗΥ120)

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Δομημένος Προγραμματισμός (ΤΛ1006)

ΗΥ-150. Προγραμματισμός

Διαδικαστικός Προγραμματισμός

- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα.

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

ΗΥ-150. Προγραμματισμός

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

H ΓΛΩΣΣΑ C. Μάθηµα 12: υναµική έσµευση Μνήµης. ηµήτρης Ψούνης

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δείκτες και Δομές. Info. Link. typedef struct NodeTag { InfoField Info; struct NodeTag *Link; } NodeType;

Διάλεξη 12η: Δείκτες, μέρος 2

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Φροντιστήριο 4 Σκελετοί Λύσεων

Φροντιστήριο 4 Σκελετοί Λύσεων

Οι δείκτες στη γλώσσα C

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Περιεχόμενα. Πρόλογος... 21

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Sheet1_2 FAIL. - To πρόγραµµα δεν κάνει compile Δεν παρέδωσε FAIL

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

HY150a Φροντιστήριο 3 24/11/2017

υναµικές οµές εδοµένων

Sheet1_2. - Δεν απελευθερώνεις τη δυναµικά δεσµευµένη µνήµη. - Η έξοδος του προγράµµατός σου δεν είναι ακριβώς όπως ζητούσε η άσκηση.

Προγραμματισμός Υπολογιστών με C++

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

12. Συναρτήσεις (Μέρος ΙI)

Δομημένος Προγραμματισμός

Η γλώσσα προγραμματισμού C

Προγραµµατισµός Ι (ΗΥ120)

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός II. Δυναμική διαχείριση μνήμης

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Μεθόδων Επίλυσης Προβλημάτων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Μεθόδων Επίλυσης Προβλημάτων

Δείτε τώρα και πώς θα έπρεπε να ήταν το παραπάνω: Page 1

Διάλεξη 5η: Εντολές Επανάληψης

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Δομές Δεδομένων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Γλώσσα Προγραμματισμού C

Στοίβες με Δυναμική Δέσμευση Μνήμης

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

Μεταβλητές. Έστω η μεταβλητή

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Transcript:

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1 Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 1 / 16

Δυναμική Διαχείριση Μνήμης Μέχρι τώρα βλέπουμε στατική ανάθεση και δέσμευση μνήμης Ζητούσαμε τη μέγιστη μνήμη που μπορεί να χρειαζόταν το πρόγραμμα #define MAX_SIZE 10000 int array[max_size]; Μειονέκτημα: Υπάρχουν εφαρμογές όπου το MAX_SIZE είναι άγνωστο Αναγκαζόμαστε να δηλώνουμε μεγάλες τιμές και να χάνουμε σε μνήμη και σε ταχύτητα Δυναμική δέσμευση μνήμης (dynamic memory allocation) Αίτηση στο λειτουργικό σύστημα να παραχωρήσει μνήμη στο πρόγραμμα Ειδοποίηση στο λειτουργικό ότι δεν χρειαζόμαστε πια ένα μέρος μνήμης Ό,τι δεσμεύεται πρέπει να αποδεσμεύεται Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 2 / 16

Κατηγορίες Μνήμης του Προγράμματος Μνήμη όπου αποθηκεύεται ο κώδικας του προγράμματος Μνήμη όπου αποθηκεύονται οι μεταβλητές που δεσμεύονται με στατική (καθολικές) ή αυτόματη (τοπικές) διαχείριση μνήμης Αυτή η μνήμη ονομάζεται στοίβα (stack) Μνήμη όπου αποθκεύονται οι μεταβλητές που δεσμεύονται με δυναμική διαχείριση μνήμης Αυτή η μνήμη ονομάζεται σωρός (heap) Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 3 / 16

Συναρτήσεις Δυναμικής Διαχείρισης Μνήμης Βρίσκονται στη βιβλιοθήκη stdlibh Συναρτήσεις διαχείρησης μνήμης void *malloc(size_t num_bytes); void *calloc(size_t num_elements, size_t elt_size); void *realloc(void *ptr, size_t size); void free(void *ptr); Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 4 / 16

Η συνάρτηση malloc Η συνάρτηση δέσμευσης malloc void *malloc(size_t num_bytes); Δεσμεύει num_bytes αριθμό από διαδοχικά bytes και επιστρέφει ένα δείκτη στην αρχή της δεσμευμένης θέση μνήμης Επιστρέφει NULL αν δεν μπορεί να δεσμεύσει άλλη μνήμη int *x, *y; x = (int *) malloc(sizeof(int)); y = (int *) malloc(100 * sizeof(int)); Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 5 / 16

Η συνάρτηση calloc Η συνάρτηση δέσμευσης calloc void *calloc(size_t num_elements, size_t elt_size); Δεσμεύει num_elements αριθμό από διαδοχικά αντικείμενα το καθένα μεγέθους elt_size και επιστρέφει ένα δείκτη στην αρχή της δεσμευμένης μνήμης Επιστρέφει NULL αν δεν μπορεί να δεσμεύσει άλλη μνήμη Αρχικοποιεί τα περιεχόμενα της δεσμευμένης μνήμης στο 0 Παρόμοια με την malloc Διαφορετική κλήση, παίρνει αριθμό στοιχείων και το μέγεθος ενός στοιχείου Αρχικοποιεί τα περιεχόμενα με 0 int *x, *y; x = (int *) calloc(1, sizeof(int)); y = (int *) calloc(100, sizeof(int)); Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 6 / 16

Η συνάρτηση realloc Η συνάρτηση δέσμευσης realloc void *realloc(void *ptr, size_t size); Επεκτείνει τη δεσμευμένη μνήμη Ο δείκτης ptr πρέπει να δείχνει σε μνήμη ήδη δεσμευμένη με την malloc ή calloc ptr = (int *) malloc (100 * sizeof(int)); ptr = (int *) realloc(ptr, 200 * sizeof(int)); Τα προηγούμενα περιεχόμενα της δεσμευμένης μνήμης διατηρούνται (τουλάχιστον όσα χωρούν στη νέα) Η νέα μνήμη μπορεί να είναι σε άλλη διεύθυνση αν δεν υπήρχε αρκετός συνεχόμενος χώρος σε ελεύθερη μνήμη στο τέλος της υπάρχουσας Σε αυτή την περίπτωση γίνεται μεταφορά των δεδομένων και αποδεσμεύεται η μνήμη ptr σαν να γίνεται free(ptr) Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 7 / 16

Η συνάρτηση free Η συνάρτηση αποδέσμευσης free Αποδεσμεύει τη μνήμη που έχει δεσμευτεί με μία από τις προηγούμενες κλήσεις στην malloc, calloc ή realloc Προσοχή: Δεν μπορούμε να αποδεσμεύσουμε πάνω από μια φορά την ίδια μνήμη ptr = (int *) malloc (100 * sizeof(int)); free(ptr); // OK free(ptr); // error! Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 8 / 16

Ο τύπος void * Γενικός τύπος δείκτη σε μια διεύθυνση μνήμης Ο τύπος του δείκτη δεν έχει πληροφορία για το τί βρίσκεται σε αυτή τη διεύθυνση Σημαίνει δείκτης που δείχνει σε δεδομένα που δεν χρειάζεται να ξέρουμε τι είναι Ο γενικός δείκτης επιτρέπει συναρτήσεις που επιστρέφουν χώρο στη μνήμη χωρίς να προσδιορίζουν τον τύπο των δεδομένων που θα αποθηκευτούν, πχ, malloc Προσοχή: είναι τελείως διαφορετικό από το void void f() η συνάρτηση δεν επιστρέφει τίποτα void *f() η συνάρτηση επιστρέφει μια διεύθυνση μνήμης χωρίς να ξέρουμε τι τύπος δεδομένων περιέχεται εκεί Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 9 / 16

Δυναμικοί Πίνακες Πίνακες με μέγεθος που καθορίζεται κατά την εκτέλεση του προγράμματος Καλύτερη προσαρμογή στις απαιτήσεις του προγράμματος χωρίς περιορισμό Παράδειγμα int *create_array(int elements) { int i, *x = (int *) malloc(elements * sizeof(int)); for(i = 0; i < elements; i++) { x[i] = i; } return x; } Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 10 / 16

Πιθανά Λάθη: Αποτυχία Δέσμευσης Αν δεν υπάρχει αρκετή μνήμη οι συναρτήσεις δέσμευσης επιστρέφουν NULL Κάνετε πάντα έλεγχο για αυτή την περίπτωση Είναι ευθύνη του προγραμματιστή και αρχή σωστού προγραμματισμού Αν αποτύχει η δέσμευση μνήμης μπορούμε να διακόψουμε την εκτέλεση του προγράμματος αν χρειάζεται check-mallocc #include<stdioh> int main(void) { int * x; x = (int *) malloc(1000 * sizeof(int)); if (x == NULL) { printf( Not enough memory\n ); exit(1); } x[0] = 42; } Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 11 / 16

Πιθανά Λάθη: Αποτυχία Δέσμευσης (2) Αντί να ελέγχουμε κάθε φορά, μπορούμε να γράψουμε δική μας malloc check-malloc2c #include<stdioh> void *malloc_or_fail(size_t size) { void *ptr = malloc(size); if (ptr == NULL) { printf( Not enough memory\n ); exit(1); } return ptr; } int main() { int *x; x = (int *) malloc_or_fail(1000 * sizeof(int)); x[0] = 42; } Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 12 / 16

Πιθανά Λάθη: Διαρροή Μνήμης Πρέπει να αποδεσμεύουμε την μνήμη που δεν χρειαζόμαστε πλέον με τη συνάρτηση free Δεν ελευθερώνουμε ποτέ μνήμη που δεν έχει αποκτηθεί δυναμικά Αν το πρόγραμμα δεν ελευθερώσει όλη τη μνήμη που δεσμεύει, έχει διαρροή μνήμης (memory leak) Διαρροή int use_array(void) { int *x = (int *) malloc(10 * sizeof(int)); } Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 13 / 16

Πιθανά Λάθη: Διαρροή Μνήμης Η διαρροή μνήμης μπορεί να εξαντλήσει την ελεύθερη μνήμη Όταν τελειώνει η ελεύθερη μνήμη του υπολογιστή το λειτουργικό αποθηκεύει κομμάτια μνήμης στο δίσκο προσωρινά για να ελευθερώσει χώρο Το λειτουργικό επαναφέρει τα περιεχόμενα από το δίσκο όταν χρειαστούν, πιθανώς αποθηκεύοντας άλλα για να κάνει χώρο Αν γεμίσει η μνήμη θα φτάσει να γράφει και να διαβάζει το δίσκο για κάθε πρόσβαση Αυτό λέγεται thrashing Ακόμη και η διαρροή μερικών bytes μπορεί να προκαλέσει thrashing μετά από ώρες, μέρες ή χρόνια Προσοχή: Αποδεσμεύουμε αμέσως τη μνήμη που δεν χρησιμοποιούμε πλέον με τη συνάρτηση free Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 14 / 16

Πιθανά Λάθη: Χρήση Αποδεσμευμένης Μνήμης Η αποδέσμευση μνήμης την απελευθερώνει για άλλη χρήση Δεν ανήκει πλέον στο πρόγραμμα Η πρόσβαση σε απελευθερωμένη μνήμη ισοδυναμεί με χρήση μη δεσμευμένης μνήμης Segmentation fault Γράφουμε τυχαία σε ό,τι άλλες μεταβλητές τυχαίνει να επαναδεσμεύσουν την ίδια μνήμη (ανιχνεύεται δύσκολα) Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 15 / 16

Πιθανά Λάθη: Αποδέσμευση άλλης μνήμης Η συνάρτηση free αποδεσμεύει μόνο μνήμη που δεσμεύτηκε δυναμικά Δεν μπορούμε να αποδεσμεύσουμε άλλη μνήμη, ακόμη κι αν ανήκει στο πρόγραμμα Τοπικές, καθολικές, στατικές, μεταβλητές, δείκτες σε συναρτήσεις, κλπ Δεν ορίζεται συμπεριφορά της free για διευθύνσεις που δεν δεσμεύτηκαν δυναμικά Ανάλογα με την υλοποίηση, η αποδέσμευση άλλων διευθύνσεων μπορεί να προκαλέσει λάθος στο λειτουργικό σύστημα Πρατικάκης (CSD) Μνήμη I CS100, 2016-2017 16 / 16