Στην πληροφορική, η δυναμική δέσμευση μνήμηςδέσμευση μνήμης βασισμένη στο σωρό) είναι η δέσμευση μνήμης για χρήση από ένα πρόγραμμα κατά τη διάρκεια του χρόνου εκτέλεσής του. Μπορεί επίσης να θεωρηθεί σαν ένας τρόπος να διανεμηθεί η ιδιοκτησία των περιορισμένων πόρων της μνήμης ανάμεσα σε πολλά τμήματα των δεδομένων και του κώδικα.

Η δυναμικά δεσμευμένη μνήμη υπάρχει μέχρι να απελευθερωθεί είτε ρητά από τον ίδιο τον προγραμματιστή, είτε από τον συλλέκτη απορριμμάτων. Αυτό έρχεται σε αντίθεση με τη στατική δέσμευση μνήμης, η οποία έχει συγκεκριμένη διάρκεια. Ένα αντικείμενο που αποθηκεύεται σε δυναμικά δεσμευμένο χώρο λέγεται ότι έχει δυναμικό χρόνο ζωής.

ΛεπτομέρειεςΕπεξεργασία

Η διεκπεραίωση μιας αίτησης για δέσμευση μνήμης γίνεται με την εύρεση μιας ενότητας μνήμης που δε χρησιμοποιείται και έχει το απαραίτητο μέγεθος.

  • Προβλήματα κατά την προσπάθεια επιτυχούς χειρισμού της αίτησης δέσμευσης
    • Εσωτερικός και εξωτερικός κατακερματισμός.
    • Οι μεταπληροφορίες του κώδικα που κάνει τη δέσμευση μπορεί να αυξάνουν το μέγεθος μικρών (ατομικά) δεσμέυσεων.
      • Η τεχνική Chunking προσπαθεί να ελαττώσει αυτό το φαινόμενο.

Συνήθως, η μνήμη δεσμεύεται από ένα μεγάλο τμήμα αχρησιμοποίητης μνήμης που ονομάζεται ο σωρός (the heap) ή ελεύθερος χώρος(free store). Επειδή η ακριβής θέση της δεσμευμένης μνήμης δεν είναι γνωστή εκ των προτέρων, η μνήμη προσπελαύνεται έμμεσα, συνήθως μέσω μιας αναφοράς δείκτη. Ο ακριβής αλγόριθμος που χρησιμοποιείται για να οργανώνεται ο χώρος της μνήμης και να δεσμεύονται και να αποδεσμεύονται τμήματα αυτής είναι συνήθως δε φαίνεται και η υλοποίησή του μπορεί να γίνεται με οποιαδήποτε από τις παρακάτω μεθόδους.

ΑπόδοσηΕπεξεργασία

Ο αλγόριθμος δυναμικής δέσμευσης μνήμης που χρησιμοποιείται μπορεί να επηρεάσει σημαντικά την απόδοση του κώδικα και μια μελέτη που έγινε το 1994 από τη Digital Equipment Corporation δείχνει την υπολογιστική επιβάρυνση που συνδέεται με κάθε κώδικα που αναλαμβάνει τη δέσμευση. Το ελάχιστο μήκος μονοπατιού εντολών που χρειάστηκε για να δεσμευτεί ένας μοναδικός χώρος μνήμης ήταν 52 (όπως μετρήθηκε από έναν profiler για μια ποικιλία λογισμικού)[1].

ΥλοποιήσειςΕπεξεργασία

Δέσμευση τμημάτων σταθερού μεγέθουςΕπεξεργασία

Η δέσμευση τμημάτων σταθερού μεγέθους, γνωστή και σαν δέσμευση χώρου μνήμης (memory pool allocation), χρησιμοποιεί μια ελεύθερη λίστα από τμήματα μνήμης σταθερού μεγέθους (συχνά όλα είναι του ίδιου μεγέθους). Αυτό δουλεύει καλά για ενσωματωμένα συστήματα.

Buddy blocksΕπεξεργασία

Σε αυτό το σύστημα, η μνήμη δεσμεύεται από ένα μεγάλο τμήμα στη μνήμη που το μέγεθός του είναι δύναμη του 2. Αν το τμήμα είναι μεγαλύτερο από το διπλάσιο αυτού που ζητείται, χωρίζεται στα δύο, επιλέγεται το ένα μισό και η διαδικασία επαναλαμβάνεται (ελέγχοντας πάλι το μέγεθος και χωρίζοντάς το στα δύο αν χρειάζεται) μέχρι το τμήμα να είναι αρκετά μεγάλο.

Όλα τα τμήματα ενός συγκεκριμένου μεγέθους κρατούνται σε μια ταξινομημένη συνδεδεμένη λίστα ή δέντρο. Όταν απελευθερώνεται ένα τμήμα, συγκρίνεται με το διπλανό του. Αν και τα δύο είναι ελεύθερα, συνδυάζονται και τοποθετούνται στη λίστα των αμέσως πιο μεγάλων τμημάτων. (Όταν δεσμεύεται ένα τμήμα, ο κώδικας που κάνει τη δέσμευση θα αρχίσει με το πιο μικρό τμήμα που μπορεί να χρειαστεί, για να μη χρειαστεί να τεμαχιστούν ενότητες).

Κατηγορίες μνήμης του προγράμματοςΕπεξεργασία

Το πρόγραμμα μπορεί να χρησιμοποιεί διάφορα τμήματα στη μνήμη, όπως για παράδειγμα:

  • μνήμη όπου αποθηκεύεται ο κώδικας του προγράμματος
  • μνήμη όπου αποθηκεύονται οι μεταβλητές που δεσμεύονται με στατική (καθολικές) ή αυτόματη (τοπικές) διαχείριση μνήμης (στη δεύτερη περίπτωση συχνά η μνήμη ονομάζεται στοίβα ή stack)
  • μνήμη όπου αποθηκεύονται οι μεταβλητές που δεσμεύονται με δυναμική διαχείριση μνήμης (σωρός, heap)

Δείτε επίσηςΕπεξεργασία

Εξωτερικοί σύνδεσμοιΕπεξεργασία

Περαιτέρω διάβασμαΕπεξεργασία

ΠαραπομπέςΕπεξεργασία

  1. «Αρχειοθετημένο αντίγραφο» (PDF). Αρχειοθετήθηκε από το πρωτότυπο (PDF) στις 6 Φεβρουαρίου 2009. Ανακτήθηκε στις 16 Ιουλίου 2010. 
Στο λήμμα αυτό έχει ενσωματωθεί κείμενο από το λήμμα Dynamic memory allocation της Αγγλικής Βικιπαίδειας, η οποία διανέμεται υπό την GNU FDL και την CC-BY-SA 3.0. (ιστορικό/συντάκτες).