Στοίβα και Συσσωρευτής

Alopix | Αλώπηξ
3 min readSep 13, 2023

--

Τι είναι και πώς χρησιμοποιούνται;

Photo by Jason Leung on Unsplash

Στοίβα

Ορισμός: Στοίβα ονομάζεται μία δομή δεδομένων της οποίας το σύνολο των στοιχείων είναι διατεταγμένα με τέτοιο τρόπο ώστε τα στοιχεία που εισέρχονται τελευταία να εξέρχονται πρώτα. Η τεχνική αυτή είναι γνωστή ως LIFO(Last In First Out). Μπορούμε να σκεφτούμε μία στοίβα ως ένα σύνολο διατεταγμένων αντικειμένων σε κατακόρυφη διάταξη, σαν τη στοίβα από άπλυτα στην καρέκλα του γραφείου σας ή τα πιάτα στο νεροχύτη σας.

Η στοίβα έχει δύο κύριες λειτουργίες, την ώθηση και την απώθηση.

  • Ώθηση(push): Με τη διαδικασία της ώθησης τοποθετούμε ένα στοιχείο στην κορυφή της στοίβας. Όταν ωθούμε ένα στοιχείο πρέπει να προσέχουμε αν η στοίβα είναι γεμάτη. Σε αυτή την περίπτωση, αν ωθήσουμε δηλαδή ένα στοιχείο σε μία γεμάτη στοίβα, συμβαίνει υπερχείλιση(overflow) (όπως στο νεροχύτη σας).
  • Απώθηση(pop): Με τη διαδικασία της απώθησης αφαιρούμε το τελευταίο στοιχείο που τοποθετήθηκε στη στοίβα. Με άλλα λόγια το πάνω-πάνω. Όταν όμως η στοίβα έχει αδειάσει, τότε πρέπει να προσέξουμε την απώθηση καθώς μπορεί να προκλειθεί υποχείλιση(underflow). Αυτό φυσικά δεν πρέπει να σας αγχώνει για τον νεροχύτη σας διότι σπάνια καθαρίζετε.

Δείκτης top: Για να γνωρίζουμε κάθε φορά σε ποιο σημείο της στοίβας βρισκόμαστε χρησιμοποιούμε έναν δείκτη top. Σκεφτείτε τον δείκτη top σαν ένα βέλος που σημαδεύει κάθε φορά το τελευταίο στοιχείο που τοποθετήσαμε στη στοίβα. Στην πραγματικότητα ο δείκτης top είναι ένα pointer που κρατάει αποθηκευμένη την διεύθυνση του τελευταίου στοιχείου που αντιστοιχεί στη μνήμη.

Συσσωρευτής

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

Ας υποθέσουμε ότι θέλουμε να εκτελέσουμε την πράξη της πρόσθεσης με 3 αριθμούς. Έστω 3+5+1.
Με τη χρήση καταχωρητών αυτό θα γινόταν με την φόρτωση κάθε αριθμόυ σε έναν καταχωρητή και σε έναν επιπλέον για την αποθήκευση του αποτελέσματος. Φυσικά αυτός είναι ο πιο απλός τρόπος και θα μπορούσε να γίνει αποδοτικότερα για εξοικονόμιση καταχωρητών.
Με τον συσσωρευτή όμως αρκεί να φορτώσουμε την πρώτη τιμή και σε αυτή να προσθέτουμε τον κάθε αριθμό. Δηλαδή, αρχικά ο συσσωρευτής θα είχε την τιμή 3, έπειτα την τιμή 8(3 που υπάρχει ήδη +5) και τέλος 9(8+1).
Αυτή η διαδικασία είναι πολύ πιο γρήγορη καθώς γλτώνουμε τον χρόνο ανάκτησης των τιμών από τη μνήμη.

Αυτό δεν σημαίνει ότι οι σύγχρονοι επεξεργαστές που δεν έχουν συσσωρευτή στερούνται αυτής της “πατέντας”. Αντιθέτως, μπορούμε υπό μία έννοια να πούμε ότι οι σύγχρονοι επεξεργαστές έχουν πολλαπλούς εικονικούς συσσωρευτές.

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

--

--

Alopix | Αλώπηξ

Informatics and Telecommunications | Research Assistant | Tech and Space Enthusiast