Οι CPU είναι απίστευτα πολύπλοκα θηρία. Υπάρχει ένας τεράστιος αριθμός εξαρτημάτων διασύνδεσης που όλα πρέπει να λειτουργούν τέλεια για να επιτύχουν τα επίπεδα απόδοσης που βλέπουμε. Η απόδοση της μνήμης είναι βασικός παράγοντας στην απόδοση των σύγχρονων CPU, ειδικά ως περιοριστικός παράγοντας.
Γιατί είναι τόσο σημαντική η ταχύτητα μνήμης;
Οι CPU είναι απίστευτα γρήγοροι, με τις τελευταίες γενιές να τρέχουν στα 5,7 GHz όταν ψύχονται επαρκώς. Αυτό τους επιτρέπει να ολοκληρώνουν 5,7 δισεκατομμύρια λειτουργίες κάθε δευτερόλεπτο. Πολλές από αυτές τις λειτουργίες εκτελούν μια ενέργεια σε κάποιο τύπο δεδομένων που πρέπει να αποθηκευτούν στη μνήμη.
Η κύρια μνήμη συστήματος, γνωστή ως RAM, είναι επίσης πολύ γρήγορη. Δυστυχώς, είναι πολύ γρήγορο σε σύγκριση με οτιδήποτε άλλο εκτός από την CPU. Η απόλυτη καθυστέρηση στη σύγχρονη μνήμη RAM υψηλής τεχνολογίας είναι της τάξης των 60 νανοδευτερόλεπτων. Δυστυχώς, αυτό μεταφράζεται σε περίπου 342 κύκλους CPU. Για να επιταχυνθεί η πρόσβαση στη μνήμη, χρησιμοποιείται μια κρυφή μνήμη CPU που αποθηκεύει δυναμικά δεδομένα. Αυτή η κρυφή μνήμη βρίσκεται στην ίδια τη μονάδα CPU και χρησιμοποιεί κελιά SRAM αντί για κελιά DRAM, καθιστώντας την πολύ πιο γρήγορη. Δυστυχώς, η κρυφή μνήμη της CPU είναι επίσης πολύ μικρότερη από τη μνήμη RAM του συστήματος, γενικά δεν φτάνει ούτε τα 100 MB. Ωστόσο, παρά το μικρότερο μέγεθός του, το κλιμακωτό σύστημα κρυφής μνήμης CPU αυξάνει μαζικά την απόδοση του συστήματος.
Εδώ έρχεται η εικονική μνήμη για να ανακατέψει τα πάντα
Οι σύγχρονοι υπολογιστές χρησιμοποιούν ένα σύστημα που ονομάζεται εικονική μνήμη. Αντί να εκχωρούνται διευθύνσεις φυσικής μνήμης σε διεργασίες, χρησιμοποιούνται διευθύνσεις εικονικής μνήμης. Κάθε διεργασία έχει το δικό της χώρο διευθύνσεων εικονικής μνήμης. Αυτό έχει δύο οφέλη. Πρώτον, παρέχει εύκολο διαχωρισμό μεταξύ της μνήμης που ανήκει σε μια διαδικασία και της μνήμης που ανήκει σε μια άλλη. Αυτό βοηθά στην αποφυγή επιθέσεων όπου κακόβουλο λογισμικό διαβάζει δεδομένα από τη μνήμη άλλου λογισμικού, πιθανώς να έχει πρόσβαση σε ευαίσθητες πληροφορίες. Κρύβει επίσης τη δομή της φυσικής μνήμης από τη διαδικασία. Αυτό επιτρέπει στην CPU να μετακινεί σπάνια χρησιμοποιούμενα bit μνήμης σε ένα αρχείο σελιδοποίησης στο χώρο αποθήκευσης, χωρίς απαραίτητα να το αποσυναρμολογεί από την εικονική μνήμη RAM. Αυτό επιτρέπει στον υπολογιστή να διαχειρίζεται απαλά σενάρια όπου απαιτείται περισσότερη μνήμη RAM από αυτή που υπάρχει φυσικά. Χωρίς εικονική μνήμη,
Δυστυχώς, εάν χρησιμοποιείτε διευθύνσεις εικονικής μνήμης, ο υπολογιστής πρέπει πραγματικά να μεταφράσει αυτές τις διευθύνσεις εικονικής μνήμης σε διευθύνσεις φυσικής μνήμης για να διαβάσει τα δεδομένα. Αυτό απαιτεί έναν πίνακα για την αποθήκευση όλων των μεταφράσεων των διευθύνσεων εικονικής μνήμης σε διευθύνσεις φυσικής μνήμης. Το μέγεθος αυτού εξαρτάται άμεσα από την ποσότητα μνήμης RAM που χρησιμοποιείται. Είναι γενικά αρκετά μικρό, τουλάχιστον σε σύγκριση με τη χωρητικότητα της μνήμης RAM του συστήματος. Δυστυχώς, εάν αποθηκεύετε τη μετάφραση μεταξύ εικονικών διευθύνσεων και φυσικών διευθύνσεων στη μνήμη RAM, πρέπει να κάνετε δύο αιτήματα στη RAM για κάθε αίτημα στη μνήμη RAM. Ένα για να βρει τη φυσική διεύθυνση που θέλετε να ζητήσετε και μετά ένα άλλο για να αποκτήσετε πραγματικά πρόσβαση σε αυτήν την τοποθεσία.
Εισαγάγετε το μεταφραστικό lookaside buffer
Η λύση σε αυτό το πρόβλημα είναι να αποθηκεύσετε τον πίνακα μετάφρασης κάπου πιο γρήγορα. Η κρυφή μνήμη της CPU θα ταίριαζε καλά στο λογαριασμό, τουλάχιστον από την άποψη της ταχύτητας. Το πρόβλημα με αυτό, ωστόσο, είναι ότι η κρυφή μνήμη της CPU είναι μικρή και χρησιμοποιείται ήδη σε μεγάλο βαθμό. Όχι μόνο ο πίνακας δεν χωράει στην κρυφή μνήμη, αλλά κάτι τέτοιο θα διαταράξει τη χρήση του που ήδη καθορίζει την απόδοση.
Φυσικά, εάν η αρχή της κρυφής μνήμης λειτουργεί ήδη για την πρόσβαση στη μνήμη, γιατί να μην την επαναλάβετε για τον πίνακα μετάφρασης; Και αυτό ακριβώς είναι το Translation Lookaside Buffer, ή TLB. Είναι μια κρυφή μνήμη υψηλής ταχύτητας για πρόσφατες μεταφράσεις διευθύνσεων. Δεν είναι αρκετά μεγάλο για να αποθηκεύσει ολόκληρο το τραπέζι, αλλά το μικρό του μέγεθος σημαίνει ότι μπορεί να ανταποκριθεί πολύ γρήγορα, μέσα σε έναν μόνο κύκλο ρολογιού.
Οποιοδήποτε αίτημα μνήμης περνά μέσω του TLB. Εάν υπάρχει επιτυχία TLB, μπορεί να παρέχει τη διεύθυνση φυσικής μνήμης για το πραγματικό αίτημα, προσθέτοντας συνήθως έναν μεμονωμένο κύκλο καθυστέρησης. Εάν υπάρχει σφάλμα TLB, η αναζήτηση πρέπει να πραγματοποιηθεί από την κύρια μνήμη. Υπάρχει μια μικρή ποινή απόδοσης σε μια απώλεια TLB περίπου 5 κύκλων, μια απώλεια που υπερκαλύπτεται από τον λανθάνοντα χρόνο πρόσβασης στη μνήμη. Μόλις ανακτηθεί η μετάφραση της διεύθυνσης από τη μνήμη RAM του συστήματος, ωθείται στο TLB και στη συνέχεια το αίτημα επαναλαμβάνεται με ένα άμεσο χτύπημα TLB.
Σημείωση: Υπάρχουν διαφορετικά σχήματα για την έξωση TLB. Μερικοί μπορεί να χρησιμοποιήσουν ένα σχήμα First In, First Out ή FIFO. Άλλοι μπορεί να χρησιμοποιήσουν ένα σχήμα Λιγότερο συχνά χρησιμοποιούμενο ή LFU.
Στη σπάνια περίπτωση που δεν υπάρχει καταχώρηση στον πίνακα μετάφρασης διευθύνσεων, προκαλείται σφάλμα σελίδας, καθώς τα ζητούμενα δεδομένα δεν βρίσκονται στη μνήμη RAM. Το λειτουργικό σύστημα πρέπει στη συνέχεια να χειριστεί το σφάλμα και να μεταφέρει τα δεδομένα από την αποθήκευση στη μνήμη RAM προτού συνεχιστεί το αίτημα.
συμπέρασμα
Το Translation Lookaside Buffer, ή TLB, είναι μια κρυφή μνήμη CPU υψηλής ταχύτητας αφιερωμένη στην προσωρινή αποθήκευση πρόσφατων μεταφράσεων διευθύνσεων από το αρχείο σελίδας στη μνήμη RAM του συστήματος. Αυτό είναι απαραίτητο καθώς τα συστήματα εικονικής μνήμης, όπως εφαρμόζονται σε όλους τους σύγχρονους υπολογιστές, θα απαιτούσαν δύο αιτήματα στη RAM για κάθε αίτημα στη RAM. Ένα για τη μετάφραση της διεύθυνσης εικονικής μνήμης σε μια διεύθυνση φυσικής μνήμης και ένα άλλο για την πραγματική πρόσβαση στη φυσική διεύθυνση. Με την προσωρινή αποθήκευση πρόσφατων μεταφράσεων, η καθυστέρηση της μνήμης μπορεί να μειωθεί σημαντικά για επισκέψεις TLB.
Πρέπει να ληφθεί μέριμνα για να διασφαλιστεί ότι οι αποθηκευμένες μεταφράσεις είναι σχετικές με την τρέχουσα ενεργή διαδικασία. Καθώς κάθε διεργασία έχει διαφορετικό χώρο εικονικών διευθύνσεων, δεν μπορούν να επαναχρησιμοποιηθούν. Ο μη αυστηρός περιορισμός ήταν η αιτία πίσω από την ευπάθεια Meltdown.