Η διαχείριση της μνήμης που έχει εκχωρηθεί σε ένα πρόγραμμα αποτελεί μια σοβαρή
επιβάρυνση για τον προγραμματιστή, όταν αυτή γίνεται χειροκίνητα. Σε αυτήν την περίπτωση
ο ίδιος ο προγραμματιστής είναι υπεύθυνος για την παρακολούθηση του χρόνου ζωής των
αντικειμένων, των οποίων τη μνήμη πρέπει να αποδεσμεύει όταν αυτά δεν χρειάζονται πια.
Αυτό έχει ως αποτέλεσμα ο κώδικας που απαιτείται για την δουλειά αυτή να δυσκολεύει την
υλοποίηση, την συντήρηση, ακόμα και τη σχεδίαση των προγραμμάτων, ενώ συχνά μπορεί
να οδηγήσει σε σφάλματα, όπως αιωρούμενες αναφορές και διαρροές μνήμης. Μια λύση στο
πρόβλημα αυτό έρχεται να δώσει η συλλογή σκουπιδιών, η οποία απαλλάσσει τον προγραμματιστή
από το καθήκον να παρακολουθεί αυτός τα αντικείμενα και να τα αποδεσμεύει όταν δεν
είναι πια χρήσιμα (σκουπίδια). Η διαδικασία αυτή πραγματοποιείται κατά την ώρα εκτέλεσής
ενός προγράμματος από το ίδιο το πρόγραμμα, το οποίο φέρει κώδικα που διαπιστώνει πότε ένα
αντικείμενο δεν είναι χρήσιμο και ανάλογα φροντίζει να αποδεσμεύσει αυτόματα την μνήμη που
έχει εκχωρηθεί σε αυτό. Η συλλογή σκουπιδιών χρησιμοποιείται ευρέως στις συναρτησιακές
γλώσσες προγραμματισμού, καθώς σε αυτές τις γλώσσες είναι δύσκολη η ρητή αποδέσμευσή
μνήμης.
Σκοπός της εργασίας αυτής είναι η συγκριτική μελέτη διάφορων αλγορίθμων συλλογής
σκουπιδιών, κατάλληλων για χρήση σε ένα σύστημα μεταγλώττισης πιστοποιημένων εκτελέσιμων
(certified binaries). Γίνεται εκτενής παρουσίαση των αλγορίθμων και αναφορά στα
πλεονεκτήματα και μειονεκτήματα του καθενός. Οι αλγόριθμοι που αναφέρονται υλοποιήθηκαν
σε C για το NFlint, ένα σύστημα μεταγλώττισης πιστοποιημένων εκτελέσιμων που έχει
υλοποιηθεί στο Εργαστήριο Τεχνολογίας Λογισμικού του ΕΜΠ.
Manual management of the memory allocated to a program can be a strenuous task for
the programmer. In this case, the programmer is responsible for determining the lifetime
of all objects, whose memory must be explicitly deallocated when they will not be needed
any more. This complicates the design, implementation and maintenance of programs and
potentially leads to certain types of bugs such as dangling pointers and memory leaks. An
attractive solution to this problem is garbage collection, which frees the programmer from
the task of manually examining the liveness of objects and freeing them when they are
not going to be used any more. Garbage collection does that automatically at runtime.
The program carries code that is able to determine if an object is useless (garbage) or not,
and accordingly deallocate the memory used by it. Garbage collection is widely used in
functional programming languages, for which manual memory deallocation is in general
difficult.
The purpose of this diploma dissertation is the comparative study of several garbage
collection algorithms, appropriate for use in a system for compiling certified binaries. We
thoroughly present the algorithms and refer to the advantages and disadvantages of each
one. The algorithms under study have been implemented in C for NFlint, a system for
compiling certified binaries that has been developed at the Software Engineering Laboratory
of NTUA.