Πόσα διευθύνσεις μνήμης μπορεί να κρατήσει η μνήμη RAM στον υπολογιστή μου;
Κάποια μέρα είναι διασκεδαστικό να δούμε το επίπεδο επιφάνειας της εμπειρίας υπολογιστών, και άλλες μέρες είναι διασκεδαστικό να βυθίζουμε δεξιά στην εσωτερική λειτουργία. Σήμερα ρίχνουμε μια ματιά στη δομή της μνήμης του υπολογιστή και πόσα πράγματα μπορείτε να συσκευάσετε σε ένα ραβδί μνήμης RAM.
Η σημερινή συνάντηση ερωτήσεων και απαντήσεων έρχεται σε επαφή με το SuperUser - μια υποδιαίρεση του Stack Exchange, μια κοινότητα που κατευθύνεται από τους ιστότοπους ερωτήσεων & απαντήσεων.
Το ερώτημα
Ο αναγνώστης SuperUser Johan Smohan ασχολείται με τον τρόπο με τον οποίο ο τύπος επεξεργαστή και το μέγεθος της μνήμης συνεργάζονται για να δώσουν ένα συνολικό αριθμό διευθύνσεων. Αυτός γράφει:
Πόσες διευθύνσεις μνήμης μπορούμε να λάβουμε με επεξεργαστή 32-bit και 1GB ram και πόσοι με επεξεργαστή 64-bit?
Νομίζω ότι είναι κάτι τέτοιο:
1GB του κριού διαιρείται είτε με 32 bits 4 bits (?) Για να πάρει τον αριθμό διευθύνσεων μνήμης?
Διάβασα στη Wikipedia ότι 1 διευθύνσεις μνήμης είναι 32 bit wide ή 4 octets (1 octet = 8 bits), σε σύγκριση με έναν επεξεργαστή 64 bit όπου 1 διεύθυνση μνήμης ή 1 ακέραιος είναι 64 bits πλάτος ή 8 οκτάδες. Αλλά δεν ξέρω αν το κατάλαβα σωστά.
Αυτά είναι τα είδη των ερωτήσεων που μπορούν να κρατήσουν έναν περίεργο geek επάνω τη νύχτα. Πόσες διευθύνσεις είναι διαθέσιμες κάτω από κάθε υποθετικό σύστημα του Johan?
Η απάντηση
Ο συνδρομητής του SuperUser Gronostaj προσφέρει κάποια εικόνα για το πώς διαιρείται και χρησιμοποιείται η μνήμη RAM:
Σύντομη απάντηση: Ο αριθμός των διαθέσιμων διευθύνσεων είναι ίσος με τους μικρότερους από αυτούς:
- Μέγεθος μνήμης σε byte
- Μεγαλύτερο μη υπογεγραμμένο ακέραιο αριθμό που μπορεί να αποθηκευτεί στη λέξη μηχανής της CPU
Μεγάλη απάντηση και εξήγηση των παραπάνω:
Η μνήμη αποτελείται από bytes (B). Κάθε byte αποτελείται από 8 bits (b).
1 Β = 8 β
1 GB μνήμης RAM είναι στην πραγματικότητα 1 GiB (gibibyte, όχι gigabyte). Η διαφορά είναι:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B
Κάθε byte της μνήμης έχει τη δική της διεύθυνση, ανεξάρτητα από το πόσο μεγάλη είναι η λέξη μηχανής CPU. Π.χ. Ο επεξεργαστής Intel 8086 ήταν 16-bit και αφορούσε μνήμη από bytes, έτσι και οι σύγχρονες CPU 32 bit και 64 bit. Αυτή είναι η αιτία του πρώτου ορίου - δεν μπορείτε να έχετε περισσότερες διευθύνσεις από τα byte μνήμης.
Η διεύθυνση μνήμης είναι απλώς μια σειρά από bytes που η CPU πρέπει να παρακάμψει από την αρχή της μνήμης για να φτάσει σε εκείνη που ψάχνει.
- Για να αποκτήσετε πρόσβαση στο πρώτο byte, πρέπει να παραλείψετε 0 bytes, οπότε η διεύθυνση του πρώτου byte είναι 0.
- Για να αποκτήσετε πρόσβαση στο δεύτερο byte, πρέπει να παραλείψετε ένα byte, οπότε η διεύθυνσή του είναι 1.
- (και ούτω καθεξής… )
- Για να αποκτήσετε πρόσβαση στο τελευταίο byte, η CPU παραλείπει τα 1073741823 bytes, οπότε η διεύθυνσή του είναι 1073741823.
Τώρα πρέπει να ξέρετε τι σημαίνει 32-bit σημαίνει πραγματικά. Όπως ανέφερα προηγουμένως, είναι το μέγεθος μιας λέξης μηχανής.
Η λέξη μηχανής είναι η ποσότητα μνήμης που χρησιμοποιεί η CPU για τη διατήρηση αριθμών (σε μνήμη RAM, μνήμη cache ή εσωτερικούς καταχωρητές). Η CPU 32-bit χρησιμοποιεί 32 bits (4 bytes) για να κρατάει αριθμούς. Οι διευθύνσεις μνήμης είναι επίσης αριθμοί, έτσι σε μια CPU 32 bit η διεύθυνση μνήμης αποτελείται από 32 bits.
Τώρα σκεφτείτε: εάν έχετε ένα bit, μπορείτε να αποθηκεύσετε δύο τιμές σε αυτό: 0 ή 1. Προσθέστε ένα ακόμη bit και έχετε τέσσερις τιμές: 0, 1, 2, 3. Σε τρία bits, μπορείτε να αποθηκεύσετε οκτώ τιμές : 0, 1, 2 ... 6, 7. Αυτό είναι στην πραγματικότητα ένα δυαδικό σύστημα και λειτουργεί έτσι:
Δυαδικό δεκαδικό 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111
Λειτουργεί ακριβώς όπως συνήθως, αλλά το μέγιστο ψηφίο είναι 1, όχι 9. Το δεκαδικό 0 είναι
0000
, τότε προσθέτετε 1 και πάρετε0001
, προσθέστε ένα και πάλι και έχετε0010
. Αυτό που συνέβη εδώ είναι σαν να έχουμε δεκαδικό09
και προσθέτοντας ένα: αλλάζετε 9 με 0 και αυξάνετε το επόμενο ψηφίο.Από το παραπάνω παράδειγμα μπορείτε να δείτε ότι υπάρχει πάντα μια μέγιστη τιμή που μπορείτε να διατηρήσετε σε έναν αριθμό με σταθερό αριθμό bits - επειδή όταν όλα τα bits είναι 1 και προσπαθείτε να αυξήσετε την τιμή κατά 1, όλα τα bits θα γίνουν 0, αριθμός. Ονομάζεται υπερχείλιση ακέραιων αριθμών και προκαλεί πολλά δυσάρεστα προβλήματα, τόσο για τους χρήστες όσο και για τους προγραμματιστές.
11111111 = 255 + 1 ----------- 100000000 = 0 (9 κομμάτια εδώ, έτσι 1 είναι κομμένα)
- Για 1 bit η μεγαλύτερη τιμή είναι 1,
- 2 bits - 3,
- 3 bits - 7,
- 4 bits - 15
Ο μεγαλύτερος δυνατός αριθμός είναι πάντα 2 ^ N-1, όπου N είναι ο αριθμός των δυαδικών ψηφίων. Όπως είπα προηγουμένως, μια διεύθυνση μνήμης είναι ένας αριθμός και έχει επίσης μέγιστη αξία. Αυτός είναι ο λόγος για τον οποίο το μέγεθος της μηχανής λέξης είναι επίσης ένα όριο για τον αριθμό των διαθέσιμων διευθύνσεων μνήμης - μερικές φορές ο επεξεργαστής σας δεν μπορεί να επεξεργαστεί αριθμούς αρκετά μεγάλοι για να αντιμετωπίσει περισσότερη μνήμη.
Έτσι στα 32 bit μπορείτε να κρατήσετε αριθμούς από 0 έως 2 ^ 32-1, και αυτό είναι 4 294 967 295. Είναι περισσότερο από τη μεγαλύτερη διεύθυνση σε 1 GB μνήμης RAM, οπότε στη συγκεκριμένη περίπτωση η ποσότητα μνήμης RAM θα είναι ο περιοριστικός παράγοντας.
Το όριο RAM για CPU 32 bit είναι θεωρητικά 4 GB (2 ^ 32) και για CPU 64 bit είναι 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Με άλλα λόγια, ο επεξεργαστής 64-bit μπορεί να απευθυνθεί σε ολόκληρο το Διαδίκτυο ... 200 φορές) (εκτιμάται από το WolframAlpha).
Ωστόσο, στα λειτουργικά συστήματα πραγματικού βίου, οι 32-bit CPU μπορούν να αντιμετωπίσουν περίπου 3 GiB μνήμης RAM. Αυτό οφείλεται στην εσωτερική αρχιτεκτονική του λειτουργικού συστήματος - ορισμένες διευθύνσεις προορίζονται για άλλους σκοπούς. Μπορείτε να διαβάσετε περισσότερα για αυτό το λεγόμενο φράγμα 3 GB στη Wikipedia. Μπορείτε να αναιρέσετε αυτό το όριο με την επέκταση φυσικής διεύθυνσης.
Μιλώντας για την αντιμετώπιση της μνήμης, υπάρχουν λίγα πράγματα που πρέπει να αναφέρω: εικονική μνήμη, κατάτμηση και τηλεειδοποίησης.
Εικονική μνήμη
Όπως υπογράμμισε ο @Daniel R Hicks σε άλλη απάντηση, τα OSs χρησιμοποιούν εικονική μνήμη. Αυτό που σημαίνει είναι ότι οι εφαρμογές στην πραγματικότητα δεν λειτουργούν σε πραγματικές διευθύνσεις μνήμης, αλλά αυτές που παρέχονται από το λειτουργικό σύστημα.
Αυτή η τεχνική επιτρέπει στο λειτουργικό σύστημα να μεταφέρει ορισμένα δεδομένα από τη μνήμη RAM σε ένα λεγόμενο αρχείο Pagefile (Windows) ή Swap (* NIX). Ο σκληρός δίσκος είναι λίγο μικρότερος από τους RAM, αλλά δεν αποτελεί σοβαρό πρόβλημα για σπάνια δεδομένα και επιτρέπει στο λειτουργικό σύστημα να παρέχει περισσότερες εφαρμογές RAM από αυτές που έχετε εγκαταστήσει.
Ρύθμιση σελίδας
Αυτό που μιλούσαμε μέχρι στιγμής είναι το φαινόμενο flat addressing.
Η τηλεειδοποίηση είναι ένα εναλλακτικό πρόγραμμα διευθυνσιοδότησης που επιτρέπει την αντιμετώπιση περισσότερης μνήμης που θα μπορούσατε κανονικά με μια λέξη μηχανής σε επίπεδη μοντέλο.
Φανταστείτε ένα βιβλίο γεμάτο με λέξεις τεσσάρων γραμμάτων. Ας υποθέσουμε ότι υπάρχουν 1024 αριθμοί σε κάθε σελίδα. Για να απευθυνθείτε σε έναν αριθμό, πρέπει να γνωρίζετε δύο πράγματα:
- Ο αριθμός σελίδας στον οποίο εκτυπώνεται αυτή η λέξη.
- Ποια λέξη στη συγκεκριμένη σελίδα είναι αυτή που ψάχνετε.
Τώρα ακριβώς πώς οι σύγχρονες CPU x86 χειρίζονται τη μνήμη. Είναι χωρισμένο σε 4 KiB σελίδες (1024 λέξεις μηχανής το καθένα) και αυτές οι σελίδες έχουν αριθμούς. (στην πραγματικότητα οι σελίδες μπορούν επίσης να είναι 4 MiB μεγάλες ή 2 MiB με PAE). Όταν θέλετε να απευθυνθείτε στην κυψέλη μνήμης, χρειάζεστε τον αριθμό σελίδας και τη διεύθυνση στη σελίδα αυτή. Σημειώστε ότι κάθε κύτταρο μνήμης αναφέρεται με ακριβώς ένα ζευγάρι αριθμών, κάτι που δεν θα ισχύει στην περίπτωση τμηματοποίησης.
Κατάτμηση
Λοιπόν, αυτό είναι πολύ παρόμοιο με την τηλεειδοποίηση. Χρησιμοποιήθηκε στην Intel 8086, για να αναφέρουμε μόνο ένα παράδειγμα. Οι ομάδες διευθύνσεων καλούνται τώρα τμήματα μνήμης, όχι σελίδες. Η διαφορά είναι ότι τα τμήματα μπορούν να αλληλεπικαλύπτονται και αλληλεπικαλύπτονται πολύ. Για παράδειγμα στα 8086 τα περισσότερα κύτταρα μνήμης ήταν διαθέσιμα από 4096 διαφορετικά τμήματα.
Ενα παράδειγμα:
Ας υποθέσουμε ότι έχουμε 8 bytes μνήμης, όλα με μηδενικά, εκτός από το 4ο byte ίσο με 255.
Εικόνα μοντέλου επίπεδης μνήμης:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Εικονογράφηση σελίδας μνήμης με σελίδες 4 byte:
PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
Εικόνα για κατακερματισμένη μνήμη με τμήματα 4 byte μετατοπισμένα κατά 1:
SEG 0 _____ SEG 1 | 0 | _____ SEG 2 0 | | 0 | _____ SEG 3 | 0 | | 0 | | 0 | _____ SEG 4 | 255 | | 255 | | 255 | | 255 | _____ SEG 5 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 6 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 7 ----- | 0 | | 0 | | 0 | | 0 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- ----- ----- -----
Όπως μπορείτε να δείτε, το 4ο byte μπορεί να αντιμετωπιστεί με τέσσερις τρόπους: (διευθυνσιοδότηση από 0)
- Τμήμα 0, μετατόπιση 3
- Τμήμα 1, μετατόπιση 2
- Τμήμα 2, μετατόπιση 1
- Τμήμα 3, μετατόπιση 0
Είναι πάντα το ίδιο κύτταρο μνήμης.
Σε πραγματικές εφαρμογές τα τμήματα μετατοπίζονται κατά περισσότερο από 1 byte (για 8086 ήταν 16 bytes).
Αυτό που είναι κακό για την κατάτμηση είναι ότι είναι περίπλοκο (αλλά νομίζω ότι το ξέρετε ήδη αυτό). Τι είναι καλό, είναι ότι μπορείτε να χρησιμοποιήσετε κάποιες έξυπνες τεχνικές για τη δημιουργία αρθρωτών προγραμμάτων.
Για παράδειγμα, μπορείτε να φορτώσετε κάποια μονάδα σε ένα τμήμα και, στη συνέχεια, να υποθέσετε ότι το τμήμα είναι μικρότερο από ότι είναι πραγματικά (αρκεί να είναι αρκετά μικρό για να συγκρατήσει την ενότητα), τότε επιλέξτε το πρώτο τμήμα που δεν επικαλύπτεται με αυτό το ψευδο-μικρότερο και φορτώστε το επόμενο , και ούτω καθεξής. Βασικά, αυτό που παίρνετε με αυτόν τον τρόπο είναι σελίδες μεταβλητού μεγέθους.
Έχετε κάτι να προσθέσετε στην εξήγηση; Απενεργοποιήστε τα σχόλια. Θέλετε να διαβάσετε περισσότερες απαντήσεις από άλλους τεχνολογικούς χρήστες Stack Exchange; Δείτε το πλήρες νήμα συζήτησης εδώ.